nginx應用:使用nginx進行負載平衡

來源:互聯網
上載者:User

這篇文章主要介紹了關於nginx應用:使用nginx進行負載平衡,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下


nginx一般可以用於七層的負載平衡,這篇文章將介紹一些負載平衡的基本知識以及使用nginx進行負載平衡的簡單的例子。

四層負載平衡 vs 七層負載平衡

經常會說七層負載平衡還是四層負載平衡,其實根據ISO的OSI網路模型的所在層的叫法而決定的,nginx因為在使用http協議在應用程式層進行負載平衡的操作,所以被稱為七層負載平衡。而諸如LVS在TCP層進行負載平衡操作的則被稱為四層負載平衡。一般來說,有如下層的負載平衡分類:

類別 OSI模型層 說明
二層負載平衡 MAC層 根據MAC地址進行響應
三層負載平衡 IP層 根據IP地址進行響應
四層負載平衡 TCP層 在IP地址的基礎上結合連接埠號碼進行響應
七層負載平衡 HTTP層 在四層的基礎上,可繼續根據URL/瀏覽器類別等七層的資訊進行進一步的響應

常見軟體的支援

軟體 四層負載平衡 七層負載平衡
nginx 輕量實現 支援http和mail,效能與haproxy相近
haproxy - 支援七層負載平衡
LVS 支援四層負載平衡,實現較重 -
F5 硬體實現,成本高 -

常見的負載平衡演算法

負載平衡常見有如下幾種演算法:

負載平衡演算法 負載平衡演算法(E) nginx支援與否 說明 適用情境
普通輪詢 Round Robin 支援 權重相同的輪詢 適用於外部服務要求和內部伺服器都相對均衡的情境
權重輪詢 Weighted Round Robin 支援(weight) 可以設定不同權重進行輪詢 伺服器的處理能力不同,或則希望進行流量的控制,比如Canary Release
隨機均衡 Random - 隨機分配給伺服器 外部和內部均非常均衡的場合,或者需要隨機的分配的需求較強
權重隨機 Weighted Random - 結合權重隨機分配給伺服器 可結合權重調節隨機策略,更好地適應現實中分布狀況
響應速度 Response Time 支援(fair) 根據伺服器的響應速度進行分配 伺服器效能和伺服器當前健全狀態的結合,此種策略能動態調整狀態,避免能者已經不能的情況下仍然被大量分配作業
最少串連 Least Connection 根據串連的數量進行分配 輪詢做的是分配任務,由於實際情況中無法控制輪訓分配的任務,但是無法確認任務完成的速度,會導致反映真實伺服器負荷的串連數產生不同,適合於長時間提供長串連服務的業務,比如網上的客服的WebSocket的實現,或者FTP/SFTP等服務。
DNS響應 Flash DNS - 根據最快返回的DNS解析結果來繼續請求服務,忽略其他DNS返回的IP地址 適用於具有全域負載平衡的情況下,比如CDN

負載平衡示範執行個體:普通輪詢

接下來使用nginx來示範一下如何進行普通輪詢:

負載平衡演算法 負載平衡演算法(E) nginx支援與否 說明 適用情境
普通輪詢 Round Robin 支援 權重相同的輪詢 適用於外部服務要求和內部伺服器都相對均衡的情境

事前準備

事前在7001/7002兩個連接埠分別啟動兩個服務,用於顯示不同資訊,為了示範方便,使用tornado做了一個鏡像,通過docker容器啟動時傳遞的參數不同用於顯示服務的不同。

[root@kong ~]# docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "User Service 1: 7001"ddba0abd24524d270a782c3fab907f6a35c0ce514eec3159357bded09022ee57[root@kong ~]# docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "User Service 1: 7002"95deadd795e19f675891bfcd44e5ea622c95615a95655d1fd346351eca707951[root@kong ~]# [root@kong ~]# curl http://192.168.163.117:7001Hello, Service :User Service 1: 7001[root@kong ~]# [root@kong ~]# curl http://192.168.163.117:7002Hello, Service :User Service 1: 7002[root@kong ~]#

啟動nginx

