首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >网络集群节点自动切换nginx负载均衡,自动生成nginx配置文件。小绿叶技术博客--中央集成--外层公共能源控制系统--集群网络节点控制--主驱动

网络集群节点自动切换nginx负载均衡,自动生成nginx配置文件。小绿叶技术博客--中央集成--外层公共能源控制系统--集群网络节点控制--主驱动

原创
作者头像
eisc
发布于 2025-05-07 04:17:47
发布于 2025-05-07 04:17:47
1430
举报
代码语言:shell
AI代码解释
复制
#!/bin/bash
echo "
小绿叶技术博客--中央集成--外层公共能源控制系统--集群网络节点控制--主驱动
1.集群节点自动切换,2.自动生成nginx配置文件
"

# Define the list of IP addresses
ipListGroupDdoss=(    10.1.1.2      10.1.1.6   10.1.1.8 )
#                      home         qinshi      work phone
ipListGroupEisc=(     10.1.1.13     10.1.1.8   10.1.1.10)
#                      qinshi       home        work phone
historyHostIP=0.0.0.0 ; historyHostIPFlag=0;

ipList=${ipListGroupDdoss[*]}

failCount=0

failFlag=0
failMaxFlag=0

successCount=0
successMaxFlag=0

failMaxCount=3             # 稳定 5 次pin
successMaxCount=3          # 稳定 5 次pin

i=0


