nginx 解决session共享问题(jvm-route)方式
## 注释掉 <!--http address="*" port="8080"/-->## 查找????? <server id="" address="127.0.0.1" port="6800">## 替换成???? ? ?? <server id="a" address="192.168.6.121" port="6800"> ????<!-- server2 address=192.168.6.162 -->
??? <http id="" port="8080"/>
??? </server> ??? <server id="b" address="192.168.6.121" port="6801"> ?? ? <!-- server2 address=192.168.6.162 -->
??? <http id="" port="8081"/>
??? </server>
shell $> cd /usr/local/resin/webapps/ROOT/shell $>?mv index.jsp?? index.jsp.bakshell $> vim index.jsp## 填入以下内容?<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
%><html>
? <head>
??? </head>
????? <body>
??????? 121?????? <!--server2? 这里为 162 -->
??????? <br />
?????? <%out.print(request.getSession()) ;%>?????? <!--输出session-->
??????? <br />
??????? <%out.println(request.getHeader("Cookie")); %>
????? <!--输出Cookie-->?????? </body>
?</html>###重启? resin 服务######## server1 服务器#####shell $> /usr/local/resin/bin/httpd.sh -server a start###注意 如果没修改 环境变量会报错### server2 服务器 ####shell $> /usr/local/resin/bin/httpd.sh -server?b start### 注意的是? server2 服务器 只启动? server_id?b? ###?4.整合 ngxin? resin shell $> cd /usr/local/nginx/confshell $> mv nginx.conf nginx.bakshell $> vim nginx.conf## 以下是配置 ###?user? www www;worker_processes 4;error_log? logs/nginx_error.log? crit;pid??????? /usr/local/nginx/nginx.pid;#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;events
{
?use epoll;
?worker_connections 2048;
}http
{
? upstream backend {
??? server 192.168.6.121:8080 srun_id=a;? ??? ####??这里 srun_id=a???对应的是 server1 ?resin?配置里的 server id="a"
??? server 192.168.6.162:8081 srun_id=b;??? ####? 这里 srun_id=b?? 对应的是 server2 resin?配置里的 server id="b"??? jvm_route $cookie_JSESSIONID|sessionid;
? }
?include?????? mime.types;
?default_type? application/octet-stream;?#charset? gb2312;
?charset UTF-8;?server_names_hash_bucket_size 128;
?client_header_buffer_size 32k;
?large_client_header_buffers 4 32k;
?client_max_body_size 20m;
?limit_rate? 1024k;?sendfile on;
?tcp_nopush???? on;?keepalive_timeout 60;?tcp_nodelay on;?fastcgi_connect_timeout 300;
?fastcgi_send_timeout 300;
?fastcgi_read_timeout 300;
?fastcgi_buffer_size 64k;
?fastcgi_buffers 4 64k;
?fastcgi_busy_buffers_size 128k;
?fastcgi_temp_file_write_size 128k;?gzip on;
#gzip_min_length? 1k;
?gzip_buffers???? 4 16k;
?gzip_http_version 1.0;
?gzip_comp_level 2;?gzip_types?????? text/plain application/x-javascript text/css application/xml;
?gzip_vary on;?#limit_zone? crawler? $binary_remote_addr? 10m;server
?{
?? listen?????? 80;
?? server_name? 192.168.6.121;
?? index index.html index.htm index.jsp;
?? root? /var/www;
?? location ~ .*\.jsp$
?? {
???? proxy_pass? http://backend ;
???? proxy_redirect??? off;
???? proxy_set_header? X-Forwarded-For? $proxy_add_x_forwarded_for;
???? proxy_set_header? X-Real-IP? $remote_addr;
???? proxy_set_header? Host $http_host;
?? }?? location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
?? {
???? expires????? 30d;
?? }?? location ~ .*\.(js|css)?$
?? {
???? expires????? 1h;
?? }?? location /stu {
???? stub_status on;
???? access_log?? off;
?? }
? log_format? access? '$remote_addr - $remote_user [$time_local] "$request" '
???????????? '$status $body_bytes_sent "$http_referer" '
???????????? '"$http_user_agent" $http_x_forwarded_for';
#? access_log? off;
? }
}
?5.测试,打开浏览器,输入 http://192.168.6.121/index.jsp ?? session? 显示 aXXXXX? 访问的是? 121 服务器也就是? server1,因为是第一次访问所以Cookie 没有获得,刷新一下看他是否轮询会访问到 162 server2.
刷新 N 遍后仍然是 121,也就是补丁起作用了,cookie 值 也获得了,为了测试,我又打开了 “火狐浏览器”(因为session 和 cookie问题所以从新打开别的浏览器),输入网址:
显示的是 162 ,session 值 是以 bXXX 开头的,刷新 N遍后:
仍然是 162? server 2服务器!!大家测试的时候如果有疑问可一把 nginx 配置文件的 srun_id=a? srun_id=b 去掉,然后在访问,就会知道 页面是轮询访问得了!!?PS:最后 谢谢 Weibin Yao??指导 还有 Cluster服务技术群2? 的张涛大哥对 JSP 代码的帮助!!! ? 我上传的补丁清在 linux 系统上解压,因为 51cto 不支持 gz格式,所以我就改了一后缀名,在linux 系统上执行 shell $>? tar zxvf nginx-upstream-jvm-route-read-only.rar 就可以了! ?tomcat 的解决方法 README 上有: 1.For resin
upstream backend {
??? server 192.168.0.100 srun_id=a;
??? server 192.168.0.101 srun_id=b;
??? server 192.168.0.102 srun_id=c;
??? server 192.168.0.103 srun_id=d; ??? jvm_route $cookie_JSESSIONID|sessionid;
}
2.For tomcat
upstream backend {
??? server 192.168.0.100 srun_id=a;
??? server 192.168.0.101 srun_id=b;
??? server 192.168.0.102 srun_id=c;
??? server 192.168.0.103 srun_id=d; ??? jvm_route $cookie_JSESSIONID|sessionid reverse;
}
本文出自 “linuxer ” 博客,请务必保留此出处http://deidara.blog.51cto.com/400447/193887