Nginx

nginx 作為 nginx 網路伺服器的負載均衡器

  • June 9, 2015

我正在嘗試使用 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 上

引用自:https://serverfault.com/questions/249679