快来帮忙! nginx 反向代理 tomcat, session 和 cookie 失效

2019-06-30 16:09:21 +08:00
 HuasLeung

我的一个 java 项目 a 部署在 tomcat 的 webapps 目录下,通过下面的配置可以成功通过 www.example.com 访问到,但 session 和 cookie 失效。

nginx 的 default.conf 配置文件

server {
    listen       443 ssl;
    server_name  www.example.com;
    ssl_certificate sslcert/1_www.example.com_bundle.crt;
    ssl_certificate_key sslcert/2_www.example.com.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://ip 地址:8080; 
        proxy_set_header Host $host;
        proxy_set_header Remote_Addr $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}


server {
    listen 80;
    server_name  www.example.com;

    rewrite ^(.*)$ https://$host$1 permanent;

}

tomcat 的 server.xml 配置文件

<Engine name="Catalina" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>

      <!-- 添加的虚拟主机 -->
      <Host name="www.example.com"  appBase="webapps"
              unpackWARs="true" autoDeploy="true">
              <!-- 去除访问时 URL 中的项目名 -->
              <Context path="" docBase="a" debug="0"/>
      </Host>

</Engine>

我在百度、谷歌上搜索这个问题返回很多结果,基本都是

proxy_pass http://ip 地址:8080/a

然后通过添加

proxy_cookie_path /a/ /

就解决了问题。但是这个配置跟我的不一样,QAQ。我在 server.xml 的

<Host name="www.example.com"  appBase="webapps"
              unpackWARs="true" autoDeploy="true">
    <!-- 去除访问时 URL 中的项目名 -->
    <Context path="" docBase="a" debug="0"/>
</Host>

已经把 www.example.com 的请求已经发到项目 a 了,因此不需要 proxy_pass http://ip 地址:8080/a 这样做。

有老哥知道这个怎么弄么? Thanks in advance。

1282 次点击
所在节点    问与答
1 条回复
julyclyde
2019-07-01 10:36:01 +08:00
简单问题复杂化

你应该把这个部署,断成两段来调试:
首先做个假的 upstream,或者抓包,看看 nginx 给 upstream 发的请求是不是带了正确的内容

再去掉 nginx,直接访问 tomcat 看看能不能正常把根目录请求转发给项目 a

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/578737

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX