nginx 作为 nginx 网络服务器的负载均衡器

nginx 作为 nginx 网络服务器的负载均衡器

我正在尝试使用 nginx 设置基于软件的负载均衡器。在安装 heartbeat 和 pacemaker 之前,我创建了一个 CentOS 虚拟机并在其上安装了 nginx (lb-01),它将用作我的负载均衡器。我还创建了另一个 CentOS 虚拟机 (web-01),它将用作我的 Web 服务器。以上是在 LB 级别或 Web 级别向其添加更多资源之前启动并运行某些东西的最简单方法。

在负载均衡器上我将 nginx 设置如下:

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

网络服务器 (web-01) 正在监听端口 80 上的请求。在该服务器上,我指定了 default_server 以仅显示主机名,而其他指令则处理服务器上配置的各种站点。

作为测试,我已将我的一个域 (abc.example.com) 的 A 记录指向负载均衡器 IP 地址。这个想法是,请求将发送到负载均衡器,它将被传递到 web-01,后者会将其指向正确的域,然后它将被提供服务,数据将返回给客户端。

因此,当我尝试加载 abc.example.com 时,我会在负载均衡器的日志中看到:

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" "-" "-"

查看 Web 服务器 (web-01) 的日志,我发现如下错误:

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"

浏览器显示主机的名称(如前所述,这是服务器上的默认站点)。

网站本身不会从负载平衡器传递到 Web 服务器 (web-01),因此无法正确返回内容。因此,Web 服务器不会返回 abc.example.com 的内容,而是会产生未找到错误并返回默认网站。

我尝试过 Google 以及 nginx 的网站,但没有任何结果。

任何指点都将不胜感激。

谢谢你!

答案1

如果您的后端使用虚拟主机并需要 Host 标头包含站点的实际主机名,则需要将其添加到您的负载均衡器位置:

proxy_set_header Host $host;

这会将客户端发送给负载均衡器的任何 Host: 标头转发到后端。此确切场景是nginx wiki 上有记录

相关内容