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




