我在 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>