由于动态域名解析的IP地址经常变化。nginx缓存的还是老的IP地址信息,导致IP地址变化以后nginx无法正常访问到反向代理的机器。

首先是通过域名获取IP地址的代码,代码如下:
getip.sh

#!/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

#!/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
     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运行脚本,可以让脚本在后台运行,并输出日志。
写一个终止stop.sh脚本,可以让脚本停止运行。

开始测试。

54992-5gkqhmuypie.png

当动态域名的IP发生变化时nginx 自动重载。
10643-5a8nvnqm6z3.png
这样,不管是你的动态域名IP发生了变化,还是由于路由器重启导致IP发生了变化,nginx都可以自动重载。nginx访问动态域名都是解析的正确的IP地址。

脚本文件列表如下:
13469-9ss2ozrjkcv.png
运行的时候带上需要刷新的动态域名及刷新的时间作为参数

如 ./run.sh xiejava.jios.org 30  脚本就会每30秒去检测一下xiejava.jios.org这个动态域名的IP地址是否有变化,如果有变化则自动reload nginx.

注意:请确认ping 命令能够正常ping 通域名。

如不能ping通域名,需要检查是否DNS设置不正确。

 cat /etc/resolv.conf

检查DNS的配置是否正确。

文章中文件下载:
reloadnginx.zip

Last modification:February 20, 2019
If you think my article is useful to you, please feel free to appreciate