# 引言
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。
#!/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 |