nginx實現反向代理負載均衡
Nginx實現反向代理
nginx代理基於是ngx_http_proxy_module模塊的功能,該模塊有很多屬性配置選項,如:
proxy_pass:指定將請求代理至server的URL路徑;
proxy_set_header:將發送至 server的報文的某首部進行重寫
proxy_send_timeout:在連接斷開之前兩次發送到server的最大間隔時長;過了這麽長時間後端還是沒有收到數據,連接會被關閉
proxy_read_timeout:是從後端讀取數據的超時時間,兩次讀取操作的時間間隔如果大於這個值,和後端的連接會被關閉。
proxy_connect_timeout:
proxy_pass配置常見用法有三種:
1、location的/uri將被替換為/newuri,如下:
location /uri {
proxy_pass http://ip:port/newuri;
}
應用場合:頁面很固定的時候(如淘寶雙十一的主界面)
將/mobi 的請求跳轉到新服務器上/mobile目錄下
location /mobi/ {
proxy_pass http://172.16.100. 1/mobile/index.php;
}
應用場合:用於流量的分流,將特定的請求分流道特定的服務器上
2、如果location的URI是通過模式匹配定義的,其URI將直接被傳遞,而不能為其指定轉換的另一個URI。
location ~ ^/mobile {
proxy_pass http://172.16.100.2;
}
3、如果在location中使用的URL重定向,那麽nginx將使用重定向後的URI處理請求,而不再考慮之前定義的URI
location /youxi {
rewrite ^(.*)$ /index.html break;
proxy_pass http://172.16.100.1;
}
proxy_set_header
proxy_set_header可將發送至server的報文的某首部進行重寫;常用於nginx做負載均衡時,獲取客戶端IP時,需要添加forward頭部。
proxy_set_header Host $host;
proxy_set_header X-REMOTE-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
原有請求報文中如果存在X-Forwared-For首部,則將client_addr以逗號
分隔補原有值後,否則則直接添加此首部;
$proxy_add_x_forwarded_for; (從後端的服務器上能看到RS的真實IP)
日誌查看:
"$remote_addr" $host "$http_x_forwarded_for"
nginx負載均衡是ngx_http_upstream_module模塊的功能,需要在配置文件http塊上下文中定義upstream塊,指定一組負載均衡的後端服務器,然後在proxy_pass中引用,就可以反向代理時實現負載均衡了。
語法:server address [parameters];
paramerters:
weight:負載均衡策略權重,默認為1;
max_fails:在一定時間內(這個時間在fail_timeout參數中設置)檢查這個服務器是否可用時產生的最多失敗請求數
fail_timeout:在經歷了max_fails次失敗後,暫停服務的時間。max_fails可以和fail_timeout一起使用,進行對後端服務器的健康狀態檢查;
backup:當所有後端服務器都宕機時,可以指定代理服務器自身作為備份,對外提供維護提示頁面;
down:永久不可用。
upstream塊裏可以用多個server選項配置多個後端服務器,同時還可配置對後端服務器的健康狀態檢查,可以在server後面加上max_file(proxy_next_upstream指定檢查策略,默認為返回超時為失敗)和fail_timeout參數實現;也可以用health_check選項來實現健康檢測可以指定的參數較多,不過需要定義在location上下文中。
另外,可以指定代理服務器自身作為備份server,當所有後端服務器都宕機時,對外提供維護提示頁面。還可以指定負載均衡策略:主要有round_robin(加權輪詢,默認)、
hash、ip_hash、least_conn(最少連接)和least_time(最少響應時間,商業版本),策略定義在upstream上下文即可;
配置文件實例:
在http塊定義upstream: upstream server-cluster { server 172.17.253.107:80 weight=4; server 172.17.253.157:80 weight=4; server 172.17.233.166:80; check interval=3000 rise=2 fall=5 timeout=1000 type=http; check_http_expect_alive http_2XX http_3XX; } upstream static-cluster { server 172.17.250.209:80; server 172.17.254.148:80; check interval=3000 rise=2 fall=5 timeout=1000 type=http; check_http_expect_alive http_2XX http_3XX; } 在server段引用 location ~* .jpg|.png|.gif|.jpeg$ { proxy_pass http://static-cluster; } location ~* .js|.css|.html|.xml$ { proxy_pass http://static-cluster; }
對real-server進行健康檢測
在http段中 upstream basic_server { server 192.168.17.175:80 weight=2; server 192.168.17.176:80 weight=5; check interval=3000 rise=2 fall=5 timeout=2000 type=http; check_http_expect_alive http_2xx http_3xx; } 在server段中 server { location /status { check_status; } }
本文出自 “13126984” 博客,請務必保留此出處http://13136984.blog.51cto.com/13126984/1981416
nginx實現反向代理負載均衡