configDIR(){

    if [ `id -un` != "root" ]
    then
        sudoc="sudo"
    else
        sudoc=""
    fi

    wwwconf=/datadisk/eisc/wwwconf/
    $sudoc mkdir -p $wwwconf ; $sudoc rm -rf $wwwconf/*


    xiangmuName=(
        www   work   sou   yundun  guzheng  zhoubao  gcc  xibin ai docker mail
    )

    peizhi=" ddoss.cn                $ip               62000"   # HOME
}


autoSSL()
{

    $sudoc apt install snapd -y
    $sudoc systemctl enable --now snapd.socket
    $sudoc snap install core
    $sudoc snap refresh core
    $sudoc snap install --classic certbot
    $sudoc ln -s /var/lib/snapd/snap /snap
    $sudoc snap install --classic certbot
    $sudoc ln -s /snap/bin/certbot /usr/bin/certbot

    $sudoc certbot certonly --nginx
    # 只获取证书

}


nginxMoude()
{

    httpWeb80="
        server{
            listen 80;
            server_name "$url";
            location / {
                proxy_pass http://$ip:$b;
                # proxy_pass http://$url$request_uri;        # test  研究后缀地址没有跟上参数
                #---- 记录 IP 地址 ----#
                # 开启文件浏览,不能记录ip,否则 出现 端口被加上
                proxy_redirect off;
                proxy_set_header Host \$http_host;
                proxy_set_header X-Real-IP \$remote_addr;
                proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
            }

        }
    "

    httpWeb301="
        server{
            listen 80;
            server_name "$url";
            location / {
                return 301 https://$i.$yuming\$request_uri;
                # 301 需要加参数 $request_uri
            }
        }
    "

    httpsWeb301="
        server{
            listen 443 ssl;
            server_name "$url";

            ssl_certificate     /etc/letsencrypt/live/$url/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/$url/privkey.pem;
            ssl_session_timeout 5m;
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_prefer_server_ciphers on;
            location / {
                return 301 https://$i.$yuming\$request_uri;
                # 301 需要加参数 $request_uri
            }
        }
    "

    httpsWeb443="
        server{
            listen 443 ssl;
            server_name "$url";
            ssl_certificate     /etc/letsencrypt/live/$url/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/$url/privkey.pem;
            ssl_session_timeout 5m;
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_prefer_server_ciphers on;
            location / {
                proxy_pass http://$ip:$b ;
                #---- 记录 IP 地址 ----#
                proxy_redirect off;
                proxy_set_header Host \$http_host;
                proxy_set_header X-Real-IP \$remote_addr;
                proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
            }
        }
    "
}

create_www_conf(){

  echo "案例:   eisc.cn 0.0.0.0 62000"
#  read -p " 请输入三个参数:" peizhi

    buff=( $peizhi )

    yuming=${buff[0]}
    # 前端域名,增加到nginx 消息头部
    ip=${buff[1]}
    # 后端服务器ip
    portmin=${buff[2]}
    portmin=$[portmin-1]
    # 设置最小端口,后面网站按照顺序自动加1

    declare -A port
      port["www"]="62010"
      port["work"]="62011"
      port["sou"]="62012"
      port["yundun"]="62013"
      port["guzheng"]="62014"
      port["zhoubao"]="62015"
      port["gcc"]="62016"
      port["ai"]="62018"
      port["docker"]="62019"
      port["mail"]="62020"

    cd $wwwconf; sudo chmod 777 -R $wwwconf $wwwconf/*

    if [ ! -e eiscwwwconf.tar.gz ]
    then
      $sudoc tar -czvf eiscwwwconf.tar.gz *
      $sudoc rm -rf `ls | grep -v eiscwwwconf.tar.gz`
    fi

    $sudoc rm -rf `ls | grep -v eiscwwwconf.tar.gz`

   # file=(`ls $www | grep -vE "ssl|wwwconf|wwwroot|*.sh"`)
   file=${xiangmuName[*]}


    for i in ${file[*]}
    do
        manualConfigFlag=0

        ((a++))
        b=$[portmin+a] ; portlist[$c]=$b ; ((c++))
        # 打印一次变量,接收一个元素存入数组: portlist
        if [ ! -e $www/$i/cgi-bin ]
        then
        sudo mkdir $www/$i/cgi-bin
        fi

        case $i in
            "www")          b=${port[www]}           ; httpsFlag=1  ; echo "#------- www 被手动指定固定端口  $b -------#" ;;
            "work")         b=${port[work]}          ; httpsFlag=0  ; echo "#------- work 被手动指定固定端口  $b -------#" ;;
            "sou")          b=${port[sou]}           ; httpsFlag=0  ; echo "#------- sou 被手动指定固定端口  $b -------#";;
            "yundun")       b=${port[yundun]}        ; httpsFlag=0  ; echo "#------- yundun 被手动指定固定端口  $b -------#";;
            "guzheng")      b=${port[guzheng]}       ; httpsFlag=0  ; echo "#------- guzheng 被手动指定固定端口  $b -------#";;
            "zhoubao")      b=${port[zhoubao]}       ; httpsFlag=0  ; echo "#------- zhoubao 被手动指定固定端口  $b -------#";;
            "gcc")          b=${port[gcc]}           ; httpsFlag=0  ; echo "#------- zhoubao 被手动指定固定端口  $b -------#";;

            "ai")           b=${port[ai]}           ; httpsFlag=0  ; echo "#------- xibin 被手动指定固定端口  $b -------#";;
            "docker")       b=${port[docker]}       ; httpsFlag=0  ; echo "#------- xibin 被手动指定固定端口  $b -------#";;
            "mail")         b=${port[mail]}         ; httpsFlag=1  ; echo "#------- xibin 被手动指定固定端口  $b -------#";;
        esac

        echo "  $i 创建web网站 的端口:   $b 前端域名 +  $i.$yuming  + 后端ip port + $ip:$b  +  c++ cgi 解析目录: $i/cgi-bin"
        echo "  $i 创建web网站 的端口:   $b 前端域名 +  $i.$yuming  + 后端ip port + $ip:$b  +  c++ cgi 解析目录: $i/cgi-bin" >> log_www_conf.txt

        #---------  生成前端转发 子站点文件  -----------#
        $sudoc mkdir -p $wwwconf/nginxzhuanfa ; $sudoc chmod 777 $wwwconf/nginxzhuanfa

        url=$i.$yuming
        confPath=$wwwconf/nginxzhuanfa/$i-$b.conf


        if [ "$i" = "www" ];then
            manualConfigFlag=1
            #--- 修改 http 模块 ---#
            url="$yuming $i.$yuming"
            nginxMoude
            echo "$httpWeb80" >       $confPath
            #--- 根域名 https 301 ---#
            url="$yuming"
            nginxMoude
            echo "$httpsWeb301">>     $confPath

            #--- www https ---#
            url="$i.$yuming"
            nginxMoude
            echo "$httpsWeb443" >>    $confPath
        fi


        #--- 除了 有两个域名外,走通用配置 ---#
        if [ $manualConfigFlag = "0" ]; then
            nginxMoude
            if [ "$httpsFlag" = "1" ] ;then
                echo -e "$httpWeb301" >      $confPath
                echo -e "$httpsWeb443" >>    $confPath
                # 一般情况ssl 配置流程: http 301 > https 结束
            else
                echo -e "$httpWeb80" >       $confPath
            fi
            # httpsFlag 优先级高; echo -e 保持换行格式
        fi



        #---------- 端口对端口 ----------#

        $sudoc mkdir -p $wwwconf/portconf ; $sudoc chmod 777 $wwwconf/portconf
        echo "
        server{
        listen $b;
        location / {
            proxy_pass http://$ip:$b;
            #---- 记录 IP 地址 ----#
            # proxy_redirect off;
            # proxy_set_header Host \$http_host;
            # proxy_set_header X-Real-IP \$remote_addr;
            # proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
            }
        }
        " > $wwwconf/portconf/$i-$b.conf

        if [ "$i" = "www" ]
        then
            echo "
                server{
                listen $b;
                location / {
                    proxy_pass http://$ip:$b;

                }
                }
            " > $wwwconf/portconf/$i-$b.conf
        fi


        if [ "$i" = "gcc" ]
        then
            echo "
                server{
                listen $b;
                location / {
                    proxy_pass http://$ip:$b;
                }
                }
            " > $wwwconf/portconf/$i-$b.conf
        fi



        #---------- 后端转发子站点 ----------#

            echo "
        server {
        listen       $b;
        root   $www/$i;
        index index.php index.html index.htm index;

        add_header 'yuming is ' '$i.$yuming';
        add_header 'ipport is ' '$ip:$b';

        location ~ \.php {

        #       fastcgi_pass   unix:/var/run/php-fpm811.sock;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  \$document_root\$fastcgi_script_name;
                include        fastcgi_params;
        }

        location /cgi-bin {
            fastcgi_pass  unix:/var/run/fcgiwrap.socket;
            include fastcgi.conf;
        }
        }
            " > $wwwconf/$b.$i.conf
    done

    echo "[ok]创建网站日志存放在:   $wwwconf/log_www_conf.txt"   ; sleep 0.2
    echo "[ok]前端转发 nginx 子文件目录: $wwwconf/nginxzhuanfa"  ; sleep 0.2
    echo "[running] 正在查看自动生成的 nginx 子站点配置文件"        ; sleep 0.5 ; cat  $wwwconf/nginxzhuanfa/www-62010.conf 
    echo "[running] 正在查看 www 站点配置文件" ; 
}


MainNginxconf()
{
    echo "[ok] 通讯正常,正在切换到节点 ip= $ip" ;
    configDIR
    create_www_conf
    /etc/init.d/shell/pytcp.py $ip
    sudo nginx -s reload
}

# Main function
main() {
    local initFlag=1

    while true; do
        for ip in ${ipList[*]}
        do
            failCount=0
            successCount=0
            failMaxCount=3                    # 失败3次 

            for((;;))
            do

                ping -c1 -W2 $ip   | grep from  > /dev/null
                if [ $? -ne 0 ]; then               # 0 正常; -ne 不等于0; ping -c1 发 1 个包, -W1 延时为 1 秒
                    failFlag=1
                    ((failCount++))
                else
                    failFlag=0
                    failCount=0
                    failMaxFlag=0
                    break
                fi  
            
                if [ "$failCount" -gt $failMaxCount ]; then
                    failMaxFlag=1 
                    break 
                fi 

            done

            if [ "$failMaxFlag" == "0"  ]; then
                break
            fi
        done

        if [ $failMaxFlag -eq 0 ];then
            
            if [ "$ip" != "$historyHostIP" ];then
                echo "[warring] 当前节点 $historyHostIP 网络故障 或者由于优先级原因自动往前切换节点,正在切换节点到 $ip" ; sleep 3
                historyHostIP=$ip
            else
                historyHostIPFlag=1
                echo "网络正常,但是ip没有变化,没有切换到下一个节点,还是当前节点。退出下面自动生成作业。"
                continue
            fi

            MainNginxconf
        fi

    done
}
main
# 一键下载: wget ddoss.cn/file/ubuntu/shell/server/daili/grouphost-daili.sh -O grouphost-daili.sh ; sudo chmod +x grouphost-daili.sh ; ./grouphost-daili.sh

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
服务器集群自动切换网络节点
eisc
2024/08/22
3470
nginxconf 自动生成 nginx tcp 转发配置文件 conf
eisc
2024/03/01
2970
Nginx配置文件nginx.conf全解
nginx配置文件nginx.conf的配置http、upstream、server、location等;
青山师
2023/05/05
8420
Nginx/Tengine通用配置教程
Nginx/Tengine通用配置教程,包含多域名共用一个端口指向不同程序、Nginx负载均衡配置、Https配置、禁止通过IP访问、设置访问流量并发速率、Nginx反代PHP、Nginx反代Tomcat。 Nginx通用配置: user www www; worker_processes auto; worker_cpu_affinity auto; dso { load ngx_http_concat_module.so; load ngx_http_sysguard_module.so; }
4xx.me
2022/06/09
9930
Nginx/Tengine通用配置教程
Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理
通过我们会用Nginx的upstream做基于http/https端口的7层负载均衡,由于Nginx老版本不支持tcp协议,所以基于tcp/udp端口的四层负载均衡一般用LVS或Haproxy来做。至于4层负载均衡和7层负载均衡的区别,可以参考:http://www.cnblogs.com/kevingrace/p/6137881.html。然而Nginx从1.9.0版本开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等,鉴于Nginx在7层负载均衡和web service上的成功,和Nginx良好的框架,stream模块前景一片光明。官方文档:http://nginx.org/en/docs/stream/ngx_stream_core_module.html
洗尽了浮华
2018/09/28
9.2K1
Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理
Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理
通过我们会用Nginx的upstream做基于http/https端口的7层负载均衡,由于Nginx老版本不支持tcp协议,所以基于tcp/udp端口的四层负载均衡一般用LVS或Haproxy来做。至于4层负载均衡和7层负载均衡的区别,可以参考:http://www.cnblogs.com/kevingrace/p/6137881.html。然而Nginx从1.9.0版本开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等,鉴于Nginx在7层负载均衡和web service上的成
洗尽了浮华
2018/01/23
29.8K0
nginx配置文件nginx.conf超详细讲解
#nginx进程,一般设置为和cpu核数一样 worker_processes 4;                         #错误日志存放目录 error_log  /data1/logs/error.log  crit;  #运行用户,默认即是nginx,可不设置 user nginx        #进程pid存放位置 pid        /application/nginx/nginx.pid;         #Specifies the value for maximum file descriptors that can be opened by this process. #最大文件打开数(连接),可设置为系统优化后的ulimit -HSn的结果 worker_rlimit_nofile 51200;
互联网金融打杂
2019/01/24
2.2K0
CentOS+Nginx一步一步开始配置负载均衡
现在Nginx到处都可以见到,经常会看到宕机后的网页会显示nginx的字样,这也说明Nginx由于高性能、使用配置简、开源单这些特点被越来越多的用户所接受,所使用。
星哥玩云
2022/07/04
5990
CentOS+Nginx一步一步开始配置负载均衡
nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案。nginx可以用轮询、IP哈希、URL哈希等方式调度后端服务器,同时也能提供健康检查功能。目前有众多公司均已经部署使用nginx实现基于七层的负载均衡功能。 1)Nginx负载均衡 为了实现Nginx的反向代理以及负载均衡功能,应用中需要用到两个模块,HttpProxyModule和HttpUpstreamModule模块;其中HttpProxyModule模块的作用是将用户的数据请求转发到其他服
洗尽了浮华
2018/01/23
8.2K0
nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
Nginx负载均衡配置与使用
现在Nginx到处都可以见到,经常会看到宕机后的网页会显示nginx的字样,这也说明Nginx由于高性能、使用配置简、开源单这些特点被越来越多的用户所接受,所使用。
Java帮帮
2018/12/24
8370
Nginx配置反向代理和负载均衡
今天给大家介绍一下如何利用Nginx进行反向代理,之所以介绍这个的原因是,因为开发的时候遇到一个很尴尬的场景。因为是springboot项目,所以每一个控制类的端口都不一样,但是app那边所有接口都是对应一个ip和一个端口。如果我们想要实现本地app调式,就必须配置一个nginx,进行反向代理连接我们启动的服务器。废话不多说,开始我们nginx配置的介绍。
林老师带你学编程
2019/05/25
9020
Nginx反向代理+负载均衡简单实现(https方式)
背景: A服务器(192.168.1.8)作为nginx代理服务器 B服务器(192.168.1.150)作为后端真实服务器 现在需要访问https://testwww.huanqiu.com请求时从A服务器上反向代理到B服务器上 这就涉及到nginx反向代理https请求的配置了~~~ ------------------------------------------------------------------------------------ A服务器(192.168.1.8)上的操作流程: 1
洗尽了浮华
2018/01/22
3K0
Docker 安装 Nginx 负载均衡配置
Docker 安装 # 1)安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 2)添加Docker软件包源(否则doker安装的不是新版本) yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 3)安装Docker CE yum install -y docker-ce # 4)启动Do
IT茂茂
2020/03/05
2.6K0
Docker 安装 Nginx 负载均衡配置
nginx负载均衡、配置ssl 原
Nginx负载均衡即为当代理服务器将自定义的域名解析到多个指定IP时,通过upstream来保证用户可以通过代理服务器正常访问各个IP。
阿dai学长
2019/04/03
1.1K0
linux学习第四十七篇:Nginx负载均衡,ssl原理,生产ssl密钥对,Nginx配置ssl
Nginx负载均衡 负载均衡,将用户的所有HTTP请求均衡的分配到每一台机器上,充分发挥所有机器的性能,提高服务的质量和用户体验。 vim /usr/local/nginx/conf/vhost/
用户1215343
2018/02/05
1.1K0
linux学习第四十七篇:Nginx负载均衡,ssl原理,生产ssl密钥对,Nginx配置ssl
基于CentOS 7配置Nginx负载均衡
Nginx负载均衡是Nginx的核心功能之一,工作在第七层。它是除了lvs,haproxy之外市面上较为流行的一种负载均衡软件。可以将客户端请求分流到跨多个计算资源(如计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器)的工作负载分布。负载均衡旨在优化资源使用,最大化吞吐量,最小化响应时间,并避免任何单一资源的过载。使用具有负载平衡的多个组件而不是单个组件可以通过冗余来提高可靠性和可用性。本文简要描述Nginx负载均衡的配置,供大家参考。
Leshami
2018/08/06
1.2K0
nginx配置详解
当编译安装好nginx后,其配置文件nginx.conf可以在/etc/nginx/下找到!
老高的技术博客
2022/12/27
5.1K0
nginx配置文件说明
nginx.exe -s stop //停止nginx
用户1499526
2019/07/15
7050
Linux中Nginx配置域名访问多个项目解决方案
首先是系统环境:CentOS7,Nginx版本:1.62(如需其他版本自行到官网下载)
芈亓
2022/06/17
3.7K0
Linux中Nginx配置域名访问多个项目解决方案
Nginx配置文件详细说明
在此记录下Nginx服务器nginx.conf的配置文件说明。 #运行用户 user www-data;     #启动进程,通常设置成和cpu的数量相等 worker_processes  1; #全局错误日志及PID文件 error_log  /var/log/nginx/error.log; pid        /var/run/nginx.pid; #工作模式及连接数上限 events {     use   epoll;             #epoll是多路复用IO(I/O Multipl
艳艳代码杂货店
2021/10/29
6180
推荐阅读
相关推荐
服务器集群自动切换网络节点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档