使用nginx实现负载均衡

Posted 粽先生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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

 

 

以上是关于使用nginx实现负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

使用Nginx实现负载均衡

Nginx实现负载均衡

几种Nginx实现负载均衡的方式

Nginx 实现负载均衡

nginx--❤️图解及代码实现正向代理反向代理及负载均衡(非常实用,建议收藏❤️)

利用nginx实现负载均衡