双域名双IP服务器Nginx配置异常排查及已解决说明
双IP服务器Nginx多域名配置问题解决
问题场景
服务器eth1网卡绑定双IP(1.2.3.26、1.2.3.30),使用Nginx反向代理托管两个域名:
server.info对应IP 1.2.3.26server.dev对应IP 1.2.3.30
单域名运行正常,新增第二个域名后出现两类异常:
- 单配置文件时,访问
server.dev会加载server.info目录下的index.html,server.info访问正常; - 拆分为
dev.conf和api.conf两个配置文件后,仅server.dev能正常访问,server.info完全无法接收流量,但执行nginx -t始终显示配置验证通过。
问题根源
Nginx在处理多IP多域名配置时,如果未明确指定listen指令绑定特定IP+端口,会默认监听服务器所有可用IP的对应端口,导致域名匹配逻辑混乱,流量被错误路由到默认server块。拆分配置时仅为server.dev添加SSL证书不是核心问题,关键是要确保每个域名对应的server块都精准绑定到对应IP。
正确配置示例
以下是修正后的完整配置(每个server块均明确监听对应IP的端口):
# server.info 相关配置 server { listen 1.2.3.26:443 ssl http2; server_name www.server.info; root /var/www/server.info/; index index.html; # SSL 配置 ssl_certificate /etc/letsencrypt/live/server.info/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/server.info/privkey.pem; # managed by Certbot ssl_trusted_certificate /etc/letsencrypt/live/server.info/chain.pem; # 安全配置 include nginxconfig.io/security.conf; # 日志配置 access_log /var/log/nginx/server.info.access.log; } # HTTP 跳转至 HTTPS(server.info) server { listen 1.2.3.26:80; server_name server.info; root /var/www/server.info/; index index.html; include nginxconfig.io/letsencrypt.conf; location / { return 301 https://www.server.info$request_uri; } } server { listen 1.2.3.26:80; server_name www.server.info; root /var/www/server.info/; index index.html; include nginxconfig.io/letsencrypt.conf; location / { return 301 https://www.server.info$request_uri; } } # server.dev 相关配置 server { listen 1.2.3.30:443 ssl http2; server_name www.server.dev; root /var/www/server.dev/; index index.html; # SSL 配置(需补充对应证书) # ssl_certificate /etc/letsencrypt/live/server.dev/fullchain.pem; # ssl_certificate_key /etc/letsencrypt/live/server.dev/privkey.pem; # 安全配置 include nginxconfig.io/security.conf; # 日志配置 access_log /var/log/nginx/server.dev.access.log; } # HTTP 跳转至 HTTPS(server.dev) server { listen 1.2.3.30:80; server_name server.dev; root /var/www/server.dev/; index index.html; include nginxconfig.io/letsencrypt.conf; location / { return 301 https://www.server.dev$request_uri; } } server { listen 1.2.3.30:80; server_name www.server.dev; root /var/www/server.dev/; index index.html; include nginxconfig.io/letsencrypt.conf; location / { return 301 https://www.server.dev$request_uri; } }
关键注意事项
- 所有
listen指令必须明确指定对应域名的IP地址,避免使用listen 443或listen 80这种无IP绑定的写法; - 拆分配置文件时,确保每个域名的配置文件都被Nginx加载(放在
/etc/nginx/conf.d/或指定的include目录下); - 配置修改后,执行
nginx -s reload重载配置,不要仅依赖nginx -t的验证结果。
内容的提问来源于stack exchange,提问作者mattuscainsgfrnc
相关产品推荐
相关产品推荐

