- Nginx 負載均衡基礎知識
nginx 的 upstream 目前支持 4 種方式的分配
1)、輪詢(默認)
每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器 down 掉,能自動剔除。
2)、weight
指定輪詢幾率,weight 和訪問比率成正比,用于后端服務器性能不均的情況。
3)、ip_hash
每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決 session 的問題。
4)、fair(第三方)
按后端服務器的響應時間來分配請求,響應時間短的優先分配。
5)、url_hash(第三方)
- Nginx 負載均衡實例 1
upstream bbs.linuxtone.org { #定義負載均衡設備的 Ip 及設備狀態
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用負載均衡的 server 中增加
proxy_pass http://bbs.linuxtone.org/;
每個設備的狀態設置為:
a) down 表示當前的 server 暫時不參與負載
b) weight 默認為 1.weight 越大,負載的權重就越大。
c) max_fails : 允許請求失敗的次數默認為 1.當超過最大次數時, 返回proxy_next_upstream 模塊定義的錯誤
d) fail_timeout:max_fails 次失敗后,暫停的時間。
e) backup: 其它所有的非 backup 機器 down 或者忙的時候,請求 backup 機器。所以這臺機器壓力會最輕。
nginx 支持同時設置多組的負載均衡,用來給不用的 server 來使用。
client_body_in_file_only 設置為On 可以將client post過來的數據記錄到文件中用來做debug
client_body_temp_path 設置記錄文件的目錄 可以設置最多 3 層目錄
location 對 URL 進行匹配.可以進行重定向或者進行新的代理 負載均衡
- Nginx 負載均衡實例 2
按訪問 url 的 hash 結果來分配請求,使每個 url 定向到同一個后端服務器,后端服務器為緩存時比較有效,也可以用作提高 Squid 緩存命中率.
簡單的負載均衡實例:
#vi nginx.conf //nginx 主配置文件核心配置
……….
#loadblance my.linuxtone.org
upstream my.linuxtone.org {
ip_hash;
server 127.0.0.1:8080;
server 192.168.169.136:8080;
server 219.101.75.138:8080;
server 192.168.169.117;
server 192.168.169.118;
server 192.168.169.119;
}
…………..
include vhosts/linuxtone_lb.conf;
………
#vi linuxtone_lb.conf
server
{
listen 80;
server_name my.linuxtone.org;
index index.php;
root /data/www/wwwroot/mylinuxtone;
if (-f $request_filename) {
break;
}
if (-f $request_filename /index.php) {
rewrite (.*) $1/index.php break;
}
error_page 403 http://my.linuxtone.org/member.php?m=user&a=login;
location / {
if ( !-e $request_filename) {
proxy_pass http://my.linuxtone.org;
break;
}
include /usr/local/nginx/conf/proxy.conf;
}
}
使用負載均衡的話,可以修改配置http節點如下:
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
#設定mime類型,類型由mime.type文件定義
include /etc/nginx/mime.types;
default_type application/octet-stream;
#設定日志格式
access_log /var/log/nginx/access.log;
#省略上文有的一些配置節點
#。。。。。。。。。。
#設定負載均衡的服務器列表
upstream mysvr {
#weigth參數表示權值,權值越高被分配到的幾率越大
server 192.168.8.1x:3128 weight=5;
#本機上的Squid開啟3128端口,不是必須要squid
server 192.168.8.2x:80 weight=1;
server 192.168.8.3x:80 weight=6;
}
upstream mysvr2 {
#weigth參數表示權值,權值越高被分配到的幾率越大
server 192.168.8.x:80 weight=1;
server 192.168.8.x:80 weight=6;
}
#第一個虛擬服務器
server {
#偵聽192.168.8.x的80端口
listen 80;
server_name 192.168.8.x;
#對aspx后綴的進行負載均衡請求
location ~ .*\.aspx$ {
#定義服務器的默認網站根目錄位置
root /root;
#定義首頁索引文件的名稱
index index.php index.html index.htm;
#請求轉向mysvr 定義的服務器列表
proxy_pass http://mysvr ;
#以下是一些反向代理的配置可刪除.
proxy_redirect off;
#后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#允許客戶端請求的最大單文件字節數
client_max_body_size 10m;
#緩沖區代理緩沖用戶端請求的最大字節數,
client_body_buffer_size 128k;
#nginx跟后端服務器連接超時時間(代理連接超時)
proxy_connect_timeout 90;
#連接成功后,后端服務器響應時間(代理接收超時)
proxy_read_timeout 90;
#設置代理服務器(nginx)保存用戶頭信息的緩沖區大小
proxy_buffer_size 4k;
#proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設置
proxy_buffers 4 32k;
#高負荷下緩沖大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#設定緩存文件夾大小,大于這個值,將從upstream服務器傳
proxy_temp_file_write_size 64k;
}
}
}
Nginx代理服務的配置說明
1、上一篇中我們在http模塊中有下面的配置,當代理遇到狀態碼為404時,我們把404頁面導向百度。
error_page 404 https://www.baidu.com; #錯誤頁
然而這個配置,細心的朋友可以發現他并沒有起作用。
如果我們想讓他起作用,我們必須配合著下面的配置一起使用
proxy_intercept_errors on; #如果被代理服務器返回的狀態碼為400或者大于400,設置的error_page配置起作用。默認為off。
2、如果我們的代理只允許接受get,post請求方法的一種
proxy_method get; #支持客戶端的請求方法。post/get;
3、設置支持的http協議版本
proxy_http_version 1.0 ; #Nginx服務器提供代理服務的http協議版本1.0,1.1,默認設置為1.0版本
4、如果你的nginx服務器給2臺web服務器做代理,負載均衡算法采用輪詢,那么當你的一臺機器web程序iis關閉,也就是說web不能訪問,那么nginx服務器分發請求還是會給這臺不能訪問的web服務器,如果這里的響應連接時間過長,就會導致客戶端的頁面一直在等待響應,對用戶來說體驗就打打折扣,這里我們怎么避免這樣的情況發生呢。這里我配張圖來說明下問題。
如果負載均衡中其中web2發生這樣的情況,nginx首先會去web1請求,但是nginx在配置不當的情況下會繼續分發請求web2,然后等待web2響應,直到我們的響應時間超時,才會把請求重新分發給web1,這里的響應時間如果過長,用戶等待的時間就會越長。
下面的配置是解決方案之一。
proxy_connect_timeout 1; #nginx服務器與被代理的服務器建立連接的超時時間,默認60秒
proxy_read_timeout 1; #nginx服務器向被代理服務器組發出read請求后,等待響應的超時間,默認為60秒。
proxy_send_timeout 1; #nginx服務器向被代理服務器組發出write請求后,等待響應的超時間,默認為60秒。
proxy_ignore_client_abort on; #客戶端斷網時,nginx服務器是否終端對被代理服務器的請求。默認為off。
5、如果使用upstream指令配置啦一組服務器作為被代理服務器,服務器中的訪問算法遵循配置的負載均衡規則,同時可以使用該指令配置在發生哪些異常情況時,將請求順次交由下一組服務器處理。
proxy_next_upstream timeout; #反向代理upstream中設置的服務器組,出現故障時,被代理服務器返回的狀態值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
error:建立連接或向被代理的服務器發送請求或讀取響應信息時服務器發生錯誤。
timeout:建立連接,想被代理服務器發送請求或讀取響應信息時服務器發生超時。
invalid_header:被代理服務器返回的響應頭異常。
off:無法將請求分發給被代理的服務器。
http_400,....:被代理服務器返回的狀態碼為400,500,502,等。
6、如果你想通過http獲取客戶的真實ip而不是獲取代理服務器的ip地址,那么要做如下的設置。
proxy_set_header Host $host; #只要用戶在瀏覽器中訪問的域名綁定了 VIP VIP 下面有RS;則就用$host ;host是訪問URL中的域名和端口 www.taobao.com:80
proxy_set_header X-Real-IP $remote_addr; #把源IP 【$remote_addr,建立HTTP連接header里面的信息】賦值給X-Real-IP;這樣在代碼中 $X-Real-IP來獲取源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 作為代理服務器時,設置的IP列表,會把經過的機器ip,代理機器ip都記錄下來,用 【,】隔開;代碼中用 echo $x-forwarded-for |awk -F, '{print $1}' 來作為源IP
7、下面是我的一個關于代理配置的配置文件部分,僅供參考。
include mime.types; #文件擴展名與文件類型映射表
default_type application/octet-stream; #默認文件類型,默認為text/plain
#access_log off; #取消服務日志
log_format myFormat ' $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
access_log log/access.log myFormat; #combined為日志格式的默認值
sendfile on; #允許sendfile方式傳輸文件,默認為off,可以在http塊,server塊,location塊。
sendfile_max_chunk 100k; #每個進程每次調用傳輸數量不能大于設定的值,默認為0,即不設上限。
keepalive_timeout 65; #連接超時時間,默認為75s,可以在http,server,location塊。
proxy_connect_timeout 1; #nginx服務器與被代理的服務器建立連接的超時時間,默認60秒
proxy_read_timeout 1; #nginx服務器想被代理服務器組發出read請求后,等待響應的超時間,默認為60秒。
proxy_send_timeout 1; #nginx服務器想被代理服務器組發出write請求后,等待響應的超時間,默認為60秒。
proxy_http_version 1.0 ; #Nginx服務器提供代理服務的http協議版本1.0,1.1,默認設置為1.0版本。
#proxy_method get; #支持客戶端的請求方法。post/get;
proxy_ignore_client_abort on; #客戶端斷網時,nginx服務器是否終端對被代理服務器的請求。默認為off。
proxy_ignore_headers "Expires" "Set-Cookie"; #Nginx服務器不處理設置的http相應投中的頭域,這里空格隔開可以設置多個。
proxy_intercept_errors on; #如果被代理服務器返回的狀態碼為400或者大于400,設置的error_page配置起作用。默認為off。
proxy_headers_hash_max_size 1024; #存放http報文頭的哈希表容量上限,默認為512個字符。
proxy_headers_hash_bucket_size 128; #nginx服務器申請存放http報文頭的哈希表容量大小。默認為64個字符。
proxy_next_upstream timeout; #反向代理upstream中設置的服務器組,出現故障時,被代理服務器返回的狀態值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
#proxy_ssl_session_reuse on; 默認為on,如果我們在錯誤日志中發現“SSL3_GET_FINSHED:digest check failed”的情況時,可以將該指令設置為off。