Tira www com o NGINX atrás do AWS ELB

2

Estou tentando remover o URL de URLs do meu pedido, mas quando adiciono o seguinte à minha configuração do nginx, minha verificação de integridade do AWS ELB falha.

server {
    listen 80;
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

Alguma ideia do que poderia estar causando o problema? Este é o resto da minha configuração:

server {

    listen 80;

    server_name .example.com;
    root /var/www/static;
    index index.html;

    try_files $uri.html $uri $uri/ =404;

    charset UTF-8;

    error_log /var/log/error.log;
    access_log /var/log/access.log;

    # ELB test route
    location /test {
        add_header X-Robots-Tag noindex;
        default_type text/plain; 
        return 200 'success';
    }

    # Redirect any request http request that come from AWS ELB to https
    if ($http_x_forwarded_proto = "http") {
        return 301 https://$server_name$request_uri;
    }
}

Aqui está a configuração da minha Verificação de saúde:

    
por jwerre 05.04.2017 / 04:15

2 respostas

2

Dos documentos da Amazon :

To ensure that your load balancer can scale properly, verify that each subnet for your load balancer has a CIDR block with at least a /27 bitmask (for example, 10.0.0.0/27) and has at least 8 free IP addresses. Your load balancer uses these IP addresses to establish connections with the instances.

Isso faz parecer que a verificação de integridade do ELB é feita por meio do IP privado da AWS em vez do nome do domínio. Pelo que sei da Amazon, é assim que eles preferem fazer as coisas quando podem (por óbvias razões de desempenho, sem necessidade de pesquisa de DNS, podem ser manipulados por roteadores mais próximos, etc.)

Se for esse o caso, o cabeçalho do host (a menos que esteja em branco, não tenho 100% de certeza de como os cabeçalhos de host funcionam quando você faz uma solicitação a um IP simples) será o endereço privado da AWS da instância do EC2 (Estou assumindo que é EC2) executando o servidor web. Isso afeta a maneira como o Nginx escolhe qual servidor virtual deve manipular a solicitação.

Como o Nginx possui dois blocos server , ele precisa decidir qual deles recebe qualquer solicitação. O processo pelo qual ele escolhe os blocos de servidor (detalhes aqui ) é o seguinte:

  • Primeiro, procura servidores que atendem na porta em que a solicitação chegou. Nesse caso, os dois servidores estão ouvindo na mesma porta, portanto, isso não ajuda em nada.

  • Em seguida, ele olha para o cabeçalho do host da solicitação e procura por servidores com um server_name que corresponda ao cabeçalho do host. Nesse caso, nenhum deles corresponderá, porque o cabeçalho do host é o IP privado da AWS atribuído à instância (ou em branco, como eu disse, não tenho certeza).

  • Finalmente, se nenhum dos dois produzir uma correspondência, apenas será usado com qualquer servidor que seja o padrão. Na ausência de uma declaração padrão explícita, o servidor que é definido primeiro na configuração do site é escolhido como o padrão.

Se o seu servidor de redirecionamento vem antes da configuração do servidor principal (como eu imagino que faz), então este é provavelmente o seu problema. Você precisa fazer uma das três coisas:

  • Especifique que você deseja que o outro servidor (o servidor principal) seja o padrão adicionando default_server à diretiva listen , ou seja, listen 80 default_server;

  • Mude o bloco location /test para o outro bloco de servidor ou

  • Inverte a ordem em que os blocos do servidor estão definidos.

A primeira opção parece ser o caminho a seguir, pois faz sentido que a diretiva default_server seja explícita em vez de implícita, e faz sentido que o servidor principal seja o padrão e não o que você tinha servidor de redirecionamento de tarefas.

Se eu estiver correto em minha hipótese, isso deve resolvê-lo.

    
por 05.04.2017 / 06:54
0

Posso aconselhar os seguidores da experiência da configuração I / F do AWS ELB

  1. Definir localização / {} bloquear
  2. É melhor usar location = / test {} para bloquear exatamente a correspondência de URL
  3. É melhor usar o bloco especial server_name _ e gravar location = / test {}.

ref:
link


server {

    listen 80;

    # changed for 1. "anonymous server" (without Host: header) will accept request.
    server_name _ .example.com;
    root /var/www/static;
    index index.html;

    try_files $uri.html $uri $uri/ =404;

    charset UTF-8;

    error_log /var/log/error.log;
    access_log /var/log/access.log;


    # changed for 1. defined location / {} for default behavior
    location / {
        try_files $uri $uri/ =404;
    }
    # ELB test route
    # changed for 2. exactly match only /test request
    location = /test {
        add_header X-Robots-Tag noindex;
        default_type text/plain; 
        return 200 'success';
    }

    # Redirect any request http request that come from AWS ELB to https
    if ($http_x_forwarded_proto = "http") {
        return 301 https://$server_name$request_uri;
    }
}
    
por 05.04.2017 / 07:35