You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置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

火山引擎 最新活动