Como posso garantir que o NGINX não irá servir o site errado?

1

Para ajudar a explicar o meu problema, deixe-me criar um formato análogo, mas fictício história de fundo.

Digamos que eu tenha uma amiga, Sarah, que viva por meio de uma webcam. E digamos que essa fonte de renda esteja apoiando Lisa, de 4 anos, de Sarah.

Eu conheci Sarah porque ela me contratou para escrever para ela um site personalizado de webcam para adultos. Ela também me apresentou a pré-escola de Lisa, que também tem me contratou para escrever o site deles.

Para economizar dinheiro, eu hospedo os dois sites usando o mesmo servidor, por meio do Nginx.

Eu animadamente notifico a escola sobre todo o progresso que eu fiz em suas local na rede Internet! O que eu não poderia saber é que o meu processo de nó que estava servindo lisas-preschool.com estava inativo.

Depois de um telefonema estranho, descubro que às vezes o Nginx exibe o conteúdo errado para o site visitado.

Isso obviamente não pode acontecer, NUNCA! Então, como posso ter certeza de que sarahs-site.com e lisas-preschool.com nunca serão atendidos?

Para referência, veja as configurações dos sites:

lisas-preschool.com:

Este é um site node.js:

upstream lisas_preschool {
    server 127.0.0.1:3000;
}

# HTTP Server
server {
    listen 0.0.0.0:80;
    server_name www.lisas-preschool.com lisas-preschool.com;
    access_log /var/log/nginx/lisas-preschool.access;

    location / { 

        proxy_pass              http://lisas-preschool.com;
        proxy_http_version      1.1;

        proxy_redirect          off;
        proxy_buffering         off;

        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Upgrade         $http_upgrade;
        proxy_set_header        Connection      "upgrade";
        proxy_set_header        X-Forward-Proto http;
        proxy_set_header        X-Nginx-Proxy   true;

    }   
}

sarahs-site.com

Este é um site do wordpress:

server {
    listen 80;
    listen [::]:80;
    server_name sarahs-site.com www.sarahs-site.com;

    index index.php index.html index.htm;
    root /var/www/sarahs-site.com/html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /var/www/site-b.com/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

}
    
por James M. Lay 25.06.2015 / 03:19

2 respostas

2

O modo mais seguro de lidar com essa situação é garantir que um site só será exibido se esse nome de host for especificamente solicitado. A única situação em que um site pode ser servido quando outro é solicitado é quando o Nginx não pode (por algum motivo) encontrar o site solicitado e, em vez disso, exibe o padrão. O padrão será o primeiro server definido ou o server especificado como padrão.

Ao definir um bloco server padrão que é seguro em todas as circunstâncias (como no exemplo abaixo), você pode ter certeza de que será exibido no pior cenário possível.

server {
    listen 80 default_server;
    server_name _;

    return 444;
}

server {
    listen 80;
    server_name example1.com;
}

server {
    listen 80;
    server_name example2.com;
}

Se estiver usando SSL, certifique-se de ter um bloco server padrão para SSL (seja um separado ou o mesmo que o não SSL). Você também pode adicionar à separação tendo endereços IP dedicados diferentes para os dois sites.

    
por 25.06.2015 / 04:28
3

Você está usando um formato diferente para as diretivas listen nos blocos ´server '. Isso significa que os hosts virtuais recebem soquetes de escuta diferentes para si mesmos e, para algumas combinações de protocolos / interfaces, você pode obter resultados inesperados para a solicitação.

Recomendamos que você use listen 80; nos dois hosts virtuais, para que o nginx escute a porta 80 nos dois soquetes IPv4 e IPv6. Ou, se você deseja apenas soquetes IPv4, use listen 0.0.0.0:80; .

Além disso, eu faria um servidor padrão que desconecte todas as solicitações para qualquer outro host virtual diretamente:

server {
    listen 80 default_server;
    return 444;
}
    
por 25.06.2015 / 03:35

Tags