在使用nginx反向代理的时候,我们都知道如果反代一个动态IP域名的话,如果IP变化,nginx并不会自动更新IP,导致反代失效,翻阅过很多资料,都不能很好的解决这个问题!但是有问题还是要解决的!
所以想了一个笨办法,就是写一个shell 脚本。定时判断DDNS的域名绑定的IP地址,如果IP地址和上次比较有变化就通过nginx -s reload将nginx重载配置。实践证明效果还不错。
通过PING域名获取IP地址,getip.sh代码如下:
1 2 3 4 5 6 7 8 9 |
#!/bin/sh if [ $# -lt 1 ]; then echo $0 need a parameter exit 0 fi ADDR=$1 TMPSTR=`ping ${ADDR} -s 1 -c 1 | grep ${ADDR} | head -n 1` echo ${TMPSTR} | cut -d'(' -f 2 | cut -d')' -f1 |
然后是将IP写到文件,定时获取动态域名的IP,并将IP与文件中的IP比较如果不一致则reload nginx。reloadnginx.sh代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#!/bin/bash echo '...begin...' if [ $# -lt 1 ]; then echo $0 need a host parameter exit 0 fi if [ ! -n "$2" ] ;then sleeptime=10 else sleeptime=$2 fi echo '...refreshtime='${sleeptime}'s' host=$1 ipfile="ip.ini" while [ true ]; do runlogfile="run."`date "+%Y-%m-%d"`".log" reloadlogfile="reload."`date "+%Y-%m-%d"`".log" echo `date`'...read ip.ini...'>>"$runlogfile" >&1 if [ ! -f "$ipfile" ]; then #touch "$ipfile" sh getip.sh "$host" > "$ipfile" fi oldIpAddress=`cat ip.ini |head -n 1` curIpAddress=`sh getip.sh "$host"` echo `date`'...oldIpAddress='${oldIpAddress} >>"$runlogfile" echo `date`'...curIpAddress='${curIpAddress} >>"$runlogfile" if [ "$oldIpAddress" != "$curIpAddress" ];then echo '..oldIpAddress:'${oldIpAddress}'!=curIpAddress:'${curIpAddress}'.......' >>"$runlogfile" /usr/local/tengine/sbin/nginx -s reload #修改为你自己nginx目录地址 echo '...nginx -s reload....' >>"$runlogfile" sh getip.sh "$host" > "$ipfile" echo `date`'...ipchanged..oldIpAddress:'${oldIpAddress}'!=curIpAddress:'${curIpAddress}'...nginx -s reload!' >>"$reloadlogfile" fi /bin/sleep "$sleeptime" done echo '...end .....' |
然后写一个run.sh运行脚本,可以让脚本在后台运行,并输出日志。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/sh if [ $# -lt 1 ]; then echo $0 need a host parameter exit 0 fi if [ ! -n "$2" ] ;then refreshtime=60 else refreshtime=$2 fi host=$1 logfile="run."`date "+%Y-%m-%d"`".log" nohup sh reloadnginx.sh "$host" "$refreshtime" >"$logfile" 2>&1 & echo 'reload is run....refreshtime is '${refreshtime}'s...' tail -f "$logfile" #exec sh reloadnginx.sh "$host" > "$logfile" 2>&1 exit |
写一个终止stop.sh脚本,可以让脚本停止运行。
1 2 |
#!/bin/bash ps -ef|grep reloadnginx|grep -v grep|cut -c 9-15|xargs kill -9 |
把以上4个脚本,放到你的VPS上
运行
1 |
chmod +x getip.sh reloadnginx.sh stop.sh run.sh |
设置权限
然后运行
1 |
sh run.sh www.od.com 60 |
脚本将会60秒检测一次www.od.com的IP变化,如果IP发生了变化则自动reload
动态IP 反代 完美解决!
参考文章:https://blog.csdn.net/fullbug/article/details/54175987
本站教程,未注明转载均为原创内容,仅做为学习参考使用,切勿用于非法及商业用途!造成的后果作者不承担任何责任!
如果转载请注明出处!oD^Blog
本文如果需要更新,或者失效请联系微信 : oldiy2018 【微信不解答任何问题,不接收任何红包!】
如果支持作者,请点击下方赞赏,支持一杯饮料!
如果有问题可以点击【加入电报群】和我一起沟通或者下方留言讨论!
赞赏微信赞赏
支付宝赞赏