#### # 引言

stream 模块一般用于 TCP/UDP 数据流的代理和负载均衡，可以通过 stream 模块代理转发 TCP 消息。我是用来转发 mysql、gitee 等连接的，有天 ip 发生了变动导致连接不上。前期试过配置 resolver 114.114.114.114 valid=60s; 来动态解析域名，结果 stream 模块不支持 set 函数，这就导致 ip 变动后必须手动重启或者 reload 一下 nginx 才能正常连接。后面经过搜索发现有人说用 Tengine 替代 nginx 可以实现就试了试，结果发现 Tengine 只能实现 http 下的动态域名解析，至此问题依旧。没办法，我只能通过定时任务加脚本判断 ip 是否变动，如果变动就 reload 一下 nginx。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    #!/bin/bash
    #使用crontab -e命令添加定时任务 */1 * * * * sh /home/xxx/autoReloadNginx.sh
    home="/home/xxx" #指定home路径，如果使用`pwd`则domainIP.txt生成在当前用户目录下
    domain=xxx.xxx.cn
    IP=`ping -4 -c 4 $domain | grep from | tail -n 1 | awk -F ' ' '{print $4}'`
    regex="\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\b"
    if [ `echo $IP | egrep $regex | wc -l` -eq 1 ]; then
            if [ ! -f "$home/domainIP.txt" ]; then
                    touch $home/domainIP.txt
                    echo $IP > $home/domainIP.txt
            else
                    oldIP=`cat $home/domainIP.txt`
                    if [ "$IP" != "$oldIP" ]; then
                            nginx -s reload
                            echo $IP > $home/domainIP.txt
                    else
                            echo "The domain name ip has not changed"
                    fi
            fi
    else
            echo "The domain name resolution is incorrect"
    fi

Nginx Tengine stream