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