Nginx-负载均衡-不停机部署

  1. 构建SpringBoot项目(nginx-slb : https://gitee.com/liamgmy/nginx-slb)
    1. 项目动态变量配置文件(ArticleConfiguration)
      package club.limeyu.ngixnslb.conf;
      
      import lombok.Getter;
      import lombok.Setter;
      import org.springframework.boot.context.properties.ConfigurationProperties;
      import org.springframework.stereotype.Component;
      
      /**
       * @Author liangmy
       * @Description:
       * @Create: 2021/1/22 下午1:19
       */
      @Getter
      @Setter
      @Component
      @ConfigurationProperties(prefix = "article")
      public class ArticleConfiguration {
      
          private String whoIam;
      
      }
      

       

    2. 项目动态变量配置文件(application.properties)
      server.port=8080
      
      article.who-iam=I am Coke

       

    3. 识别服务接口(HelloController)
      package club.limeyu.ngixnslb.controller;
      
      import club.limeyu.ngixnslb.conf.ArticleConfiguration;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      /**
       * @Author liangmy
       * @Description:
       * @Create: 2021/1/22 下午1:16
       */
      @RestController
      @RequestMapping(value = "/hello")
      public class HelloController {
      
          @Autowired
          private ArticleConfiguration articleConfiguration;
      
          @GetMapping(value = "/whoIam")
          public String whoIam() {
              return articleConfiguration.getWhoIam();
          }
      }
      

       

    4. 测试项目
  2. 推送nginx-slb项目到git远程仓库
  3. 服务器环境配置
    1. 克隆nginx-slb项目到服务器
      [www@10-255-20-89 ~]$ cd /home/www/src
      [www@10-255-20-89 src]$ git clone git@gitee.com:liamgmy/nginx-slb.git

       

    2. 配置线上环境 - 主服务 - 配置文件(application.properties)
      [www@10-255-20-89 ~]$ cd /home/www/deploy_files/slbA
      [www@10-255-20-89 slbA]$ vim application.properties
      
      server.port=8080
      server.context-path=/nginx/slb
      
      article.who-iam=I am Coke

       

    3. 配置线上环境 - 副服务 - 配置文件(application.properties)
      [www@10-255-20-89 ~]$ cd /home/www/deploy_files/slbB
      [www@10-255-20-89 slbB]$ vim application.properties
      
      server.port=8081
      server.context-path=/nginx/slb
      
      article.who-iam=I am Flower

       

    4. 配置线上环境 - 主服务 - 部署脚本
      [www@10-255-20-89 ~]$ cd /home/www/script
      [www@10-255-20-89 script]$ vim deploy_slbA 
      
      
      #!/bin/bash
      DEPLOY_DIR=/home/www/jars/slbA
      SRC_DIR=/home/www/src/nginx-slb
      PROPERTIES_FILE_DIR=/home/www/deploy_files
      
      SLB_RES_DIR=src/main/resources
      
      SLB_JAR=nginx-slb-1.0.0.jar
      
      JARS=($SLB_JAR)
      
      
      cd $SRC_DIR
      
      git reset --hard
      
      git pull
      
      printf "pull code from git complete ....................\n"
      
      git log -1
      
      cp -fv $PROPERTIES_FILE_DIR/slbA/* $SLB_RES_DIR
      
      mvn clean package -Dmaven.test.skip=true
      
      cp -av target/$SLB_JAR  $DEPLOY_DIR/
      
      printf "copy jars complete ....................\n"
      
      cd $DEPLOY_DIR
      
      port=8080
      
      while(($port<=8080))
      do
          netstat -tlnp | awk -F '[ :/]' '$1=="tcp"&&$17=="'${port}'" {print $51}' | xargs kill -9
          printf "kill %s process complete....................\n" ${port}
          let "port++"
      done
      
      
      for jar in ${JARS[@]}
      do
          nohup java -Duser.language=en -Duser.country=DE -jar $jar &
      done

       

    5. 配置线上环境 - 副服务 - 部署脚本
      [www@10-255-20-89 ~]$ cd /home/www/script
      [www@10-255-20-89 script]$ vim deploy_slbB 
      
      
      
      #!/bin/bash
      DEPLOY_DIR=/home/www/jars/slbB
      SRC_DIR=/home/www/src/nginx-slb
      PROPERTIES_FILE_DIR=/home/www/deploy_files
      
      SLB_RES_DIR=src/main/resources
      
      SLB_JAR=nginx-slb-1.0.0.jar
      
      JARS=($SLB_JAR)
      
      
      cd $SRC_DIR
      
      git reset --hard
      
      git pull
      
      printf "pull code from git complete ....................\n"
      
      git log -1
      
      cp -fv $PROPERTIES_FILE_DIR/slbB/* $SLB_RES_DIR
      
      mvn clean package -Dmaven.test.skip=true
      
      cp -av target/$SLB_JAR  $DEPLOY_DIR/
      
      printf "copy jars complete ....................\n"
      
      cd $DEPLOY_DIR
      
      port=8081
      
      while(($port<=8081))
      do
          netstat -tlnp | awk -F '[ :/]' '$1=="tcp"&&$17=="'${port}'" {print $51}' | xargs kill -9
          printf "kill %s process complete....................\n" ${port}
          let "port++"
      done
      
      
      for jar in ${JARS[@]}
      do
          nohup java -Duser.language=en -Duser.country=DE -jar $jar &
      done

       

    6. 配置线上环境 - 日志
      [www@10-255-20-89 ~]$ cd /home/www/deploy_files/slbA
      [www@10-255-20-89 slbA] vim logback.xml
      
      [www@10-255-20-89 ~]$ cd /home/www/deploy_files/slbB
      [www@10-255-20-89 slbB] vim logback.xml
      
      
      <configuration>
          <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
              <file>/home/www/log/das/nginx-slb.log</file>
              <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                  <fileNamePattern>/home/www/log/das/nginx-slb-%d{yyyy-MM-dd}.log</fileNamePattern>
                  <maxHistory>90</maxHistory>
              </rollingPolicy>
              <encoder>
                  <pattern> %red(%d{HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{5}) - %cyan(%msg%n)</pattern>
              </encoder>
          </appender>
      
          <root level="INFO">
              <appender-ref ref="FILE"/>
          </root>
      </configuration>

       

  4. 配置Nginx负载均衡
    www@10-255-20-89 ~]$ sudo vim /etc/nginx/nginx.conf
    
    
    user www;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   3000;
        types_hash_max_size 2048;
    
        include             /etc/nginx/mime.types;
        default_type        application/octet-stream;
    
        charset utf-8;
    
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
        # Load modular configuration files from the /etc/nginx/conf.d directory.
        # See http://nginx.org/en/docs/ngx_core_module.html#include
        # for more information.
        include /etc/nginx/conf.d/*.conf;
    
    
        # 启用OCSP订书机功能
        ssl_stapling on;
        ssl_stapling_verify on;
    
    
        server {
            server_name  nginxslb.autox3.cn;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            #后端平台管理系统接口
            location ^~ /nginx/slb/ {
                proxy_pass http://127.0.0.1:8080/nginx/slb/;
            }
    
    
            listen 443 ssl; # managed by Certbot
            ssl_certificate /etc/letsencrypt/live/nginxslb.autox3.cn/fullchain.pem; # managed by Certbot
            ssl_certificate_key /etc/letsencrypt/live/nginxslb.autox3.cn/privkey.pem; # managed by Certbot
            include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
            ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
        }
    
    
    
        server {
            if ($host = nginxslb.autox3.cn) {
                return 301 https://$host$request_uri;
            } # managed by Certbot
    
    
            server_name  nginxslb.autox3.cn;
            listen 80;
            return 404; # managed by Certbot
        }
    }
    
    1. 轮询
      1. 默认轮询
            upstream OrdinaryPolling {
                server 127.0.0.1:8080;
                server 127.0.0.1:8081;
            }
        
        
            server {
                server_name  nginxslb.autox3.cn;
        
                # Load configuration files for the default server block.
                include /etc/nginx/default.d/*.conf;
        
                #后端平台管理系统接口
                location ^~ /nginx/slb/ {
                    # proxy_pass http://127.0.0.1:8080/nginx/slb/;
                    proxy_pass http://OrdinaryPolling
                }
        
        
                listen 443 ssl; # managed by Certbot
                ssl_certificate /etc/letsencrypt/live/nginxslb.autox3.cn/fullchain.pem; # managed by Certbot
                ssl_certificate_key /etc/letsencrypt/live/nginxslb.autox3.cn/privkey.pem; # managed by Certbot
                include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
                ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
            }
        

         

      2. 权重轮询
            upstream WeightPolling {
                server 127.0.0.1:8080 weight=2;
                server 127.0.0.1:8081 weight=1;
            }
        
        
            server {
                server_name  nginxslb.autox3.cn;
        
                # Load configuration files for the default server block.
                include /etc/nginx/default.d/*.conf;
        
                #后端平台管理系统接口
                location ^~ /nginx/slb/ {
                    # proxy_pass http://127.0.0.1:8080/nginx/slb/;
                    proxy_pass http://WeightPolling;
                }
        
        
                listen 443 ssl; # managed by Certbot
                ssl_certificate /etc/letsencrypt/live/nginxslb.autox3.cn/fullchain.pem; # managed by Certbot
                ssl_certificate_key /etc/letsencrypt/live/nginxslb.autox3.cn/privkey.pem; # managed by Certbot
                include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
                ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
            }
        

         

    2. hash
      1. ip_hash
            upstream IpHashPolling {
                server 127.0.0.1:8080;
                server 127.0.0.1:8081;
                ip_hash;
            }
        
        
            server {
                server_name  nginxslb.autox3.cn;
        
                # Load configuration files for the default server block.
                include /etc/nginx/default.d/*.conf;
        
                #后端平台管理系统接口
                location ^~ /nginx/slb/ {
                    # proxy_pass http://127.0.0.1:8080/nginx/slb/;
                    proxy_pass http://IpHashPolling;
                }
        
        
                listen 443 ssl; # managed by Certbot
                ssl_certificate /etc/letsencrypt/live/nginxslb.autox3.cn/fullchain.pem; # managed by Certbot
                ssl_certificate_key /etc/letsencrypt/live/nginxslb.autox3.cn/privkey.pem; # managed by Certbot
                include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
                ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
            }

         

      2. url_hash
    3. fair
    4. least_conn
    5. 其他
  5. upstream
    1. 语法
      upstream upstream_name {
          server ip:port;
          server ip:port weight=2;
          server ip:port max_fails=3 fail_timeout=30s;
          server ip:port down;
          server ip:port backup;
          keepalive 32;
      }
      
      sever{
          location match_regulation {
              proxy_pass http://upstream_name;
          }
      }

       

  6. 定时任务
    1. 通过Redis做分布式锁,控制集群中定时任务多次执行
    2. 定时任务在集群中只启动一个
  7. JVM中的缓存替换为Redis缓存,避免主服务器宕机时JVM中的数据丢失。
  8. 啦啦啦
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值