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

简介: 小绿叶技术博客的集群网络节点控制系统,支持自动IP切换与Nginx配置动态生成。可批量部署多子站(如www、work、AI等),自动分配端口、生成HTTP/HTTPS代理及301跳转配置,并集成Let’s Encrypt证书自动化申请,实现高可用、低运维的Web服务集群管理。(239字)
#!/bin/bash
echo "
小绿叶技术博客--中央集成--外层公共能源控制系统--集群网络节点控制--主驱动
1.集群节点自动切换,2.自动生成nginx配置文件
"

# Define the list of IP addresses
ipListGroupDdoss=(    10.1.1.2      10.1.1.3   10.1.1.8 )
#                      home         qinshi      work phone
ipListGroupEisc=(     10.1.1.2      10.1.1.3   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

www=/datadisk/eisc/www

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  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()
{


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

            add_header 'yumingIs' '$i.$yuming';
            add_header 'ipportIs' '$ip:$b';
            # 名称不能有空格,否则 502 

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

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

            add_header 'yumingIs' '$i.$yuming';
            add_header 'ipportIs' '$ip:$b';
            # 名称不能有空格,否则 502 

            location ~ \.php {
                    fastcgi_pass   unix:/var/run/php-fpm.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 $listFileDir {
                autoindex on;                   #将目录以列表信息显示目录文件
                index index.html index.htm;
                charset utf-8;
            }

        }    
    "


    httpWebDaili80="
        server{
            listen 80;
            server_name "$url";
            location / {
                proxy_pass http://$ip:$b;
                # proxy_pass http://$url$request_uri;        # test  研究后缀地址没有跟上参数
                #---- 记录 IP 地址 ----#
                # 说明:nginx 开启目录浏览,前端网页访问路径末尾需要加 / 符号,否则会跳到端口62011,否则 出现 端口被加上
                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["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

        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 -------#";;
            "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  "
        echo "  $i 创建web网站 的端口:   $b 前端域名 +  $i.$yuming  + 后端ip port + $ip:$b  " >> log_www_conf.txt

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

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


        if [ "$i" = "www" ];then
            manualConfigFlag=1
            #--- 修改 http 模块 ---#
            url="$yuming $i.$yuming"
            nginxMoude
            echo "$httpWebDaili80" >       $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 "$httpWebDaili80" >       $confPath
            fi
            # httpsFlag 优先级高; echo -e 保持换行格式
        fi

        echo $httpWeb301 > $confPath301


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

        $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 "$httpWebServer80" > $wwwconf/$b.$i.conf
        if [ "$i" = "work" ]
        then 
            listFileDir=/ruanjian/
            nginxMoude                     # 刷新值
            echo "$httpWebServerListFileDir80" > $wwwconf/$b.$i.conf
        fi 


    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
    homeIP=$( ip -4 addr show $(ip -br link | grep -v LOOPBACK | grep -v tun | grep -v docker | awk '{print $1}' | head -n1) | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | awk -F"." '{print $1$2$3}')

    while true; do
        if [ $homeIP = 192168122 ]
        then 
            MainNginxconf
            exit
        fi 


        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
                continue
            fi

            MainNginxconf
        fi

    done
}
main
# sudo /datadisk/eisc/server/nginx/nginx126/sbin/nginx  -s reload ; netstat -ntlp ; curl 127.0.0.1:62010/index.php 
# 一键下载: wget ddoss.cn/file/ubuntu/shell/server/nginxconf.sh -O nginxconf.sh ; sudo chmod +x nginxconf.sh ; ./nginxconf.sh
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
19小时前
|
人工智能 API 开发工具
Claude Code国内安装:2026最新保姆教程(附cc-switch配置)
Claude Code是我目前最推荐的AI编程工具,没有之一。 它可能不是最简单的,但绝对是上限最高的。一旦跑通安装、接上模型、定好规范,你会发现很多原本需要几小时的工作,现在几分钟就能搞定。 这套方案的核心优势就三个字:可控性。你不用依赖任何不稳定服务,所有组件都在自己手里。模型效果不好?换一个。框架更新了?自己决定升不升。 这才是AI时代开发者该有的姿势——不是被动等喂饭,而是主动搭建自己的生产力基础设施。 希望这篇保姆教程,能帮你顺利上车。做出你自己的作品。
Claude Code国内安装:2026最新保姆教程(附cc-switch配置)
|
3天前
|
弹性计算 测试技术 数据库
阿里云服务器秒杀活动介绍:秒杀配置、价格、活动入口与秒杀策略
2026年阿里云服务器秒杀活动推出两款轻量应用服务器:2核2G配置38元1年,2核4G配置9.9元1个月、199元1年,每天10点和15点限量开抢。活动助力个人和中小企业优惠上云,服务器预装应用镜像,适合开发者、学生等快速搭建应用。秒杀规则严格,需提前准备。若秒杀失败或不符合条件,可考虑长效特惠方案,如99元/年的经济型e实例或199元/年的通用算力型u1实例。
|
22天前
|
应用服务中间件
2026阿里云轻量服务器抄底价:2核2G配置秒杀38元/年!4核8G费用1159元起(不限流量)
2026阿里云轻量服务器官方页面:https://t.aliyun.com/U/PEdlFP 轻量新价出炉:2核2G低至38元/年(新用户秒杀),2核4G 199元/年,4核8G 1159元/年起;全系200M带宽+不限流量,性价比远超友商。新用户专享,抢购需趁早!
296 15
|
21天前
|
存储 人工智能 运维
Dify开发AI智能体的费用
Dify采用“开源免费+云端订阅”双轨计费,支持自托管(零平台费)或云端沙盒/专业/团队版($0–$159/月)。费用=平台费+模型Token费(直付厂商,Dify不抽成),本地部署可零模型成本。高性价比方案:自建Dify+国产低价API。
|
27天前
|
云计算 开发者
阿里云省钱攻略:优惠券领取与使用一看就会
阿里云是阿里巴巴旗下主流云平台,本文详解其优惠券(代金券、满减券、折扣券)的领取渠道(权益中心/活动页)与使用技巧,助开发者高效抵扣账单、显著降低上云成本。
134 8
|
1月前
|
人工智能 JavaScript Linux
不用懂技术!2026最新OpenClaw安装教程,5 分钟轻松部署可用小龙虾
OpenClaw(“小龙虾”)是一款完全开源的个人AI助手,支持Windows/macOS/Linux三端一键部署。5分钟内即可完成安装,预置Kimi K2.5模型,自带服务网关、身份认证与聊天界面,开箱即用。
|
1月前
|
人工智能 Linux API
零技术门槛落地!OpenClaw保姆级部署图文教程(阿里云/Win11/MacOS/Linux)+API配置+问题排查
OpenClaw(曾用名Clawdbot、Moltbot)作为2026年开源AI智能体领域的标杆工具,凭借“轻量化架构、全场景自动化、多模型兼容”的核心优势,成为个人与轻量团队提升效率的首选。它无需复杂编程,仅通过自然语言指令,即可完成文件管理、代码生成、网页抓取、办公协同等重复性任务,打破传统AI“只说不做”的局限,实现“指令输入-任务拆解-执行落地”的完整闭环。其支持本地隐私部署与云端稳定运行双模式,所有数据可自主掌控,兼顾实用性与安全性。
1312 7
|
19小时前
|
数据采集 缓存 运维
IP查询工具如何评估IP负载?云上资源分配的实战方法
我们曾因P99延迟骤升盲目扩容无效,最终靠IP分桶定位到某云厂商ASN段的爬虫流量。IP查询工具不测性能,而是为请求打标签(ASN/代理类型/风险分等),结合监控数据精准识别“谁拖垮了系统”。分四类桶、设三条件、按优先级调度(分流>限流>扩容>封禁),离线缓存+二次验证,避免误伤。
|
19小时前
|
存储 缓存 自然语言处理
PHP的OPcache与全栈性能优化——从字节码缓存到预加载
PHP的执行过程分为四个阶段:词法/语法解析→生成抽象语法树(AST)→编译为字节码(opcodes)→执行(ZendVM)
49 9
|
19小时前
|
缓存 JSON 前端开发
处理非结构化数据,前端接入 ​D​М‌X​Α‌РΙ 对接 DeepSeek-v4
截至2026年4月,DeepSeek-V4系列以1M上下文、结构化输出与多阶段推理统一接口重塑企业大模型可用性标准。它不只提升“智商”,更解决调用链稳定、长上下文工程化、批量重试与账号治理等生产痛点。推荐通过DMXAPI聚合层接入,实现可审计、可熔断、可扩展的服务化落地。(239字)

热门文章

最新文章