nginx反向代理實現負載均衡與負載均衡策略

一、nginx反向代理實現負載均衡

Nginx可以配置代理多臺服務器,當一臺服務器宕機之後,仍能保持系統可用(我現在是通過ip + 端口號進行學習)。

用Nginx做反向代理和負載均衡非常簡單,支持兩種用法:一個是proxy、另外一種是upstream,分別用來做反向代理和負載均衡。
流程也很簡單:

1 先客戶端發起請求到Nginx,Nginx會解析你請求地址是否需要轉發到其他地方處理
2 如果需要則通過proxy_pass進行轉發到相對應處理到地址。(處理的地址可能是不同的服務器、或者其他服務)
3 最後進行完成返回結果

具體配置過程如下:

1. 在http節點下,添加upstream節點。

    #第一個集羣
    upstream test1.com{
        server  47.106.139.191:8082 weight=100;
        server  47.106.139.191:8083 weight=200; 
        }   

2.將server節點下的location節點中的proxy_pass配置爲:http:// + upstream名稱,即“http://test1.com”.

    #符合gif後綴結尾的都會被分流到test1.com中
    location ~* \.(gif)$ {
            proxy_pass http://test1.com;
    }
  • 備註:我們默認的只是開通了服務器的80端口,8082,8083(我用的是阿里雲服務器,事先需要開啓防火牆)還沒有開通呢,所以下面羅列出http和server服務的代碼
http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #添加訪問日誌記錄
    access_log  logs/access_80.log;
    sendfile        on; 
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65; 

    #gzip  on;
    #第一個集羣
    upstream test1.com{
        server  47.106.139.191:8082 weight=100;
        server  47.106.139.191:8083 weight=200; 
        }   

    #第二個集羣
    upstream test2.com{
        server 47.106.139.191:8084;
        }   

    #第三個集羣
    upstream test3.com{
        server  47.106.139.191:8085;
        }   

    server {
        listen       80; 
        server_name  sunjunxiain.top;

        location / {
            root   html;
            index  index.html index.htm;
        }
        #第一集羣
        location ~* \.(gif)$ {
                proxy_pass http://test1.com;
        }
        #第二集羣
        location ~* \.(png)$ {
                proxy_pass http://test2.com;
        }
        #第三集羣
        location ~* \.(jpg)$ {
                proxy_pass http://test3.com;
        }
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    server {
        listen       8082;
        listen       8083;
        server_name  sunjunxian.top;

        location / {
            root   html;
            index  index.html index.htm;
        }
        access_log  logs/access_82_83.log;
    }

    server {
         listen       8084;
         listen       8085;
         server_name  sunjunxian.top;

         location / {
             root   html;
             index  index.html index.htm;
         }
         access_log  logs/access_84_85.log;
     }
}

二、負載均衡的幾種常用方式

1、輪詢(默認)

每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。

#第一個集羣
upstream test1.com{
    server  47.106.139.191;
    server  47.106.139.192; 
    }   

2、weight(權重)

指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的
情況。

upstream test1.com{
        server  47.106.139.191:8082 weight=100;
        server  47.106.139.191:8083 weight=200; 
        }   

3、ip_hash

權重方式存在一個問題,在負載均衡系統中,假如用戶在某臺服務器上登錄了,那麼該用戶第二次請求的時候,因爲我們是負載均衡系統,每次請求都會重新定位到服務器集羣中的某一個,那麼已經登錄某一個服務器的用戶再重新定位到另一個服務器,其登錄信息將會丟失,這樣顯然是不妥的。
我們可以採用ip_hash指令解決這個問題,如果客戶已經訪問了某個服務器,當用戶再次訪問時,會將該請求通過哈希算法,自動定位到該服務器。
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。

upstream test1.com{
        ip_hash;
        server  47.106.139.191:8082;
        server  47.106.139.191:8083; 
        } 

4、fair(第三方)

upstream test1.com{
    server  47.106.139.191;
    server  47.106.139.192; 
    fair;
    }   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章