Nginx的負載均衡

1.upstream模塊

upstream模塊介紹
Nginx的負載均衡功能依賴于ngx_http_upstream_module,所支持的代理方式有proxy_pass,fastcgi_pass,memcached_pass。
upstream模塊例子:

 upstream web_pools{
   server 172.16.10.52:80 weight=1;
   server 172.16.10.53:80 weight=3;
 }

upstream模塊應該放于http{}標簽內
默認算法是wrr輪詢
upstream內部參數說明:

參數 說明
server 172.16.10.52:80 server后面接需要代理的主機,可以不接端口號,默認是80
weight 權重
backup 當所用的RS失效后會啟用它
max_fails=2 最大失敗嘗試次數,建議2-3次
fail_timeout=20 失敗超時時間,默認是10s,常規業務一般設置為2-3秒
down 表示服務不可用,一般配合ip_hash一起使用。
max_conns=number 最大連接數目。
slow_start=time 從不可用轉換至可用的時間。

upstream調度算法:

1,rr輪詢
類似于lvs的rr算法,如果后端服務器宕機(默認只監控80端口,如果后端報包502,404,403,503還是會返回錯誤給用戶。),機器則會自動剔除。
2,weight權重
權重和訪問輪詢成正比,權重越大則轉發請求越多。
配置:
server 192.168.10.10:80 weight=1;
3,ip_hash
每個請求按訪問的ip的hash結果進行分配,只要hash值向同就會把相同的ip地址的請求分配到同一個服務端,該調度算法可以解決session共享問題,但是也有可能使請求分配不均勻,
注意:必須是最前端的服務器,多數情況下不能和weight,bakcup選項一起使用。(session共享問題可以通過設置單獨存儲session的存儲來解決。)
配置:
ip_hash;
4,fair動態算法(三方),
按照后端服務器的響應時間來分配請求,響應時間短的優先分配,比上面算法更加智能的算法,這是Nginx的第三方算法,使用時必須下載upstream_fair模塊。
配置:
fair;
5,url_hash(三方)
按照訪問url的hash結果來分配請求,讓每個url定到相同的服務器,后端服務器為緩存服務器時效果顯著,在upstream加入hash語句,server不能寫入weight等其他參數。
url_hash。按訪問的url hash結果來分配請求,使每個url定向至特定的服務器,可以進一步提高后臺緩存服務器的命中效率,nginx本身不支持這種,必須要安裝nginx的hash軟件包。
配置:
hash $request_url;
hash_method crc32;

2.ngx_http_proxy_module模塊

參數 說明
proxy_pass http://blog_server_pool 指定反向代理服務池
proxy_set_header Host $host 當后端web服務器上有多個虛擬主機時,需要用該header來區分主機名稱。
proxy_set_header X-Real-IP $remote_addr; 如果后端程序需要從用戶獲取IP,從該報文header獲取。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for 獲取連接代理端的IP地址,多級代理中會有多個值,一般最前面的值時客戶端IP地址
client_body_buffer_size 用于指定客戶端,請求主機緩沖區大小,可以理解為先保存至本地,再傳給客戶端。
proxy_connect_timeout 表示和后端服務器連接的超時時間。
proxy_send_timeout 后端服務器數據回傳時間,即在規定時間內,后端必須傳完所有數據,否則斷開連接
proxy_buffer_size 設置緩沖區大小,該緩沖區大小等于proxy_buffer設置的大小。
proxy_buffers 設置緩沖區的數量的大小,nginx從代理的后端服務器獲取的響應信息。

proxy_pass指令,此模塊可以將請求發送至另外一臺服務器,
配置:
location /name/ {
proxy_pass http://127.0.0.1/remote/;
}
proxy_pass參數說明:

參數 說明
proxy_pass http://blog_server_pool 指定反向代理服務池
proxy_set_header Host $host 當后端web服務器上有多個虛擬主機時,需要用該header來區分主機名稱。
proxy_set_header X-Real-IP $remote_addr; 如果后端程序需要從用戶獲取IP,從該報文header獲取。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for 獲取連接代理端的IP地址,多級代理中會有多個值,一般最前面的值時客戶端IP地址
client_body_buffer_size 用于指定客戶端,請求主機緩沖區大小,可以理解為先保存至本地,再傳給客戶端。
proxy_connect_timeout 表示和后端服務器連接的超時時間。
proxy_send_timeout 后端服務器數據回傳時間,即在規定時間內,后端必須傳完所有數據,否則斷開連接
proxy_buffer_size 設置緩沖區大小,該緩沖區大小等于proxy_buffer設置的大小。
proxy_buffers 設置緩沖區的數量的大小,nginx從代理的后端服務器獲取的響應信息。

X-Real-IP和X-Forwarded-For 區別
X-Forwarded-For是一個可疊加的過程,后面的代理會把前面代理的IP加入X-Forwarded-For
X-Real-IP只是個變量會被替換
$remote_addr代表的是他的前面的代理服務器或者客戶端的IP地址。
多重代理要想全面了解流程,需要打印日志下面的幾個參數。
$remote_addr |$http_x_real_ip |$http_x_forwarded_for
下面有幾個案例寫的比較清晰,可以參考理解一下:
https://blog.csdn.net/broadview2006/article/details/54570943
配置例子:

location / {
proxy_pass http://localhost:8000
#判斷請求出錯,會咨詢下一個服務器請求
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504
include proxy.conf;
}
[root@localhost conf]# cat proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

Nginx實現動靜分離

方案一:

根據訪問的url實現動靜分離。

location /static/ {
}
location /dyamic/{
}

方案二:
根據擴展名稱實現動靜分離

location ~ .*\.(css|jpg|png|js|imag)
{
   proxy_pass http://static_pools
}
根據使用客戶端$http_user_agent,跳轉不同試用頁面頁面
IE瀏覽器(MSIE),火狐(Firefox)。
if ($http_user_agent ~* “android”)
{
   proxy_pass http://android_pools
}
if ($http_user_agent ~* “iphone”)
{
   proxy_pass http://iphone_pools
}

參考鏈接:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容