伙计们,
我有一个与Nginx和haproxy虚拟机设置充当一个Web应用程序的负载平衡器,需要维护一个客户端连接后,单个后端的会话粘性。
nginxconfiguration非常标准,但是在下面发布。
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/; } }
这是haproxyconfiguration
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,但是我错过了什么?
首先,如果这是你的整个Nginxconfiguration文件,为什么你麻烦代理两次? 为什么不给HAProxy“公共”知识产权,让它做所有的工作呢?
无论如何,因为你是从 NGginx代理HAProxy的,所有的连接都来自同一个地方(Nginx)。
如果您想基于客户端的 IP进行代理,那么您必须根据您在Nginx中设置的X-Real-IP或X-Forwarded-For标头来告诉HAProxy进行平衡。
如果您使用X-Real-IP则您的新HAProxyconfiguration将如下所示:
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