问题
我有一个 nginx 服务器,服务于 3 个子域名 - 比如说a.example.com
,,b.example.com
和c.example.com
。
配置文件分别为a.example.com.conf
、b.example.com.conf
和c.example.com.conf
。它们存储在中,/etc/nginx/sites-available
并从中进行软链接/etc/nginx/sites-enabled
。
在配置文件中,每个server
子句都有其相应的server_name
指令。如果重要的话,所有三个子域都使用相同的Let's Encrypt 的 SSL 证书问题(效果很好)。
当b.example.com.conf
从 中删除时sites-enabled
,我试图浏览它时会收到一条错误消息。令人惊讶的是,nginx 将流量重定向到a.example.com
。事实上,没有匹配的服务器名称的每个传入连接/etc/nginx/sites-enabled
(包括仅包含机器 IP)都会路由到a.example.com
。
如何配置 nginx 以使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;
}
}
临时解决方案
我已经创建了一个默认服务器,它可以捕获所有默认请求并返回错误 404。但是,我希望有一个更全面的解决方案,可以阻止由另一台服务器提供服务的任何给定服务器的请求。
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;
}
答案1
来自 nginx文档:
在此配置中,nginx 仅测试请求的标头字段“Host”,以确定应将请求路由到哪个服务器。 如果其值与任何服务器名称都不匹配,或者请求根本不包含此标头字段,则 nginx 会将请求路由到此端口的默认服务器。 在上述配置中,默认服务器是第一个 —这是 nginx 的标准默认行为。
因此您的临时解决方案似乎是正确的解决方案。