迁移至Ubuntu24.04 Nginx时出现server_name冲突报错求助
Nginx 冲突服务器名警告排查与修复
问题背景
从CentOS7+Apache迁移到Ubuntu24.04+Nginx后,出现警告:
nginx: [warn] 25570#25570: conflicting server name "www.example.com" on 0.0.0.0:80, ignored
附上当前Nginx配置文件请求排查。
配置文件内容
server { server_name example.com www.example.com; root /var/www/example.com; index index.html index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~* /(\.git|cache|bin|logs|backup|tests)/.*$ { return 403; } location ~* /(system|vendor)/.*\.(txt|xml|md|html|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ { return 403; } location ~* /user/.*\.(txt|md|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ { return 403; } location ~ /(LICENSE\.txt|composer\.lock|composer\.json|nginx\.conf|web\.config|htaccess\.txt|\.htaccess) { return 403; } location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.3-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = example.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name example.com www.example.com; return 404; # managed by Certbot }
问题分析
警告的核心原因是80端口的监听配置中,www.example.com被重复声明,同时当前配置的80端口server块存在逻辑错误:
- Certbot生成的
if ($host = example.com)仅处理主域名的HTTPS跳转,www.example.com访问80端口会直接返回404,不符合预期。 - 若服务器上存在其他Nginx配置文件(如默认的
default.conf),其未指定server_name或也声明了www.example.com,会触发冲突警告。
修复方案
步骤1:检查并清理冲突配置
执行命令查看启用的配置文件:
ls /etc/nginx/sites-enabled/
如果存在default等无关配置文件,执行以下命令禁用:
sudo unlink /etc/nginx/sites-enabled/default
步骤2:修正80端口跳转逻辑
将原80端口的server块替换为以下内容,实现主域名与www域名统一跳转到HTTPS:
server { listen 80; server_name example.com www.example.com; # 所有HTTP请求强制跳转HTTPS return 301 https://$host$request_uri; }
步骤3:验证配置并重启服务
执行配置合法性检查:
sudo nginx -t
若输出test is successful,重启Nginx服务:
sudo systemctl reload nginx
补充说明
你关于“主域名与子域名放在同一server_name行”的理解是正确的,问题并非出在该配置上,而是80端口的跳转逻辑错误+潜在的配置文件冲突导致的警告。
内容的提问来源于stack exchange,提问作者zoof
相关产品推荐
相关产品推荐

