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

Nginx基于服务器名称转发请求至不同本地端口的配置咨询

Nginx基于服务器名称转发请求至不同本地端口的配置咨询

嗨,我完全懂你的需求!你现在是想让跑在80端口的Nginx当一个「入口网关」,把site1.local、site2.local这些域名的请求,自动转发到对应的8001、8002这些后端Nginx实例对吧?这个场景用Nginx的反向代理功能就能轻松搞定,我给你捋捋具体配置和注意事项:

基础单站点配置(适合站点少的情况)

如果你的站点数量不多,直接给每个域名写单独的server块最直观,配置起来也不容易出错。比如在80端口Nginx的配置文件(一般在/etc/nginx/conf.d/或者/etc/nginx/sites-available/目录下)里加这些内容:

# 处理site1.local的请求,转发到8001端口
server {
    listen 80;
    server_name site1.local;

    location / {
        # 转发到对应的后端端口
        proxy_pass http://localhost:8001;
        # 这些header配置很重要,能让后端Nginx拿到正确的请求源信息
        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;
    }
}

# 处理site2.local的请求,转发到8002端口
server {
    listen 80;
    server_name site2.local;

    location / {
        proxy_pass http://localhost:8002;
        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;
    }
}

批量站点配置(适合站点多、命名有规律的情况)

如果你的站点是按siteN.local这种规律命名的,用正则表达式来写一个通用的server块就太方便了,不用一个个复制粘贴:

server {
    listen 80;
    # 用正则匹配siteN.local,捕获数字部分存到变量$num里
    server_name ~^site(?<num>\d+)\.local$;

    location / {
        # 直接用捕获到的数字拼接后端端口
        proxy_pass http://localhost:800$num;
        # 同样要加上必要的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;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

几个关键注意点

  • 端口冲突检查:启动80端口的Nginx前,先确认80端口没被其他服务占了,比如用netstat -tulpn | grep :80或者ss -tulpn | grep :80查一下,有冲突的话先停掉对应的服务
  • 后端Nginx配置:后端跑在8001、8002的Nginx实例,server_name可以设成对应的siteN.local,也可以直接设成_(匹配所有请求),反正请求已经被前端Nginx转发过来了
  • 配置生效:改完配置后,记得重新加载Nginx让配置生效,命令是nginx -s reload,如果是用systemd管理的,也可以用systemctl reload nginx
  • 测试验证:可以用curl -H "Host: site1.local" http://localhost快速测试转发是否正常,或者直接在浏览器里输入site1.local访问,因为你已经在/etc/hosts里把这些域名指向127.0.0.1了,完全没问题

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

火山引擎 最新活动