Nginx 配置upstream实现负载均衡

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fivehundredyearsago/article/details/85776385

测试环境部署的jenkins部署的,在一台机器中部署了,现在要需要增加一个部署一台机器;我们在jenkins的项目中部署脚本中再部署一个项目;

部署思想:打时间差,就是先后部署这两台机器,控制好时间,保证有一台机器可以使用;我在jenkins在部署的时候,用了一个sleep 100  来启动间隔,间隔是100秒,100秒后台,重新启动第二台服务器;

服务器1  : 192.168.1.101:8090

服务器2  : 192.168.1.102:8090

废话不多说,直接上配置文件  test.conf (配置文件直接上)

upstream adminProxy{
      server 192.168.1.101:8090 weight=2  max_fails=3  fail_timeout=100s;
      server 192.168.1.102:8090 weight=2  max_fails=3  fail_timeout=100s;
   }


server {
    listen 80;
    server_name dev.manage.com;
    root /home/work/app;
    index index.html;
    location /system  {
        proxy_pass http://adminProxy;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_next_upstream http_502 http_504 error timeout invalid_header; 
    }
}

max_fails = 3 fail_timeout=100s  表示 ${fail_timeout}(100秒)时间内出现${max-fails}(3次)次失败,就会把这个机器状态置为down(下线),就是失败$(fail_timeout)(100秒)时间后,会重新尝试启用这服务器;

这样就配置好一个两台服务器负载均衡的配置了;

但是这还是不够的;因为这样的话,一个服务器要被请求3次才会被下线,也就是说,会有3次错误的请求;返回502或者是error;

所以我们还要启用proxy_next_upstream 功能: 在服务器返回502,504,错误,超时 的时候;允许转发到其他服务器;

proxy_next_upstream http_502 http_504 error timeout invalid_header; 
启用该功能需要在nginx.conf中添加 
proxy_next_upstream on
注:就是在部署这两台服务器的时候,最好能够和这边nginx配置的服务器失败重试时间一致;这样nginx失败转发就不会出错,用户也会无感知;

附上怎么在jenkins中部署代码到另外一台机器上:

步骤: 1、两台服务器添加信任(ssh的互相信赖,这样在远程copy文件执行脚本的时候就不用密码连接,不知道的可以百度)

           2、把jenkins编译好的文件远程copy到第二台服务器中

           3、用jenkins远程调用启动脚本

直接上脚本:

jenkins 部署脚本:sleep 100

scp  ./admin/target/admin.jar  root@192.168.1.101:/home/work/name/admin.jar

ssh root@192.168.1.101 "/home/work/name/start-jar.sh"
注:这个脚本是在启动第一台服务器(192.168.1.102)的时候执行,先停顿100s 在第一台服务器(192.168.1.102)启动完成后,再重新启动第二台服务器(129.168.1.101);

scp是把本地文件拷贝到远程服务器中,然后用 ssh 远程执行start-jar.sh  脚本

在第二台服务器中的start-jar.sh 脚本

pid=`ps -ef | grep admin.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
#!kill -9 强制终止
   echo "kill -9 的pid:" $pid
   kill -9 $pid
fi

cd /home/work/name

nohup java -jar admin.jar --server.port=8090  --spring.profiles.active=test >/dev/null &

 

1、轮询(weight) 
  指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。默认当weight不指定时,各服务器weight相同,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream bakend {
    server 192.168.1.10 weight=1;
    server 192.168.1.11 weight=2;
}

2、ip_hash 
  每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题。如果后端服务器down掉,要手工down掉。

upstream resinserver{
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

3、fair(第三方插件) 
  按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream resinserver{
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    fair;
}

4、url_hash(第三方插件) 
  按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器时比较有效。 
  在upstream中加入hash语句,hash_method是使用的hash算法。

upstream resinserver{
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    hash $request_uri;
    hash_method crc32;
}

设备的状态有: 
(1)down:表示单前的server暂时不参与负载 
(2)weight:权重,默认为1, weight越大,负载的权重就越大。 
(3)max_fails:允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。 
(4)fail_timeout:max_fails次失败后,暂停的时间。 
(5)backup:备用服务器, 其它所有的非backup机器down或者忙的时候,请求backup机器,所以这台机器压力会最轻。

 

每一个请求按訪问ip的hash结果分配。这样每一个訪客固定訪问一个后端服务器,能够解决session的问题。

events {
    worker_connections  1024;
}


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

    sendfile        on;

    keepalive_timeout  65;

    #manage统一入口配置 分别指向101 102 103三台服务器
    upstream manageserver { 
        ip_hash; #配置IP负载
        server 10.10.10.101:8090; 
        server 10.10.10.102:8090; 
        server 10.10.10.103:8090; 
    }

    server{ 
        listen 8099; 
        #server_name http://10.10.10.100:8099; 
        server_name localhost;
        
        location / { 
            proxy_pass http://manageserver; 
            proxy_set_header Host $host; 
            proxy_set_header X-Real-IP $remote_addr; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        } 
    }    

    server {
        listen       8090;
        server_name  localhost;

        location / {
            root  /home/name/name/name;
            index  index.html index.htm;
        }

        location /manage {
            proxy_cookie_path  /manage  /;
            proxy_pass   http://127.0.0.1:8091/manage;
        }
    }

}

展开阅读全文

没有更多推荐了,返回首页