Nginx 可以通过在同一配置文件中定义多个 server 块,利用 server_name 指令区分域名,并将请求转发到不同的本地端口。适用场景是一台服务器托管多个业务系统,风险边界是端口冲突或配置语法错误导致服务中断。
先说结论:通过配置多个 server 块监听 80 或 443 端口,利用 server_name 匹配域名,再使用 proxy_pass 指向不同后端端口即可实现。
- 适合:单 IP 多域名场景,后端服务运行在不同端口。
- 先准备:确认域名解析生效,后端服务端口可访问。
- 验收:使用 curl 或浏览器访问域名,检查后端返回内容。
命令速用版
修改配置后必须执行语法检查和重载命令,避免配置错误导致 Nginx 停止工作。
nginx -t nginx -s reload
为什么会这样
Nginx 基于 HTTP 请求头中的 Host 字段匹配 server_name 来决定使用哪个 server 块配置。
当请求到达 Nginx 时,Nginx 首先检查 Host 头,找到对应的 server 块,然后根据 location 规则将请求转发给 proxy_pass 指定的 upstream 或地址。不同域名可以指向同一个 IP,但 Nginx 内部根据域名区分转发逻辑。
分步处理
第一步,找到 Nginx 配置文件,通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/ 目录下。
第二步,为每个域名编写独立的 server 块,设置对应的 server_name 和 proxy_pass 端口。
server {
listen 80;
server_name domain1.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 80;
server_name domain2.com;
location / {
proxy_pass http://127.0.0.1:8081;
}
}第三步,执行 nginx -t 检查配置语法,确认成功后执行 nginx -s reload 生效。
怎么验证是否生效
使用 curl 命令模拟请求,指定 Host 头访问服务器 IP,观察返回内容是否来自对应的后端端口服务。
curl -H "Host: domain1.com" http://服务器 IP curl -H "Host: domain2.com" http://服务器 IP
检查 Nginx 访问日志 /var/log/nginx/access.log,确认请求状态码为 200 且被正确记录。
常见坑
配置末尾缺少分号会导致 nginx -t 报错。后端服务防火墙未放行本地回环端口可能导致 502 Bad Gateway。默认 server 块缺失可能导致未匹配域名的请求被错误转发。
常见问题
多个域名可以指向同一个后端端口吗
可以,多个 server_name 可以写在同一个 server 块中,或者不同域名配置相同的 proxy_pass 地址。
配置修改后需要重启 Nginx 吗
不需要重启,执行 nginx -s reload 即可平滑重载配置,不影响现有连接。
如何配置 HTTPS 多域名反向代理
需要为每个域名配置 ssl_certificate 和 ssl_certificate_key,监听 443 端口,其余 proxy_pass 逻辑相同。