即使 server_name 不匹配,Nginx 也会为站点提供服务

blu*_*ast 11 nginx ubuntu docker

这是我的nginx配置(作为 docker 容器运行,以防万一):

events {
    worker_connections 4096;  ## Default: 1024
}

http {
    server {
        server_name registry.mydomain;
        listen 80;
        listen 443 ssl;
        client_max_body_size 0;  # Disables checking, to avoid "request entity too large"
        ssl_certificate /etc/nginx/certs/registry.crt;
        ssl_certificate_key /etc/nginx/certs/registry.key;

        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://registry:5000;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,nginx即使是对其他域的请求,它也在为该站点提供服务。这是预期的:

$ http http://registry.mydomain/v2/_catalog?n=100
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 20
Content-Type: application/json; charset=utf-8
Date: Thu, 05 Apr 2018 12:43:21 GMT
Docker-Distribution-Api-Version: registry/2.0
Server: nginx/1.13.11
X-Content-Type-Options: nosniff

{
    "repositories": []
}
Run Code Online (Sandbox Code Playgroud)

但这不是预期的:

$ http http://localhost/v2/_catalog?n=100
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 20
Content-Type: application/json; charset=utf-8
Date: Thu, 05 Apr 2018 12:39:57 GMT
Docker-Distribution-Api-Version: registry/2.0
Server: nginx/1.13.11
X-Content-Type-Options: nosniff

{
    "repositories": []
}
Run Code Online (Sandbox Code Playgroud)

这是为什么?我怎么知道nginx不向未定义的服务器提供请求?

Ric*_*ith 14

nginx总是有一个默认服务器。在没有server明确标记为的任何块的情况下default_servernginx将使用具有匹配listen指令的第一个服务器。

您可以定义一个 catch-allserver块来处理任何与您的server_name值不匹配的主机名。

例如:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    return 444;
}
Run Code Online (Sandbox Code Playgroud)

当然,在连接浏览器https总是抱怨证书前nginx可以处理该请求。

有关更多信息,请参阅此文档