Nginx将未指定的stream量路由到一个看似任意的子域

问题

我有一个服务于3个子域的nginx服务器,比如a.example.comb.example.comc.example.com

configuration文件分别是a.example.com.confb.example.com.confc.example.com.conf 。 它们存储在/etc/nginx/sites-available /etc/nginx/sites-enabled并从/etc/nginx/sites-enabled软链接。

在configuration文件中,每个server子句都有相应的server_name指令。 如果重要的话,所有三个子域名都使用Let's Encrypt使用相同的SSL证书问题 (工作正常)。

b.example.com.confsites-enabled删除时,我希望在尝试浏览到它时出现错误消息。 令人惊讶的是,nginx将stream量redirect到a.example.com 。 实际上, /etc/nginx/sites-enabled/etc/nginx/sites-enabled (包括机器IP)的每个传入连接都没有匹配的服务器名称,将被路由到a.example.com

如何configurationnginx来使server指令独占,这样对b.example.com请求永远不会被a.example.com

组态

a.example.com.conf

 server { listen 443 ssl; server_name a.example.com; ssl_certificate /etc/letsencrypt/live/a.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem; location / { proxy_pass http://localhost:8080; } } 

b.example.com.conf

 server { listen 443 ssl; server_name b.example.com; # I'm using a multi-domain certificate called `a.example.com`, which is # serving a.example.com, b.example.com and c.example.com - not an error ssl_certificate /etc/letsencrypt/live/a.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem; location / { proxy_pass http://localhost:8090; } } 

临时解决scheme

我创build了一个默认的服务器来捕获所有的默认请求,并返回错误404。但是,我想有一个更全面的解决scheme来防止来自另一台服务器服务器的请求。

 server { listen 443 default_server; server_name _; return 404; ssl_certificate /etc/letsencrypt/live/a.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem; } 

从nginx 文档 :

在这个configuration中,nginx只testing请求的头部字段“主机”,以确定请求应该被路由到哪个服务器。 如果它的值不匹配任何服务器名称,或者请求根本不包含这个头域,那么nginx会将请求路由到这个端口的默认服务器。 在上面的configuration中,默认服务器是第一个 – 这是nginx的标准默认行为

所以你的临时解决scheme似乎是正确的解决scheme。