常常會說七層負載平衡還是四層負載平衡,其實是根據ISO的OSI網路模型的所在層的叫法而決定的,nginx因為在使用http協定在應用層進行負載平衡的操作,所以稱為七層負載平衡。而諸如LVS在TCP層進行負載平衡操作的則稱為四層負載平衡。一般來說,有以下層的負載平衡分類:
負載平衡演算法 | #負載平衡演算法(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.org
2,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 ~]#
相關建議:
nginx管理設定最佳化
Nginx反向代理websocket配置實例