我的一个 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 "%r" %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。
1
julyclyde 2019-07-01 10:36:01 +08:00
简单问题复杂化
你应该把这个部署,断成两段来调试: 首先做个假的 upstream,或者抓包,看看 nginx 给 upstream 发的请求是不是带了正确的内容 再去掉 nginx,直接访问 tomcat 看看能不能正常把根目录请求转发给项目 a |