Nginx反向代理带SSL的Tomcat应用配置问题求助
首先梳理下你的场景:Tomcat应用的context-path为/abc,通过子域名abc.example.com访问,现在用Nginx做反向代理但静态资源加载异常。这个问题主要出在请求URI的映射逻辑和缺少必要的反向代理请求头,导致资源路径解析错误。
修正后的Nginx配置
server { listen 80; listen [::]:80; server_name abc.example.com; # 反向代理核心配置 location / { # 移除proxy_pass末尾的斜杠,让Nginx完整转发URI到Tomcat的/abc路径下 proxy_pass https://tomcat:8443/abc; # 设置关键请求头,让Tomcat识别外部请求的真实信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
关键修改点说明
去掉
proxy_pass末尾的斜杠:
原配置中proxy_pass末尾的斜杠会让Nginx把location匹配的/替换为斜杠后的路径,看似没问题,但如果页面里的静态资源引用是相对路径,或者Tomcat生成的链接带了/abc,就会出现路径重复的问题。去掉斜杠后,Nginx会把完整的请求URI拼接到/abc后面,比如请求abc.example.com/css/style.css会转发到https://tomcat:8443/abc/css/style.css,完美匹配Tomcat的context-path结构。添加反向代理请求头:
Host $host:让Tomcat知道外部访问的域名是abc.example.com,而非tomcat:8443,这样Tomcat生成的页面链接、资源路径会使用正确的域名。X-Forwarded-Proto $scheme:告诉Tomcat外部请求使用的协议(当前是HTTP,后续配置HTTPS时会自动切换为HTTPS),避免Tomcat生成带有错误协议的资源路径。X-Real-IP和X-Forwarded-For:帮助Tomcat获取真实的客户端IP,方便日志记录和业务逻辑处理。
额外注意事项
后续启用HTTPS的适配:
如果之后要给Nginx配置SSL证书,记得同步调整X-Forwarded-Proto为https,同时可以在Tomcat的server.xml中配置RemoteIpValve,让Tomcat正确解析这些请求头,确保内部逻辑使用正确的协议和端口。静态资源路径检查:
确保Web应用里的静态资源引用是相对路径(比如css/style.css)或者基于域名的绝对路径(比如/css/style.css),不要硬编码成http://tomcat:8443/abc/css/style.css,否则浏览器会直接跳过Nginx请求Tomcat地址,导致资源加载失败。
内容的提问来源于stack exchange,提问作者xring

