Nginx配置多server_name时第二个域名无法正常工作的问题排查
问题分析与解决思路
可能的原因
- HTTPS Server块配置遗漏:HTML站点的HTTPS配置未正确包含
www.FQDN,导致Nginx无法匹配该请求,转而将其路由到第一个加载的SSL Server块(即配置文件夹中的第一个站点)。 - SSL证书配置错误:虽然申请了双域名证书,但Nginx配置中可能未引用包含双域名的完整证书链,或证书路径/权限设置有误。Safari对SSL证书链的验证比Chrome/Firefox更严格,因此会直接提示不安全,而其他浏览器可能先执行重定向逻辑。
- Ansible模板渲染异常:统一模板生成配置时,HTML站点的
server_name变量或证书路径未正确替换,比如模板中仅为WordPress站点添加了www域名,或证书路径变量在HTML站点实例中未正确填充。 - 浏览器缓存差异:Chrome/Firefox可能缓存了旧的重定向规则,而Safari直接验证当前SSL证书状态,导致表现不一致。
解决思路
1. 检查HTTPS Server块配置
- 打开HTML站点的HTTPS配置文件,确认
server_name同时包含主域名和www域名:server { listen 443 ssl; server_name example.com www.example.com; # 其他SSL相关配置 } - 执行
nginx -t验证配置语法,无错误后执行systemctl reload nginx生效。
2. 验证SSL证书有效性
- 检查证书是否包含双域名:
输出应同时显示openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -text -noout | grep DNSDNS:example.com和DNS:www.example.com。 - 确认Nginx配置中引用的是
fullchain.pem(完整证书链)而非仅cert.pem,私钥路径和权限正确(通常权限为600,属主为root/nginx):ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
3. 排查Ansible模板问题
- 检查模板中
server_name的变量逻辑,确保所有站点都渲染双域名:server_name {{ site_domain }} www.{{ site_domain }}; - 查看Ansible生成后的最终配置文件,确认HTML站点的
server_name和证书路径与预期一致,排除模板条件逻辑导致的配置缺失。
4. 测试请求与清理缓存
- 使用
curl -v https://www.example.com查看请求流程,重点检查:- 证书信息是否匹配目标域名;
- 重定向Location是否指向正确的HTTPS站点。
- 清理所有浏览器缓存,避免旧规则干扰测试;使用
openssl s_client -connect www.example.com:443直接测试SSL连接,排查证书链问题。
5. 优化默认服务器块的SSL配置
- 为默认服务器块配置独立的有效SSL证书(如泛域名证书或Let's Encrypt生成的默认证书),避免未匹配的请求复用第一个站点的证书:
server { listen 443 ssl default_server; server_name _; ssl_certificate /path/to/default-fullchain.pem; ssl_certificate_key /path/to/default-privkey.pem; return 444; # 直接关闭未匹配的请求 }
内容的提问来源于stack exchange,提问作者solick
相关产品推荐
相关产品推荐

