nginx como balanceador de carga para servidores web nginx

1

Estou tentando configurar um balanceador de carga baseado em software com o nginx. Antes de instalar o heartbeat e o pacemaker, criei uma máquina virtual do CentOS e instalei o nginx nele (lb-01), que servirá como meu balanceador de carga. Eu também criei outra máquina virtual do CentOS (web-01) que servirá como meu servidor web. A descrição acima é a maneira mais simples de ter algo em funcionamento antes de adicionar mais recursos a ele no nível de LB ou no nível da Web.

No balanceador de carga, tenho a configuração nginx como:

user                            nginx nginx;
worker_processes                4;
worker_rlimit_nofile            16384;
pid                             /var/run/nginx.pid;

events {
    worker_connections          4096;
}

http {
    include                     mime.types;
    access_log                  /var/log/nginx/access.log main;
    error_log                   /var/log/nginx/error.log  error;

    sendfile                    on;
    ignore_invalid_headers      on;
    reset_timedout_connection   on;
    tcp_nopush                  on;
    tcp_nodelay                 on;
    keepalive_timeout           60;
    keepalive_requests          500;
    send_timeout                30;

    client_body_buffer_size     256k;
    large_client_header_buffers 16 8k;
    client_body_timeout         30;
    client_max_body_size        10m;
    client_header_timeout       30;

    gzip                        on;
    gzip_disable                "MSIE [1-6]\.(?!.*SV1)";

    upstream webservers {
        server 192.168.173.129;
    }

    server {
        listen                  80 default_server;
        location / {
            proxy_pass          http://webservers;
            proxy_set_header    X-Real-IP $remote_addr;
            proxy_next_upstream timeout;
        }
    }
}

O servidor web (web-01) está escutando na porta 80 por solicitações. Nesse servidor eu especifiquei um default_server para apenas mostrar o nome do host, enquanto outras diretivas processam vários sites configurados no servidor.

Como teste, apontei o registro de um dos meus domínios (abc.example.com) para o endereço IP do balanceador de carga. A idéia é que o pedido vá para o balanceador de carga, ele será passado para a web-01, que irá apontá-lo para o domínio correto e, em seguida, será exibido e os dados serão devolvidos ao cliente.

Então, quando tento carregar abc.example.com, vejo nos registros do balanceador de carga:

173.86.99.33 - - [20/Mar/2011:22:08:17 -0400] GET / HTTP/1.1 "304" 0 "-" "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.151 Safari/534.16" "-" "-"
173.86.99.33 - - [20/Mar/2011:22:08:18 -0400] GET /favicon.ico HTTP/1.1 "404" 201 "-" "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.151 Safari/534.16" "-" "-"

e olhando para os logs do servidor web (web-01) eu vejo erros como os abaixo:

2011/03/20 22:17:04 [error] 3657#0: *3917 open() "/var/www/_local/favicon.ico" failed (2: No such file or directory), client: 192.168.173.125, server: chromium.niden.net, request: "GET /favicon.ico HTTP/1.0", host: "webservers"
2011/03/20 22:17:04 [error] 3657#0: *3917 open() "/var/www/_local/404.html" failed (2: No such file or directory), client: 192.168.173.125, server: chromium.niden.net, request: "GET /favicon.ico HTTP/1.0", host: "webservers"

O navegador mostra o nome do host (que é o site padrão no servidor, como mencionado anteriormente).

O site em si não é passado do balanceador de carga para o servidor da Web (web-01), portanto, o conteúdo não pode ser retornado corretamente. Portanto, em vez de o servidor da Web retornar o conteúdo de abc.example.com, ele produz erros não encontrados e retorna o site padrão.

Eu tentei o Google, bem como o site do nginx, mas não tive sorte.

Qualquer ponteiro seria mais do que apreciado.

Obrigado!

    
por Nikolaos Dimopoulos 21.03.2011 / 03:21

1 resposta

4

Se o seu back-end estiver usando um host virtual e exigir que o cabeçalho do host contenha o nome do host real do site, você precisará adicioná-lo ao seu local do balanceador de carga:

proxy_set_header Host $host;

Isso encaminhará qualquer cabeçalho Host: o cliente enviado ao balanceador de carga para o back-end. Este cenário exato é documentado no wiki nginx .

    
por 21.03.2011 / 05:21