nginx作为负载均衡器到nginx的webservers

我试图用nginxbuild立一个基于软件的负载平衡器。 在安装心跳和心脏起搏器之前,我已经创build了一个CentOS虚拟机,并在其上安装了nginx(lb-01),它将作为我的负载平衡器。 我还创build了另一个CentOS虚拟机(web-01)作为我的networking服务器。 以上是在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服务器(web-01)正在侦听端口80上的请求。 在该服务器上,我指定了一个default_server来显示主机名,而其他指令则处理服务器上configuration的各个站点。

作为testing,我已经将我的一个域名(abc.example.com)的Alogging指向负载均衡器的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的内容,它不会产生错误,并返回默认站点。

我尝试了谷歌以及nginx的网站,但没有任何运气。

任何指针将不胜感激。

谢谢!

如果您的后端正在使用虚拟主机,并且要求主机头包含网站的实际主机名,则需要将其添加到您的负载平衡器位置:

 proxy_set_header Host $host; 

这会将客户端发送给负载均衡器的任何Host:头部转发到后端。 这个确切的场景logging在nginx维基上 。