使用nginx實現負載均衡


===============================================

 2018/11/11_第1次修改                       ccb_warlock

 

===============================================

 之前查過負載均衡的相關資料,由於資金所限無法直接買負載均衡來玩,但是又不了解大廠是怎么實現負載均衡方案。后來了解到nginx可以實現簡單的負載均衡,就針對功能進行了試驗。

 


 一、前提條件
- 環境中已經部署了docker swarm(http://www.cnblogs.com/straycats/p/8978135.html)
- 最好也部署了portainer(http://www.cnblogs.com/straycats/p/8978201.html)
- 部署nginx容器的服務器IP:192.168.12.7
- 業務服務器IP:192.168.13.1、192.168.13.2、192.168.13.3
- 默認swarm創建了network:my-net

 


 二、創建nginx容器

 2.1 創建目錄

mkdir -p /usr/docker-vol/nginx/conf/conf.d

 

 2.2 編輯nginx.conf

vi /usr/docker-vol/nginx/conf/nginx.conf

 # 添加下面的內容到nginx.conf中,wq保存。

user nginx;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  65;

    sendfile on;
    tcp_nopush     on;
    gzip  on;
    gzip_disable "msie6";
}

 

 2.3 編輯www.conf

vi /usr/docker-vol/nginx/conf/conf.d/www.conf

 # 添加下面的內容到nginx配置文件內,wq保存。

upstream abtest{
    # 設置負載的權重比為1:1:2(即將本服務器1/4的請求轉到13.1的8080端口,1/4的請求轉到13.1的7777端口,1/2的請求轉到13.2的8080端口,13.3當前不會收到請求,13.4在其他3個server忙的時候才會收到請求)
    server 192.168.13.1:8080 weight=1;
    server 192.168.13.1:7777 weight=1;# 也支持偽集群的負載均衡
    server 192.168.13.2:8080 weight=2;
    server 192.168.13.3:8080 weight=3 down;# down表示該服務器當前不進行負載
    server 192.168.13.4:8080 weight=3 backup;# down表示該服務器當前不進行負載
}

server {
    listen 80; 

    access_log  off;
    error_log   off;

    location = /abc.txt {
        proxy_pass http://abtest/abc.txt;

        client_max_body_size   10m;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

 

 2.4 啟動容器

 # 登錄protainer,將下面的內容添加到一個新的棧vedi-stack中,wq保存。

version: '3.6'
services:

  nginx:
    image: nginx:1.14.0-alpine
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /usr/docker-vol/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /usr/docker-vol/nginx/conf/conf.d:/etc/nginx/conf.d
    deploy:
      replicas: 1
      restart_policy:
        condition: any
      resources:
        limits:
          cpus: "1"
          memory: 500M
      update_config:
        parallelism: 1
        delay: 5s
        monitor: 10s
        max_failure_ratio: 0.1
        order: start-first
    ports:
      - 80:80
    networks:
      - my-net

networks:
  my-net:
    external: true

 

由於nginx做了負載均衡,訪問http://192.168.12.7/abc.txt會負載到http://192.168.13.1:8080/abc.txt、http://192.168.13.1:7777/abc.txt、http://192.168.13.2:8080/abc.txt

 

 

PS.這里特別說明,upstream在做負載均衡時不支持靈活配置端口,所以不能寫成下面的格式:

upstream abtest{
    server 192.168.13.1 weight=1;
    server 192.168.13.2 weight=2;
    server 192.168.13.3 weight=3 down;
    server 192.168.13.4 weight=3 backup;
}

server {
    listen 80; 

    access_log  off;
    error_log   off;

    location = /abc.txt {
        proxy_pass http://abtest:8080/abc.txt;

        client_max_body_size   10m;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

 

如果寫成上面的格式,nginx的啟動后會提示異常:

nginx: [emerg] upstream "abtest" may not have port 8080 in /etc/nginx/conf.d/www.conf:14

 


 參考資料:

 1.https://www.cnblogs.com/ChoviWu/p/9004725.html
 2.https://www.cnblogs.com/zhoading/p/8036205.html
 3.https://www.cnblogs.com/wzjhoutai/p/6932007.html

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM