配置多子域名NGINX时启动失败,请求排查问题
问题根源与解决方法
你的NGINX启动失败的原因非常明确——错误日志已经直接点明:同一个443端口上存在两个default_server声明,这是NGINX绝对不允许的,每个监听端口只能有一个默认服务器实例。
对照你的配置就能找到问题:
- 处理
www.schandillia.com的server块里写了listen 443 default_server ssl http2; - 处理
graph.schandillia.com的server块里也写了listen 443 default_server ssl http2;
NGINX无法判断无匹配的443请求该交给哪个server块处理,因此直接抛出配置错误。
修复步骤
- 移除子域名server块的
default_server
把第四个server块的监听指令改成下面这样,去掉default_server参数:
listen 443 ssl http2; listen [::]:443 ssl http2;
- 补充SSL证书配置
你的子域名server块完全缺少SSL证书相关配置,这会导致graph.schandillia.com的HTTPS请求直接失败。需要把主域名server块里的证书配置复制过来:
ssl_certificate "/etc/letsencrypt/live/schandillia.com/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/schandillia.com/privkey.pem"; add_header Strict-Transport-Security "max-age=31536000";
修改后的完整子域名server块
# for subdomain graph server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name graph.schandillia.com; # 添加SSL证书配置 ssl_certificate "/etc/letsencrypt/live/schandillia.com/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/schandillia.com/privkey.pem"; add_header Strict-Transport-Security "max-age=31536000"; location / { proxy_pass http://127.0.0.1:9000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
验证与重启
修改完成后,先执行配置校验:
nginx -t
如果输出nginx: configuration file /etc/nginx/nginx.conf test is successful,再重启NGINX服务:
systemctl restart nginx.service
补充说明
default_server的作用是:当NGINX收到的请求没有匹配到任何server_name时,就交给这个标记的server块处理。所以你只需要给主域名(www.schandillia.com)的server块设置这个参数就足够了,子域名的server块只要正确设置server_name,就能精准匹配到对应子域名的请求。
内容的提问来源于stack exchange,提问作者TheLearner




