Nginx serve o site mesmo que server_name não corresponda

3

Esta é a minha configuração nginx (em execução como contêiner do docker, no caso de ser importante):

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;
        }
    }
}

O problema que tenho é que nginx está servindo esse site mesmo para solicitações a outros domínios. Isso é esperado:

$ 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": []
}

Mas isso não é esperado:

$ 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": []
}

Por que isso? Como posso dizer a nginx para não atender solicitações para servidores indefinidos?

    
por dangonfast 05.04.2018 / 14:45

1 resposta

4

nginx sempre tem um servidor padrão. Na ausência de qualquer bloco server explicitamente marcado como default_server , nginx usará o primeiro servidor com uma diretiva listen correspondente.

Você pode definir um bloco server genérico para lidar com qualquer nome de host que não corresponda ao seu valor server_name .

Por exemplo:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    return 444;
}

Naturalmente, os navegadores que se conectam com https irão sempre reclamar sobre o certificado antes que nginx possa processar a solicitação.

Veja este documento para saber mais.

    
por 05.04.2018 / 15:14