Nginx 反向代理 Tomcat 的 Session 问题

龅牙驴 发布于 2015/07/21 17:55
阅读 1K+
收藏 8
我在 tomcat 里部署了两个不同的项目 a 和 b,它们使用不同端口
比如 http://ip:8084 和 http://ip:8085

server.xml 部分配置如下:

<Service name="a">
    <Connector port="8084" protocol="HTTP/1.1"
           URIEncoding="UTF-8"  
           connectionTimeout="20000"    
           redirectPort="8443"/>

   <Engine name="a" defaultHost="localhost">
     <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
	 resourceName="UserDatabase"/>
     <Host name="localhost" appBase="a"
	 unpackWARs="false" autoDeploy="false">
     </Host>
   </Engine>
 </Service> 

  <Service name="b">
    <Connector port="8085" protocol="HTTP/1.1"
           URIEncoding="UTF-8"  
           connectionTimeout="20000"
           redirectPort="8443"/>

   <Engine name="b" defaultHost="localhost">
     <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
	 resourceName="UserDatabase"/>
     <Host name="localhost" appBase="b"
	 unpackWARs="false" autoDeploy="false">
     </Host>
   </Engine>
 </Service> 



直接访问 http://ip:8084 和 http://ip:8085 这两个地址项目正常运行,IE Firefox Chrome 浏览器上 session 也正常使用。

但但我使用 Nginx 反向代理 Tomcat 的时候,通过域名http://a.domain.com 和 http://b.domain.com访问,问题来了:IE 上 session 失效,登录功能无法使用;其他浏览器 Firefox Chrome 的 session 均正常。


Nginx的配置如下:
server {
    listen 80;
    server_name a.domain.com;
    root /tomcat/a/ROOT/;


    location / {
        proxy_pass http://localhost:8084/;
        proxy_redirect off;


        proxy_set_header   Cookie $http_cookie; 
        proxy_set_header   Host $host;
        proxy_set_header   Remote_Addr $remote_addr;
        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;


        ...
    }
}




server {
    listen 80;
    server_name b.domain.com;
    root /tomcat/b/ROOT/;


    location / {
        proxy_pass http://localhost:8085/;
        proxy_redirect off;


        proxy_set_header   Cookie $http_cookie; 
        proxy_set_header   Host $host;
        proxy_set_header   Remote_Addr $remote_addr;
        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;


        ...
    }
}
折腾了很久,还没有找到什么原因,造成 IE 下 session 失效。请大伙帮忙看看,是什么问题?谢谢


加载中
0
一号男嘉宾
一号男嘉宾
tomcat 的session,我是放在redis的,你懂的。
0
龅牙驴
龅牙驴
只有Ie浏览器不正常,有点想不明白。服务器暂时没有安装 redis ,先不考虑其他方式
0
龅牙驴
龅牙驴
@梅公子  :绕过 nginx 的代理,直接使用 tomcat 提供的服务,是正常的。我想应该不是 tomcat 的问题。
龅牙驴
龅牙驴
回复 @刘少 : 一个 tomcat 单独跑一个项目, 问题能解决不?或者使用 jetty 存在这个问题不?
刘少
刘少
回复 @刘少 : 2选一
刘少
刘少
1.nginx做session sticky 2.tomcat集中化管理session,可以参考http://my.oschina.net/u/257801/blog/206554
0
龅牙驴
龅牙驴
 @JFinal  很诡异,在IE下,每个请求JSESSIONID都不一样,这个和Jfinal 有关吗?
JFinal
JFinal
jfinal 从未干预过 session,与 jfinal 无关
0
龅牙驴
龅牙驴
@红薯 我记得你4年前 tomcat 7 也遇到这个问题  http://www.oschina.net/question/12_9476,项目放在ROOT里,session失效的问题。现在tomcat8 按照你当时的思路,设置 Host Context 的  sessionCookiePath ,但还是没有解决,帮忙看看,谢谢!
0
龅牙驴
龅牙驴

Cotext 的设置:

<Engine name="b" defaultHost="localhost">
     <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
     <Host name="localhost" appBase="jansen_cn" unpackWARs="false" autoDeploy="false">
        <Context path="/" docBase="/usr/java/tomcat8/b/ROOT" reloadable="false" crossContext="true"  sessionCookiePath="/" sessionCookieName="B_SESSION"/> 
     </Host>
</Engine>




现在 IE 每次请求,B_SESSION 的值一直在变。

0
龅牙驴
龅牙驴
终于发现问题了,是因为域名的原因,二级域名 包含了 _  下划线,IE 里请求的时候,JSESSIONID 竟然没有生成。把二级域名去掉下划线,一切都OK了,跟 tomact , nginx 没有关系。用技术的思维考虑这种问题,折腾了好几天,网络上也没有这么奇怪的问题。什么 sticky ,session集群...memcache,都不相干。
0
龅牙驴
龅牙驴

引用来自“龅牙驴”的评论

终于发现问题了,是因为域名的原因,二级域名 包含了 _  下划线,IE 里请求的时候,JSESSIONID 竟然没有生成。把二级域名去掉下划线,一切都OK了,跟 tomact , nginx 没有关系。用技术的思维考虑这种问题,折腾了好几天,网络上也没有这么奇怪的问题。什么 sticky ,session集群...memcache,都不相干。
自己找到原因了。
返回顶部
顶部