Nginx+Tomcat à propos de la gestion des sessions

不言
Libérer: 2023-04-02 20:28:02
original
1314 Les gens l'ont consulté

Cet article présente principalement la gestion de session de Nginx+Tomcat, qui a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

Avant-propos

Nginx+Tomcat a toujours compris la gestion de sessions, mais ne l'a jamais pratiquée. Cet article part de l'installation et du démarrage les plus simples, et présente progressivement plusieurs façons de gérer les sessions à travers des exemples.

Configuration de l'installation de nginx

1. L'installation de nginx

[root@localhost ~]# yum install nginx
Copier après la connexion
génère l'erreur suivante :

No package nginx available.
Copier après la connexion
Installation de la solution epel : EPEL est l'abréviation de Enterprise Linux Add-on Package. EPEL est créé, maintenu et géré par le groupe d'intérêt spécial Fedora pour Red Hat Enterprise Linux (RHEL) et ses distributions dérivées (telles que CentOS, Scientific Linux, A high-. projet de package logiciel complémentaire de qualité pour Oracle Enterprise Linux);

[root@localhost ~]# yum install epel-release
Copier après la connexion
Après l'installation, vous pouvez installer nginx avec succès

2. Démarrez et arrêtez nginx

D'abord. entrez dans le répertoire nginx

[root@localhost nginx]# cd /usr/sbin/
Copier après la connexion
et exécutez la commande

./nginx 开启
./nginx -s stop  使用kill命令强制杀掉进程
./nginx -s quit  待nginx进程处理任务完毕进行停止
./nginx -s reload
Copier après la connexion

nginx+tomcat Load Balancing

1. Préparez respectivement 2 tomcats. Les ports spécifiés sont 8081, 8082

drwxr-xr-x. 9 root root      4096 May  7 14:16 apache-tomcat-7.0.88_8081
drwxr-xr-x. 9 root root      4096 May  7 14:16 apache-tomcat-7.0.88_8082
Copier après la connexion
Modifier le fichier index.jsp de webapps/ROOT pour faciliter les tests

<%
if(request.getSession().getAttribute("key")==null){
   out.println("key is null,ready init.....");   
   request.getSession().setAttribute("key","value");
}else{
   out.println("key is not null,key="+request.getSession().getAttribute("key"));  
}
%>
<br> 
sessionID:<%=session.getId()%>   
<br>   
sessionCreateTime:<%= session.getCreationTime() %>
<br>
<% 
out.println("tomcat port 8081");   
%>
Copier après la connexion
Le résultat final consiste à spécifier les numéros de port respectifs 8081 et 8081 sous les deux tomcats. 8082

Équilibrage de charge de configuration 2.nginx (politique par défaut)

Modifier nginx.conf sous /etc/nginx/

upstream tomcatTest {
     server 127.0.0.1:8081;   #tomcat-8081
     server 127.0.0.1:8082;   #tomcat-8082
}
 
server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;
 
    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
 
    location / {
        proxy_pass http://tomcatTest;
    }
 
    error_page 404 /404.html;
        location = /40x.html {
    }
 
    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}
Copier après la connexion
L'équilibrage de charge. politique configurée ici Il s'agit de la stratégie d'interrogation par défaut. nginx prend également en charge d'autres stratégies, notamment : ip_hash,weight, fair (tiers), url_hash (tiers)

La stratégie par défaut attribue chaque requête Web à différents serveurs backend un par un ; par ordre chronologique. , dans ce cas, une nouvelle session sera créée pour chaque requête Faisons un test simple :
La première requête est http://ip/

key is null,ready init..... 
sessionID:E7A9782DED29FF04E21DF94078CB4F62 
sessionCreateTime:1527732911441
tomcat port 8082
Copier après la connexion
La deuxième fois. il est actualisé est http:// ip/

key is null,ready init..... 
sessionID:7812E8E21DBB74CC7FBB75A0DFF2E9CB 
sessionCreateTime:1527732979810
tomcat port 8081
Copier après la connexion
Actualiser http://ip/

key is null,ready init..... 
sessionID:8895F41E299785A21995D5F8BB734B86 
sessionCreateTime:1527733011878
tomcat port 8082
Copier après la connexion
pour la troisième fois et vous pouvez constater qu'une nouvelle session est générée chaque temps, et les messages sont attribués à différents messages un par un dans l'ordre chronologique. Les serveurs back-end, généralement les sites Web qui doivent maintenir des sessions ne sont pas autorisés à générer une session pour chaque demande

Configuration 3.nginx ; équilibrage de charge (session collante)

Chaque requête Distribuée en fonction du résultat de hachage de l'adresse IP accédée, de sorte que chaque visiteur ait un accès fixe à un serveur back-end, ce qui peut résoudre le problème de session nginx peut réaliser une session collante ; Session en configurant ip_hash dans le module amont ;

upstream tomcatTest {
     ip_hash;
     server 127.0.0.1:8081;   #tomcat-8081
     server 127.0.0.1:8082;   #tomcat-8082
}
Copier après la connexion
Faites le test simple suivant :

Première requête http://ip/

key is null,ready init..... 
sessionID:859BADFB09A4ECEAEC5257F518C228A0 
sessionCreateTime:1527734181450
tomcat port 8081
Copier après la connexion
Deuxième actualisation http:// ip/

key is not null,key=value 
sessionID:859BADFB09A4ECEAEC5257F518C228A0 
sessionCreateTime:1527734181450
tomcat port 8081
Copier après la connexion
Copier après la connexion
Troisième actualisation http : //ip/

