V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
HuasLeung
V2EX  ›  问与答

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

  •  
  •   HuasLeung · 2019-06-30 16:09:21 +08:00 · 1281 次点击
    这是一个创建于 1777 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的一个 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。

    julyclyde
        1
    julyclyde  
       2019-07-01 10:36:01 +08:00
    简单问题复杂化

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

    再去掉 nginx,直接访问 tomcat 看看能不能正常把根目录请求转发给项目 a
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   960 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:14 · PVG 05:14 · LAX 14:14 · JFK 17:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.