nginx simplesmente recusa o endereço IP já definido na diretiva catch-all

1

Eu tenho esse resumo:

    server {
        listen 80 default_server;
        server_name _;
        return 444;
    }

Agora, digamos que temos dois IPs chamados 1.2.3.4 e 1.2.3.5 .

Bem, digamos que 1.2.3.4 seja usado em example.com e 1.2.3.5 nunca seja usado em nenhum lugar do arquivo de configuração. Basicamente, apenas o primeiro IP está em uso. Outro IP está em branco / vazio / livre.

Ok, aqui está o problema. Um bloco de servidores acima está funcionando com 1.2.3.5 . Porque esse IP nunca é usado com qualquer bloco de servidor. É de graça. Atribuído ao servidor. Responde. Mas nunca usado para qualquer site. A diretiva listen 80; funciona apenas para 1.2.3.5 .

Por outro lado, 1.2.3.4 não está funcionando. Nginx não escuta esse IP. Porque é usado pelo bloco do servidor da mãe. eu me testei. Indded, Nginx se recusa a ouvir este Ips que estão em uso pelo bloco de servidor ngnix

Agora, se eu alterar listen 80; para listen 1.2.3.4:80 , então eu estou trabalhando para esse IP.

Basicamente, novamente Nginx do não permite-me ouvir o endereço IP usado por padrão.

Eu só quero pegar todos os domínios falsos que chegam ao meu servidor que não são pertencem para mim. Quero desabilitar usuários por host falso. Mas eu realmente preciso escrever cada IP para ouvir?

Existe alguma solução alternativa? Alguma ajuda?

EDIT 1 : Eu também tentei listen *:80; , que tem curinga. Não funcionou também.

EDIT 2 : Se eu remover todos os IPs da diretiva de escuta e deixar apenas as portas, ele funciona. Mas não colocamos endereços IP em diretivas de escuta? Exemplos de Nginx sempre mostram apenas portas em escuta. Eu duvido qual deles está correto. ip: porta ou apenas porta.

Demonstração :

Obras :

Diferente de example.com é rejeitado com erro 444.

server {
        listen 1.2.3.4:80 default_server;
        server_name _;
        return 444;
    }
 server {
        listen 1.2.3.4:80;
        server_name example.com;
        root /www
    }

Não funciona :

Ainda aceita hosts falsos que não sejam example.com

server {
        listen 80 default_server;
        server_name _;
        return 444;
    }
 server {
        listen 1.2.3.4:80;
        server_name example.com;
        root /www
    }

Conclusão :

Após os comentários de Nathan, eu entro nessa questão e encontrei esta linha:

The default_server parameter, if present, will cause the server to become the default server for the specified address:port pair.

Basicamente, como disse Nathan, ele terá o IP mais alto e esse bloco de servidores só estará disponível nesse nível. Para conseguir isso, você tem que sepcify cada IP. Então, temos duas opções.

  1. Use listen 80; directive e parâmetro e você pode definir um servidor padrão para a porta 80
  2. Use listen ip:80 e defina cada endereço do servidor padrão próprio .

Outro ótimo slogan:

In this configuration, nginx first tests the IP address and port of the request against the listen directives of the server blocks. It then tests the “Host” header field of the request against the server_name entries of the server blocks that matched the IP address and port. If the server name is not found, the request will be processed by the default server. For example, a request for www.example.com received on the 192.168.1.1:80 port will be handled by the default server of the 192.168.1.1:80 port, i.e., by the first server, since there is no www.example.com defined for this port.

    
por xangr 22.05.2013 / 16:38

1 resposta

3

Normalmente, os aplicativos se atribuem ao endereço IP disponível "mais alto" no sistema. Esse comportamento é visto com mais frequência em IPs IPv6, mas o conceito é o mesmo. Se você especificar ambos em blocos de servidores, ele deve funcionar bem.

    
por 22.05.2013 / 17:59

Tags