我正在尝试使用 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 上有记录。