使用 nginx 作为代理的 tomcat 中会话丢失

使用 nginx 作为代理的 tomcat 中会话丢失

我在 tomcar 服务器中有几个应用程序。我使用 nginx 作为代理,这样我就可以从子域访问应用程序

tomat:8080/app1 > app1.mydomain.com 
tomat:8080/app2 > app2.mydomain.com 

我设置了一个反向代理:

server {
  listen 80;
  server_name  app1.mydomain.com;
  location / {
   proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Host $host;
     proxy_set_header X-Forwarded-Server $host;

    proxy_pass http://tomcat:8080/app1/;
  }
}

我可以毫无问题地访问该应用程序。但无法保持会话。我在 jetty 中还有另一个应用程序,它在 ngix 后面毫无问题地运行。此外,如果我直接访问该应用程序,我可以毫无问题地操作它。

有什么提示吗?

谢谢。

答案1

我注意到,当代理位置路径与 Tomcat 应用程序上下文名称不匹配并且 cookie 路径不匹配时,就会出现问题,从而导致每个请求都会产生新的 JSESSIONID。

尝试添加下面提到的 proxy_cookie_path 指令:

location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;

    proxy_cookie_path ~*^/.* /;

    proxy_pass http://tomcat:8080/app1/;
}

答案2

对我来说,答案是迪瓦卡尔·蒂米尔西纳正是解决了我的问题。

让 nginx 响应 VHost 的根上下文,并将请求代理到上下文 /application 中的 Tomcat 实例

例如:

http://hunt.pepe.com/index.jsp  -->  http://localhost:8080/hunt-app

我添加的唯一指令是[proxy_cookie_path ~^/./;]:

location / {
    ·
    ·
    proxy_cookie_path ~*^/.* /;
    ·
    proxy_pass  http://localhost:8080/hunt-app;
}

非常感谢,老兄,你真是救了我一命。

答案3

您可以启用粘性会话或会话亲和性。这将确保来自同一客户端的请求每次都传递到同一个 tomcat

nginx 中的变化:

粘性 cookie srv_id 过期=1h domain=.example.com path=/;

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#sticky

答案4

我也遇到了同样的问题,无法保持会话。Cesar 提到他已经解决了 Apache 的问题,但我使用 Apache 也遇到了同样的问题。有人能帮我吗?我已进行以下设置。

DNS 配置

子域名.mydomain.com 10.10.10.10

10.10.10.10 的 apache 中的代理配置

<VirtualHost *:80>
ServerName subdomain.mydomain.com

ProxyPass / http://tomcatserverIP:8080/appname
ReverseProxyPass / http://tomcatserverIP:8080/appname

</VirtualHost>

相关内容