[root@kong ~]# docker run -p 9080:80 --name nginx-lb -d nginx 9d53c7e9a45ef93e7848eb3f4e51c2652a49681e83bda6337c89a3cf2f379c74[root@kong ~]# docker ps |grep nginx-lb9d53c7e9a45e        nginx                      "nginx -g 'daemon ..."   11 seconds ago      Up 10 seconds       0.0.0.0:9080->80/tcp                                                 nginx-lb[root@kong ~]#

nginx程式碼片段

準備如下nginx程式碼片段將其添加到nginx的/etc/nginx/conf.d/default.conf中

http {upstream nginx_lb {    server 192.168.163.117:7001;    server 192.168.163.117:7002;}server {    listen       80;    server_name  www.liumiao.cn 192.168.163.117;    location / {        proxy_pass http://nginx_lb;    }}

修改default.conf的方法

可以通過在容器中安裝vim達到效果,也可以在本地修改然後通過docker cp傳入,或者直接sed修改都可。如果在容器中安裝vim,使用如下方式即可

[root@kong ~]# docker exec -it nginx-lb sh# apt-get update...省略# apt-get install vim...省略

修改前

# cat default.confserver {    listen       80;    server_name  localhost;    #charset koi8-r;    #access_log  /var/log/nginx/host.access.log  main;    location / {        root   /usr/share/nginx/html;        index  index.html index.htm;    }    #error_page  404              /404.html;    # redirect server error pages to the static page /50x.html    #    error_page   500 502 503 504  /50x.html;    location = /50x.html {        root   /usr/share/nginx/html;    }    # proxy the PHP scripts to Apache listening on 127.0.0.1:80    #    #location ~ \.php$ {    #    proxy_pass   http://127.0.0.1;    #}    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000    #    #location ~ \.php$ {    #    root           html;    #    fastcgi_pass   127.0.0.1:9000;    #    fastcgi_index  index.php;    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;    #    include        fastcgi_params;    #}    # deny access to .htaccess files, if Apache's document root    # concurs with nginx's one    #    #location ~ /\.ht {    #    deny  all;    #}}#

修改後

# cat default.confupstream nginx_lb {    server 192.168.163.117:7001;    server 192.168.163.117:7002;}server {    listen       80;    server_name  www.liumiao.cn 192.168.163.117;    #charset koi8-r;    #access_log  /var/log/nginx/host.access.log  main;    location / {        #root   /usr/share/nginx/html;        #index  index.html index.htm;        proxy_pass http://nginx_lb;    }    #error_page  404              /404.html;    # redirect server error pages to the static page /50x.html    #    error_page   500 502 503 504  /50x.html;    location = /50x.html {        root   /usr/share/nginx/html;    }    # proxy the PHP scripts to Apache listening on 127.0.0.1:80    #    #location ~ \.php$ {    #    proxy_pass   http://127.0.0.1;    #}    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000    #    #location ~ \.php$ {    #    root           html;    #    fastcgi_pass   127.0.0.1:9000;    #    fastcgi_index  index.php;    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;    #    include        fastcgi_params;    #}    # deny access to .htaccess files, if Apache's document root    # concurs with nginx's one    #    #location ~ /\.ht {    #    deny  all;    #}}#

重啟nginx容器

[root@kong ~]# docker restart nginx-lbnginx-lb[root@kong ~]#

確認結果

可以清晰地看到按照順序,進行輪詢:

[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7001[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7002[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7001[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7002[root@kong ~]#

負載平衡示範執行個體:權重輪詢

而在此基礎上,進行權重輪詢只需要加上weight即可

負載平衡演算法 負載平衡演算法(E) nginx支援與否 說明 適用情境
權重輪詢 Weighted Round Robin 支援(weight) 可以設定不同權重進行輪詢 伺服器的處理能力不同,或則希望進行流量的控制,比如Canary Release

修改default.conf

按照如下修改default.conf

# cp default.conf default.conf.org# vi default.conf# diff default.conf default.conf.org2,3c2,3<     server 192.168.163.117:7001 weight=100;<     server 192.168.163.117:7002 weight=200;--->     server 192.168.163.117:7001;>     server 192.168.163.117:7002;#

重啟nginx容器

[root@kong ~]# docker restart nginx-lbnginx-lb[root@kong ~]#

確認結果

可以看到輪詢結果按照1/3和2/3的比重在進行了:

[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7001[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7002[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7002[root@kong ~]#
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.