Nginx配置域名代理多个域名,核心答案就一句话:每个域名对应一个独立的server块,用server_name识别域名,再用proxy_pass转发到各自的后端服务。 这套逻辑在80和443端口都成立,真正容易踩坑的地方不在语法,而在证书匹配、Host头传递和默认server的优先级。
nginx反向代理多个域名怎么配置?先理清server块与请求匹配逻辑
一个请求进来,Nginx怎么知道该找哪个域名
Nginx处理多域名请求时,靠的是“监听端口 + server_name”组合匹配,你可以把它理解成前台分诊:先看请求进的是哪个门,再看挂号条上的域名。
具体匹配顺序可以记成下面几点:
- 先匹配
listen指令,比如80端口和443端口分开处理; - 再匹配
server_name,精确域名优先,通配符次之,正则再次之; - 如果没有匹配到任何
server_name,就会落到该端口的default_server; - 如果没显式设置默认server,Nginx通常会把第一个server块当默认。
业内专家指出,多域名代理最容易出问题的地方不是proxy_pass,而是Host头和SNI证书匹配,很多“访问A域名却打开B站点”的故障,根源都在这里。
最小可用配置示例
假设你有两个域名:a.example.com和b.example.com,分别代理到本机8080和8081端口,配置可以写成这样:
# /etc/nginx/conf.d/multi-domain.conf
server {
listen 80;
server_name a.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
}
server {
listen 80;
server_name b.example.com;
location / {
proxy_pass http://127.0.0.1:8081;
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;
}
}
这里的关键点有三个:
server_name后面写完整域名,不要带http://或路径;- 不同后端就拆不同server块,不要硬塞进一个location里;
proxy_set_header Host $host必须加,否则后端可能拿不到原始域名。
改完配置后,别急着刷新浏览器
每次改完Nginx配置,建议按这个顺序检查:
- 执行
nginx -t,确认语法没有问题; - 执行
nginx -T,查看最终合并后的完整配置; - 执行
systemctl reload nginx或nginx -s reload,平滑加载; - 用
curl -I -H "Host: a.example.com" http://127.0.0.1测试本机匹配; - 再用
curl -I --resolve a.example.com:80:服务器IP http://a.example.com测试外部解析。
这样能快速判断是Nginx匹配问题,还是DNS、防火墙、后端服务的问题。
nginx一个端口代理多个域名:80和443的实操差异
80端口:纯HTTP多域名代理
80端口的配置最简单,多个server块都监听80,靠server_name区分,适合内部测试、临时跳转、旧站迁移,生产环境如果还跑HTTP,建议加一个301跳转到HTTPS。
443端口:HTTPS多域名代理
443端口多域名代理,核心多了SSL证书,每个域名最好有对应的证书,或者用一张多域名证书、通配符证书覆盖,配置片段如下:
server {
listen 443 ssl;
http2 on; # Nginx 1.25.1+ 写法,旧版本可用 listen 443 ssl http2;
server_name a.example.com;
ssl_certificate /etc/letsencrypt/live/a.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
如果证书和域名对不上,浏览器会直接报错,SNI机制会让Nginx根据客户端带来的域名选择证书,所以server_name和证书覆盖范围必须一致。
国内服务器nginx多域名代理配置教程:从DNS到防火墙
在国内服务器上部署,除了Nginx本身,还要把周边环节一起打通,可以按这个清单走:
- 域名DNS添加A记录,指向服务器公网IP;
- 据工信部公开信息,境内服务器提供网站服务通常需要完成备案;
- 云服务器安全组放行80和443端口;
- 系统防火墙如firewalld、ufw也要放行;
- Nginx配置多个server块,分别绑定域名;
- 用
nginx -t和systemctl reload nginx生效; - 最后用手机流量和电脑浏览器分别验证。
不同配置方式对比如下:
| 配置方式 | server_name写法 | 适用场景 | 主要风险 |
|---|---|---|---|
| 多server块 | a.example.com |
不同域名不同后端 | 证书要一一对应 |
| 同server多域名 | a.example.com b.example.com |
多个域名同一后端 | 后端需自行区分Host |
| 泛解析 | .example.com
|
子域名很多 | 通配符证书成本较高 |
| 默认server | _或default_server |
拦截未绑定域名 | 配置不当会抢域名 |
nginx多域名SSL证书配置方法:让HTTPS不串站
单域名证书逐个绑定
最稳妥的方式是每个域名一张证书,各自放在对应server块里,比如用Certbot申请:
certbot --nginx -d a.example.com -d b.example.com
Let’s Encrypt证书有效期通常为90天,建议配置自动续期:
certbot renew --dry-run
确认无误后,把certbot renew加入cron或systemd timer。
泛域名证书和多域名证书怎么选
泛域名证书适合.example.com这种大量子域名的场景,一张证书覆盖所有同级子域名,多域名证书适合域名数量不多、但主域名分散的情况,行业共识认为,生产环境应避免把所有域名都塞进一个server块里,除非它们确实共用同一套后端和同一张证书。
免费SSL证书和付费证书价格差异怎么权衡?
免费证书不是“不能用”,而是服务边界不同,免费证书价格为零,但有效期短,通常没有人工支持和赔付条款,付费证书价格跨度较大,差异主要体现在保修金额、技术支持、通配符覆盖和签发机构信任链上。
对大多数中小站点,免费证书配合自动续期已经够用,对电商、金融、政企类站点,付费证书的赔付和技术支持更有价值,选择时别只看价格,要看证书类型、覆盖域名数量和续期自动化程度。
排查HTTPS串站
如果访问A域名却提示B域名证书,可以按下面顺序排查:
- 检查是否有
listen 443 default_server抢占了未匹配请求; - 检查
server_name是否精确,避免通配符范围过大; - 用
openssl s_client -connect 服务器IP:443 -servername a.example.com查看实际返回证书; - 检查浏览器是否开启了HSTS,导致旧跳转被缓存;
- 检查CDN或负载均衡层是否提前终止了HTTPS。
多域名代理进阶:后端区分、日志分离与真实IP
后端如何区分不同域名
如果多个域名代理到同一个后端,后端需要通过Host头或自定义Header区分,比如在Nginx里加:
proxy_set_header X-Site-Name "a";
后端再根据X-Site-Name或Host加载不同站点,这样比开多个后端端口更省资源,但要求后端程序支持多租户或多站点配置。
日志分离
多域名共用一台Nginx时,建议按域名拆日志:
access_log /var/log/nginx/a.example.com.access.log; error_log /var/log/nginx/a.example.com.error.log;
排查问题时,能直接定位到具体域名,不用在混合日志里翻找。
WebSocket和长连接
如果后端有WebSocket,需要加:
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
否则连接会在代理层被断开,长连接场景还要关注proxy_read_timeout和keepalive_timeout,避免空闲连接被过早回收。
upstream负载均衡
同一域名需要多个后端时,可以用upstream:
upstream a_backend {
server 127.0.0.1:8080;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name a.example.com;
location / {
proxy_pass http://a_backend;
}
}
这样Nginx会按默认轮询分发请求,也可以加权重、健康检查等策略。
收束
多域名代理并不复杂,关键是让每个域名有清晰的server块、正确的server_name和匹配的证书,把Host头、默认server、HTTPS证书这三处管住,绝大多数串站和502问题都能提前避开。
Q&A:nginx配置域名代理多个域名常见问题
两个域名可以代理到同一个后端吗?
可以,把两个域名写进同一个server块的server_name,或者分别写server块但proxy_pass指向同一个后端地址,区别在于后端如何区分请求来源,如果后端需要按域名展示不同内容,必须把Host头传过去,或者额外加自定义Header。
nginx多域名代理后,后端如何获取真实客户端IP?
在Nginx的location里加上:
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
后端不要直接读remote_addr,而是读取X-Real-IP或X-Forwarded-For的第一个IP,如果前面还有CDN或负载均衡,需要配置set_real_ip_from和real_ip_header,否则拿到的可能是上一层代理的IP。
nginx配置多个域名后,为什么访问A域名却跳到B域名?
常见原因有三个:B域名所在server块被设成了default_server,抢占了未精确匹配的请求;A域名的HTTPS证书不匹配,浏览器按SNI选择了另一个server块;浏览器或CDN缓存了HSTS策略,把A强制升级到HTTPS后落到了错误配置上,检查listen、server_name和ssl_certificate三项,通常就能定位。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/726381.html





