You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
注册

如何用Nginx实现同一服务器上不同域名应用的反向代理(同IP同端口)

如何用Nginx实现同一服务器上不同域名应用的反向代理(同IP同端口)

嘿,这个问题我太熟了!其实你完全误解了Nginx的server块规则——它根本不需要每个server块用唯一的listen端口,和Apache的VirtualHost逻辑是一模一样的,核心都是靠域名匹配来区分不同请求的。

Nginx是通过请求头里的Host字段,对应server块里的server_name参数来路由请求的,只要每个server块的server_name对应不同的域名,即使它们用相同的listen端口(比如都是80或443),Nginx也能精准把请求转发到对应的应用上。

给你一个具体的配置示例,一看就懂:

# 第一个域名对应的应用配置
server {
    listen 80; # 多个server块可以共用同一个端口
    server_name app1.com www.app1.com; # 这里填你的第一个域名,包括带www的子域名

    location / {
        proxy_pass http://localhost:3000; # 替换成你第一个应用的实际运行地址(比如本地端口)
        # 下面这几个header是为了让后端应用能正确获取客户端信息,建议加上
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

# 第二个域名对应的应用配置
server {
    listen 80; # 和上面用同一个端口就行
    server_name app2.com www.app2.com; # 第二个域名

    location / {
        proxy_pass http://localhost:4000; # 第二个应用的实际运行地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

配置完之后,记得做这两步:

  • nginx -t命令检查配置语法是否正确,出现test is successful就没问题
  • nginx -s reload命令重新加载Nginx配置,让修改生效

最后再提醒你几个关键点:

  • 确保你的两个域名都已经正确解析到服务器的公网IP上
  • 如果需要HTTPS,把listen 80改成listen 443 ssl;,然后在每个server块里加上ssl_certificatessl_certificate_key指向你的SSL证书文件即可(可以用各自的证书,也可以用通配符证书)
  • 如果有默认域名需求,可以加一个server_name _;的server块作为默认路由,处理不匹配任何域名的请求

备注:内容来源于stack exchange,提问作者Wige

火山引擎 最新活动