這種方式不需要修改web工程只需要對nginx下載nginx_upstream_jvm_route插件,修改tomcat和nginx配置,就能解決session問題。由于這種方式不會把session存儲起來,所以當某tomcat節點掛掉之后就會造成用戶需要重新登錄的問題。
思路:是通過對nginx里面每個參與訪問的server都打上不同的標簽值,這個值和tomcat的jvmRoute值相同。根據tomcat的特性,當server.xml配置文件中加了jvmRoute值后,會給sessionid加上jvmRoute值的后綴,根據這一特性,nginx_upstream_jvm_route對每次訪問請求中的sessionId的值,自動匹配對應的server。這樣就會使得每次都訪問到同一個tomcat,這樣就解決了訪問不同tomcat節點,session發生變化的問題。但是這種方式就會有當一直訪問的tomcat節點掛掉之后,根據負載的原理,將會訪問其它節點,就會造成session發生變化,需重新登錄的問題。
具體的實現步驟:
第一步:下載并安裝nginx_upstream_jvm_route:
進入nginx目錄,并下載和安裝nginx_upstream_jvm_route,具體代碼如下:
~~~
shell $> patch -p0 < ../nginx-upstream-jvm-route-read-only/jvm_route.patch
shell $> useradd www
shell $> ./configure --user=www --group=www --prefix=/usr/local//nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/root/nginx-upstream-jvm-route-read-only
shell $> make
shell $> make install
~~~
第二步:配置nginx
進入nginx的conf目錄用vi命令打開nginx.conf文件,對該文件進行修改:
~~~
#Nginx所用用戶和組
#user niumd niumd;
#工作的子進程數量(通常等于CPU數量或者2倍于CPU)
worker_processes 2;
#錯誤日志存放路徑
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
#指定pid存放文件
pid logs/nginx.pid;
events {
#使用網絡IO模型linux建議epoll,FreeBSD建議采用kqueue
#use epoll;
#允許最大連接數
worker_connections 2048;
}
http {
include mime.types;
default_type application/octet-stream;
#定義日志格式
#log_format main '$remote_addr - $remote_user [$time_local] $request '
# '"$status" $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log off;
access_log logs/access.log;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#keepalive_timeout 75 20;
include gzip.conf;
upstream tomcat {
~~~
~~~
<span style="white-space:pre"> </span>#srun_id 值需與tomcat的jvmRoute的值對應
server 127.0.0.1:18080 srun_id=tomcat2;
server 127.0.0.1:18081 srun_id=tomcat1;
jvm_route $cookie_JSESSIONID|sessionid reverse;
}
server {
listen 8081;
server_name 127.0.0.1;
location / {
proxy_pass http://tomcat;
~~~
~~~
#這些配置很重要
proxy_redirect off ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_cookie_path / /;
proxy_set_header Cookie $http_cookie;
client_max_body_size 50m;
client_body_buffer_size 256k;
proxy_connect_timeout 30;
proxy_send_timeout 30;
proxy_read_timeout 60;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
}
}
}
~~~
第三:配置tomcat server.xml
打開tomcat的server.xml, 在兩臺服務器的tomcat的配置文件中分別找到: ?<Engine name="Catalina" defaultHost="localhost" > ?分別修改為:
~~~
Tomcat01:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
Tomcat02:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
~~~
第四:向tomcat1和tomcat2中部署相同的應用
第五:運行nginx、tomcat1、tomcat2
打開之后可以在瀏覽器里面輸入:http://127.0.0.1:8081進行測試。可以通過瀏覽器的調試模式看出sessionID是固定不變的,只有當停掉當前一直訪問的tomcat,sessionID才會發生變化