Nginx 1.24 配置多个域名指向不同后端服务端口,核心是通过多个 server 块配合 server_name 指令区分域名,再利用 proxy_pass 将请求转发至不同本地端口,实现单 IP 多服务映射。
先说结论:Nginx 1.24 版本沿用标准虚拟主机配置逻辑,无需特殊模块即可实现多域名分流到不同端口。
- 适合:单服务器部署多个业务系统(如前端 3000 端口、后端 8080 端口)
- 先准备:确认域名已解析到服务器 IP 且后端服务端口已开放
- 验收:使用 curl 命令携带 Host 头验证转发是否准确
命令速用版
以下是 Nginx 配置多域名转发的核心命令和配置片段,可直接参考修改。
nginx -t nginx -s reload
配置示例:
server {
listen 80;
server_name web.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
}
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}为什么会这样
Nginx 基于 HTTP 请求头中的 Host 字段匹配 server_name,从而决定使用哪个 server 块处理请求。
当多个域名解析到同一 IP 时,Nginx 监听 80 或 443 端口,读取请求中的 Host 头,匹配配置的 server_name。匹配成功后,通过 proxy_pass 指令将请求代理到配置的内网 IP 和端口。这种机制允许在不暴露后端真实端口的前提下,通过标准端口对外提供服务,同时实现业务隔离。
分步处理
按以下步骤完成配置,每步完成后建议进行检查。
步骤 1:确认域名解析
在 DNS 管理平台将多个域名(如 web.example.com、api.example.com)的 A 记录解析到服务器公网 IP。使用 ping 命令确认域名已指向正确 IP。
步骤 2:编写配置文件
在 Nginx 配置目录(如/etc/nginx/conf.d/)为每个域名创建独立配置文件,或在一个文件中编写多个 server 块。每个 server 块需设置独立的 listen 端口、server_name 和 proxy_pass 地址。确保 proxy_pass 地址包含协议头(http://)和完整地址。
步骤 3:配置代理头
在每个 location 块中添加 proxy_set_header Host $host;和 proxy_set_header X-Real-IP $remote_addr;。这能防止后端服务获取到错误的 Host 信息,并确保后端能记录真实客户端 IP。
步骤 4:测试与重载
执行 nginx -t 检查配置语法。若显示 syntax is okay,执行 nginx -s reload 应用配置。若报错,根据提示修改配置文件。
怎么验证是否生效
配置完成后,通过以下方法验证转发规则是否生效。
方法 1:curl 命令测试
在服务器本地或外部机器执行 curl -H "Host: web.example.com" http://服务器 IP/。观察返回内容是否为 3000 端口服务的响应。更换域名和 Host 头测试另一服务。
方法 2:浏览器访问
直接在浏览器访问配置的域名(如 http://web.example.com)。若无需携带端口号即可访问对应业务,说明转发成功。
方法 3:检查访问日志
查看 Nginx 访问日志(通常位于/var/log/nginx/access.log)。确认不同域名的请求被记录,且状态码为 200 或预期业务状态码。
常见坑
配置过程中容易遇到以下问题,需提前规避。
proxy_pass 结尾斜杠问题
proxy_pass 地址结尾是否加/会影响路径重写。若写 proxy_pass http://127.0.0.1:3000/;,请求/path 会被转发为/path;若写 proxy_pass http://127.0.0.1:3000;,路径逻辑可能不同。建议统一规范,避免路径丢失。
后端获取不到真实 IP
若未配置 proxy_set_header X-Real-IP $remote_addr;,后端服务日志中客户端 IP 可能显示为 127.0.0.1。需在 Nginx 中显式传递该头部。
防火墙端口未开放
Nginx 监听 80/443 端口,但后端服务端口(如 3000、8080)需在服务器防火墙或安全组中允许本地访问。若后端服务仅监听 127.0.0.1,Nginx 可正常转发;若监听公网 IP,需确保外部无法直接访问后端端口。
常见问题
多个域名可以指向同一个端口吗?
可以,多个 server_name 可配置在同一 server 块中指向同一端口,也可分不同 server 块指向同一端口。
配置后需要重启 Nginx 吗?
不需要重启进程,执行 nginx -s reload 重新加载配置即可,不会中断现有连接。
HTTPS 域名如何配置不同端口?
需配置 listen 443 ssl 并指定证书文件,其余 server_name 和 proxy_pass 逻辑与 HTTP 一致。
默认访问到哪个服务?
若请求 Host 头不匹配任何 server_name,Nginx 会访问默认 server 块。建议配置一个默认 server 返回 403 或 404。
参考来源
- Nginx 反向代理实现多域名指向不同端口
- nginx 配置多个域名 指向不同服务_Nginx 的几个常用配置和技巧
- nginx 实现多个域名在同一服务器指向不同端口
- Nginx 域名端口智能转发:实现多域名服务的核心配置指南
- 使用 Nginx 实现多域名端口分流:配置指南与实战解析
- Nginx 常见配置:多域名对应多端口配置之配置不同域名对应不同端口
- 一文搞懂 Nginx 配置:轻松驾驭多域名管理的实战
- Nginx 配置多域名的详细步骤
- nginx 部署多个项目添加不同端口