You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

配置多子域名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块处理,因此直接抛出配置错误。

修复步骤

  1. 移除子域名server块的default_server
    把第四个server块的监听指令改成下面这样,去掉default_server参数:
listen 443 ssl http2;
listen [::]:443 ssl http2;
  1. 补充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

火山引擎 最新活动