key is not null,key=value 
sessionID:859BADFB09A4ECEAEC5257F518C228A0 
sessionCreateTime:1527734181450
tomcat port 8081
Copier après la connexion
Copier après la connexion
On peut constater que key=value est défini dans la première requête et la valeur clé peut être obtenue à chaque fois par la suite. Le sessionId n'a pas changé, et Tomcat n'a pas changé non plus, obtenant une session collante

À ce moment, vous pouvez arrêter Tomcat avec port=8081, puis observer
La quatrième actualisation de http:/ /ip/

key is null,ready init..... 
sessionID:3C15FE2C8E8A9DCDC6EAD48180B78B80 
sessionCreateTime:1527735994476
tomcat port 8082
Copier après la connexion
Le cinquième rafraîchissement de http://ip/

key is not null,key=value 
sessionID:3C15FE2C8E8A9DCDC6EAD48180B78B80 
sessionCreateTime:1527735994476
tomcat port 8082
Copier après la connexion
Vous pouvez constater que le message est transmis à tomcat-8082 et que la session est perdue, et une nouvelle session est recréée ;

Comment éviter que la session ne soit perdue dans cette situation, il existe deux solutions : la réplication de session et le partage de session sont meilleurs en termes d'évolutivité et de performances. comment implémenter le partage de session ;

nginx+tomcat implémente le partage de session

Idée de partage de session Cela signifie enregistrer la session dans un lieu public, puis la retirer lorsqu'elle est utilisée . L'espace public spécifique peut être : redis, db, memcached, etc. Ce qui suit a redis comme exemple

1.configuration de l'installation de redis

yum install redis
Copier après la connexion
Une fois l'installation terminée, configurez le fichier /etc/redis.conf

Démarrez le serveur redis

redis-server /etc/redis.conf
Copier après la connexion
Démarrez le client

redis-cli
Copier après la connexion
2 Tomcat introduit les jars dépendants

$TOMCAT_HOME. /lib et ajoute le package jar suivant

<dependency>
    <groupId>com.bluejeans</groupId>
    <artifactId>tomcat-redis-session-manager</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.5.2</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.2</version>
</dependency>
Copier après la connexion
3. Tomcat modifie la configuration

Modifie context.xml dans le répertoire $TOMCAT_HOME/conf Fichier

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         host="localhost"
         port="6379"
         database="0"
         maxInactiveInterval="60"/>
Copier après la connexion
Tomcat fournit une gestion de session ouverte et une persistance org.apache.catalina.session.ManagerBase. Héritez de cette classe abstraite et effectuez quelques configurations simples pour activer la gestion de votre session. La classe prend en charge la lecture et la persistance de session de Tomcat. est utilisé ici pour gérer la session ;

RedisSessionManager hérite de la classe org.apache.catalina.session.ManagerBase, et les opérations associées sur la session sont toutes dans cette catégorie ; 🎜>
La première requête est http://ip/

La deuxième actualisation est http://ip/

key is null,ready init..... 
sessionID:1131499E5A65DE1591152465E7B24B1F 
sessionCreateTime:1527740273682
tomcat port 8081
Copier après la connexion
Arrêtez Tomcat-8081 et actualisez http://ip/

key is not null,key=value 
sessionID:1131499E5A65DE1591152465E7B24B1F 
sessionCreateTime:1527740273682
tomcat port 8081
Copier après la connexion
pour la troisième fois. Vous pouvez constater que le message a été transmis au nœud tomcat-8082, mais la session n'a pas changé et la clé peut également obtenir le value;

5. Vérifiez redis
key is not null,key=value 
sessionID:1131499E5A65DE1591152465E7B24B1F 
sessionCreateTime:1527740273682
tomcat port 8082
Copier après la connexion

et vous constaterez que l'objet de session a été stocké dans redis et que le sessionId est utilisé comme valeur clé pour stocker la session binaire. data;

Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de tout le monde. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !
[root@localhost ~]# redis-cli
127.0.0.1:6379> keys *
1) "1131499E5A65DE1591152465E7B24B1F"
127.0.0.1:6379> get 1131499E5A65DE1591152465E7B24B1F
"\xac\xed\x00\x05sr\x00Dcom.orangefunction.tomcat.redissessions.SessionSerializationMetadataB\xd9\xd9\xf7v\xa2\xdbL\x03\x00\x01[\x00\x15sessionAttributesHasht\x00\x02[Bxpw\x14\x00\x00\x00\x10}\xc8\xc9\xcf\xf6\xc3\xb5Y\xc7\x0c\x8eF\xa5\xfaQ\xe8xsr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01c\xb4j\x94\x12sq\x00~\x00\x03\x00\x00\x01c\xb4j\x94\x12sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexq\x00~\x00\x04\x00\x00\a\bsr\x00\x11java.lang.Boolean\xcd r\x80\xd5\x9c\xfa\xee\x02\x00\x01Z\x00\x05valuexp\x01q\x00~\x00\nsq\x00~\x00\x03\x00\x00\x01c\xb4j\x94*t\x00 1131499E5A65DE1591152465E7B24B1Fsq\x00~\x00\a\x00\x00\x00\x01t\x00\x03keyt\x00\x05valuew\b\x00\x00\x01c\xb4j\x94\x12"
Copier après la connexion

Recommandations associées :

nginx implémente le proxy inverse et l'équilibrage de charge

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal