Nginx--負載均衡配置

  1. Nginx 負載均衡基礎知識
    nginx 的 upstream 目前支持 4 種方式的分配
    1)、輪詢(默認)
    每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器 down 掉,能自動剔除。
    2)、weight
    指定輪詢幾率,weight 和訪問比率成正比,用于后端服務器性能不均的情況。
    3)、ip_hash
    每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決 session 的問題。
    4)、fair(第三方)
    按后端服務器的響應時間來分配請求,響應時間短的優先分配。
    5)、url_hash(第三方)
  1. 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 進行匹配.可以進行重定向或者進行新的代理 負載均衡

  1. 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服務器,如果這里的響應連接時間過長,就會導致客戶端的頁面一直在等待響應,對用戶來說體驗就打打折扣,這里我們怎么避免這樣的情況發生呢。這里我配張圖來說明下問題。

image

如果負載均衡中其中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。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容