各位朋友,
我有一个装有 nginx 和 haproxy 的虚拟机,用作 Web 应用程序的负载均衡器,一旦客户端建立连接,该应用程序就需要保持与单个后端的会话粘性。
nginx 配置非常标准,但发布在下面。
upstream haproxy {
server 127.0.0.1:5000;
}
server {
listen 192.168.1.10:443 ssl;
server_name foo.bar.com;
## Compression
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 4;
gzip_http_version 1.0;
gzip_min_length 1280;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss application/javascript text/javascript image/x-icon image/bmp;
gzip_vary on;
tcp_nodelay on;
tcp_nopush on;
sendfile off;
access_log /var/log/nginx/foo.bar.com_access.log main;
error_log /var/log/nginx/foo.bar.com_error.log warn;
location / {
#proxy_read_timeout 30; #to allow for large reports
proxy_connect_timeout 10;
proxy_send_timeout 75;
proxy_read_timeout 180;
proxy_buffering off;
#proxy_buffer_size 128k;
#proxy_buffers 4 256k;
#proxy_busy_buffers_size 256k;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://haproxy;
}
error_page 502 502 = /maintenance.html;
location = /maintenance.html {
root /www/;
}
}
这是 haproxy 配置
backend webapp
balance source
hash-type consistent
mode http
server arwen.bar.com 192.168.1.50:8080 check port 8080
server beren.bar.com 192.168.1.53:8080 check port 8080
server boromir.bar.com 192.168.1.55:8080 check port 8080
server isildur.bar.com 192.168.1.62:8080 check port 8080
然而,当我查看统计数据时,我只看到一台后端服务器正在处理所有传入连接,这与负载平衡的目的背道而驰。我以为我已经根据文档正确设置了 haproxy,但我错过了什么?
答案1
首先,如果这就是你的整个 Nginx 配置文件,那你为什么要费心进行两次代理呢?为什么不直接给 HAProxy 一个“公共”IP 并让它完成所有工作呢?
无论如何,由于您正在代理 HAProxy从NGginx,所有的连接都来自同一个地方(Nginx)。
如果你想基于客户的IP,那么你必须告诉 HAProxy 根据你在 Nginx 中设置的X-Real-IP
或标头进行平衡。X-Forwarded-For
如果您使用以下命令,您的新 HAProxy 配置将如下所示X-Real-IP
:
backend webapp
balance hdr(X-Real-IP)
hash-type consistent
mode http
server arwen.bar.com 192.168.1.50:8080 check port 8080
server beren.bar.com 192.168.1.53:8080 check port 8080
server boromir.bar.com 192.168.1.55:8080 check port 8080
server isildur.bar.com 192.168.1.62:8080 check port 8080