nginx 作為 nginx 網路伺服器的負載均衡器
我正在嘗試使用 nginx 設置基於軟體的負載均衡器。在安裝heartbeat 和pacemaker 之前,我創建了一個CentOS 虛擬機並在其上安裝了nginx(lb-01),它將作為我的負載均衡器。我還創建了另一個 CentOS 虛擬機 (web-01),它將作為我的網路伺服器。以上是在 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 的網站,但沒有任何運氣。
任何指針都將不勝感激。
謝謝!
如果您的後端使用虛擬主機並要求 Host 標頭包含站點的實際主機名,則需要將其添加到負載均衡器位置:
proxy_set_header Host $host;
這會將客戶端發送到負載均衡器的任何 Host: 標頭轉發到後端。這個確切的場景記錄在 nginx wiki 上。