1. 程式人生 > >nginx 反向代理實現負載均衡*配置實戰

nginx 反向代理實現負載均衡*配置實戰

ans alt tex 實戰 http請求 mono oct 理論 ons

(接理論篇)

查看lb01的配置文件如下:
cat /usr/local/nginx/conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream www_server_pools {     #默認調度算法wrr,即權重輪詢算法
#雖然定義的www服務器池但是這個服務器池也可以作為BBS等業務的服務器池。因為nginx負載均衡轉發不轉發http頭部的url.
無法做location匹配,只能默認訪問第一個 server
192.168.50.163:80 weight=1; server 192.168.50.164:80 weight=1; } server { listen 80; server_name www.wk.com; location / { proxy_pass http://www_server_pools;
#通過proxy_pass功能把用過戶的請求交給上面反向代理upstream定義的www_server_pools服務器池處理。
} } }

#這種反向代理因為無法轉發url所以無法代理多虛擬主機節點服務器

反向代理多虛擬主機節點服務器

反向代理向下面節點重新發起請求時,默認並沒有在請求頭裏告訴節點服務器要找哪臺虛擬主機,所以,Web節點服務器接收到請求後發現沒有主機頭信息,因此,就把節點服務器的第一個虛擬主機發給了反向代理了(節點上第一個虛擬主機放置的是故意這樣放置的bbs)。解決這個問題的方法,就是當反向代理向後重新發起請求時,要攜帶主機頭信息,以明確告訴節點服務器要找哪個虛擬主機。具體的配置在Nginx代理www服務虛擬主機配置裏增加如下一行配置:

proxy_set_header host $host;

在代理向後端服務器發送的http請求頭中加入host字段信息後,若後端服務器配置有多個虛擬主機,它就可以識別代理的是哪個虛擬主機。這是節點服務器多虛擬主機時的關鍵配置。整個Nginx代理配置為:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream www_server_pools {
    server 192.168.50.163:80 weight=1;
    server 192.168.50.164:80 weight=1;
}
    server {
        listen       80;
        server_name  www.wk.com;
        location / {
        proxy_pass http://www_server_pools;
        proxy_set_header host $host;      #在代理向後端服務器發送的http請求頭中加入host字段信息,
用於當後端服務器配置有多個虛擬主機時,可以識別代理的是哪個虛擬主機。這是節點服務器多虛擬主機時的關鍵配置。 } } }

此時,再重新加載Nginx服務就可已根據域名匹配到不同的虛擬主機

經過反向代理後的節點服務器記錄用戶IP

節點服務器對應的WWW虛擬主機的訪問日誌的第一個字段記錄的並不是客戶端的IP,而是反向代理服務器的IP,最後一個字段也是“-”!

技術分享圖片

由上圖可見 access.log日誌記錄的客戶端IP為nginx反向代理的IP

解決虛擬主機的訪問日誌的第一個字段記錄的不是客戶端的IP增加如下一行參數:

proxy_set_header X-Forwarded-For $remote_addr;
#這是反向代理時,節點服務器獲取用戶真實IP的必要功能配置

在反向代理請求後端節點服務器的請求頭中增加獲取的客戶端IP的字段信息,然後節點後端可以通過程序或者相關的配置接收X-Forwarded-For傳過來的用戶真實IP的信息。

解決上述問題的整個Nginx代理配置為:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream www_server_pools {
    server 192.168.50.163:80 weight=1;
    server 192.168.50.164:80 weight=1;
}
    server {
        listen       80;
        server_name  www.wk.com;
        location / {
        proxy_pass http://www_server_pools;
        proxy_set_header host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
#在代理向後端服務器發送的http請求頭中加入X-Forwarded-For字段信息,用於後端服務器程序,
日誌等接收記錄真實用戶的IP,而不是代理服務器的IP } } }

重新加載Nginx反向代理服務:

/usr/local/nginx/sbin/nginx -s reload

節點服務器需要的訪問日誌如果要記錄用戶的真實IP,還必須進行日誌格式配置,這樣才能把代理傳過來的X-Forwarded-For頭信息記錄下來,具體配置為:

#註意:這裏是客戶端Web01的配置

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    log_format main ‘$remote_addr-$remote_user[$time_local]"$request"‘
    ‘$status $body_bytes_sent "$http_referer"‘
    ‘"$http_user_agent""$http_x_forwarded_for";
#就是這裏的“$http_x_forwarded_for”參數,如果希望在第一行顯示,可以替換掉第一行的$remote_addr變量。
    server {
        listen       80;
        server_name  bbs.wk.com;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
    access_log logs/access_bbs.log main;
    }
    server {
        listen       80;
        server_name  www.wk.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
    access_log logs/access_www.log main;
    }
}

技術分享圖片

頭部為代理IP 尾部為客戶IP 一般直接把 頭部參數模塊換掉

Nginx反向代理重要參數 解釋說明
proxy_ pass http://server_ pools; 通過proxy_pass功能把用戶的請求轉向到反向代理定義的upstream服務器池
proxy_ set_ header Host $host; 在代理向後端服務器發送的http請求頭中加人host字段信息,用於當 後端服務器配置有多個虛擬主機時,可以識別代理的是哪個虛擬主機。這是節點服務器多虛擬主機時的關鍵配置
proxy_ set_ header X-Forwarded-For Sremote_ addr ; 在代理向後端服務器發送的http請求頭中加人X-Forwarded-For字段信息,用於後端服務器程序、日誌等接收記錄真實用戶的IP,而不是代理 服務器的IP。這是反向代理時,節點服務器獲取用戶真實IP的必要功能配置

與反向代理配置相關的更多參數說明

除了具有多虛擬主機代理以及節點服務器記錄真實用戶IP的功能外,Nginx軟件還提供了相當多的作為反向代理和後端節點服務器對話的相關控制參數,具體見前面proxy模塊時提供的圖表。

由於參數眾多,最好把這些參數放到一個配置文件裏,然後用include方式包含到虛擬主機配置裏,效果如下:

vim /usr/local/nginx/conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream www_server_pools {
    server 192.168.50.163:80 weight=1;
    server 192.168.50.164:80 weight=1;
    }
    server {
        listen       80;
        server_name  www.wk.com;
        location / {
        proxy_pass http://www_server_pools;
        include proxy.conf;         #這就是包含的配置,具體配置內容見下文
        }
    }
}


cat proxy.conf
proxy_set_header host $host; proxy_set_header x
-forwarded-for $remote_addr; proxy_connect_timeout 60; proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k;

更多Nginx反向代理參數說明
http://nginx.org/en/docs/http/ngx_http_proxy_module.html

技術分享圖片

nginx 反向代理實現負載均衡*配置實戰