如何配置Nginx与Tomcat实现多域名部署?解决端口跳转异常
解决多域名部署下Nginx+Tomcat跳转带端口的问题
我来帮你搞定这个跳转带8080端口的问题——核心原因是Tomcat没意识到自己是通过Nginx反向代理对外提供服务的,所以生成跳转链接(比如重定向、页面内的绝对链接)时,会用自身的8080端口,再加上Nginx的Host头配置有点小问题,就导致了这个现象。下面是具体的配置方案:
一、先调整Nginx的配置
你需要修改suyla.org对应的server块,重点修正Host头和添加跳转链接重写规则:
server { listen 80; listen [::]:80; server_name www.suyla.org suyla.org; access_log /var/log/nginx/suylaaccess.log main; error_log /var/log/nginx/suyla-error.log; location / { # 关键:传递给Tomcat的Host头只保留域名,不要带Nginx连接Tomcat的8080端口 proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 强制重写Tomcat返回的跳转链接,把8080端口去掉 proxy_redirect http://$host:8080/denizhan/ http://$host/denizhan/; proxy_redirect http://$host:8080/denizhan http://$host/denizhan; proxy_pass http://localhost:8080/denizhan; } }
解释下修改点:
- 把原来的
proxy_set_header Host $host:$proxy_port;改成proxy_set_header Host $host;:这样Tomcat拿到的Host是用户实际访问的域名(不带8080),生成链接时就不会带这个端口了。 - 添加
proxy_redirect:如果Tomcat已经生成了带8080的跳转链接,Nginx会自动把它替换成正确的不带端口的地址。
二、再配置Tomcat识别反向代理
为了让Tomcat彻底明白自己是被反向代理的,需要修改Tomcat的conf/server.xml文件,推荐用RemoteIpValve的方式,这样两个域名都能适配:
方案1:使用RemoteIpValve(推荐,支持多域名)
找到<Engine>节点,在里面添加这个Valve:
<Engine name="Catalina" defaultHost="localhost"> <!-- 保留原有的其他Valve,比如AccessLogValve --> <Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" portHeader="X-Forwarded-Port"/> <!-- 原有的Host配置 --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- ... 其他配置 ... --> </Host> </Engine>
这个Valve会读取Nginx传递的X-Forwarded-*头信息,自动让Tomcat使用用户实际访问的域名、端口和协议来生成链接,完美适配多域名场景。
方案2:给Connector指定固定域名(适合单域名)
如果你只想单独给suyla.org配置,可以修改8080端口的Connector节点:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" proxyName="suyla.org" proxyPort="80" scheme="http"/>
这样Tomcat会固定用suyla.org:80来生成链接,但这个方案对fromthepast.org的适配性不好,所以更推荐方案1。
三、最后重启服务
修改完配置后,记得重启Nginx和Tomcat:
# 重启Nginx sudo systemctl restart nginx # 重启Tomcat(根据你的Tomcat启动方式调整,比如用systemd或者脚本) sudo systemctl restart tomcat
现在访问suyla.org或者suyla.org/denizhan就不会再显示8080端口了,两个域名也能各自正常工作~
内容的提问来源于stack exchange,提问作者streji




