我正在使用Nginx作为反向代理。它作为Swarm集群中的容器化服务运行。
前一段时间,我发现了这种奇怪的行为,并且试图将其包裹住。
在主机上,我设置了三个子域:
one.domain.com
two.domain.com
three.domain.com
在我的Nginx服务器配置中,我指定的目标server_name是three.domain.com,因此我希望Nginx仅响应针对该子域的请求。
events { worker_connections 1024; }
http {
upstream service {
server node:3000;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name three.domain.com;
[...... ssl settings here.......]
location / {
proxy_pass http://service;
proxy_set_header Host $host;
}
}
}
会发生什么,而不是仅响应发送到three.domain.com的请求,它还会响应one.domain.com和two.domain.com。 (它将它们路由到three.domain.com)
如果我添加多个专门针对子域1和2的服务器块,它会按预期工作,将请求路由到它们所属的地方。
话虽如此,理想的行为是仅响应服务器块的server_name部分中列出的子域。
答案 0 :(得分:0)
Nginx测试请求的标头字段“主机”(如果使用https,则为SNI主机名),以确定应将请求路由到哪个服务器。如果其值与任何服务器名称都不匹配,或者请求根本不包含此标头字段,则nginx会将请求路由到该端口的默认服务器。在上述配置中,默认服务器是第一个(也是唯一一个),这是nginx的标准默认行为。如果有多个server
块,还可以使用listen指令中的default_server
参数明确设置默认服务器。
因此,您需要添加另一个server
块:
server {
listen 443 ssl default_server;
server_name default.example.net;
...
return 444;
}