自动reload nginx解决nginx对动态域名不重新解析的问题

屌丝买不起服务器,用家里闲置的两台破笔记本电脑装了个linux为我的小站爱分享读书(www.ishareread.com) 通过nginx+tomcat做了个集群。两台笔记本分别装了tomcat,通过nginx反向代理提供访问。nginx是放在阿里云上的,通过域名映射到nginx上。nginx代理家里的两台笔记本。由于家里的网络通过电信光纤上网,没有固定IP是通过DDNS动态域名解析访问的。问题来了,这个IP经常变。IP一但变了后nginx不再对动态域名进行解析了,访问的还是老IP地址。导致网站访问不了。必须得重启nginx或重新reload nginx。有没有办法让IP变了nginx重新解析动态域名呢?上网找了很久,没有什么好办法。包括改用了淘宝的tengine, 通过ngx_http_upstream_dynamic_module该模块提供了在运行时动态解析upstream中server域名的功能,然而并没有什么卵用。所以想了一个笨办法,就是写一个shell 脚本。定时判断DDNS的域名绑定的IP地址,如果IP地址和上次比较有变化就通过nginx  -s reload将nginx重载配置。实践证明效果还不错。


由于动态域名解析的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脚本,可以让脚本停止运行。

开始测试。


当动态域名的IP发生变化时nginx 自动重载。


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

脚本文件列表如下:


运行的时候带上需要刷新的动态域名及刷新的时间作为参数

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


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

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

# cat /etc/resolv.conf

检查DNS的配置是否正确。


具体的代码和脚本下载

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当使用命令"./nginx -s reload"重新读取nginx配置文件时,如果出现报错"nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)",这通常是由于缺少nginx.pid文件导致的。pid文件用于存储nginx进程的进程ID,在reload时会被使用。要解决这个问题,你可以按照以下步骤进行操作: 1. 首先,进入到nginx的安装目录中的logs文件夹,确认是否确实没有nginx.pid文件。如果确实没有该文件,你可以手动创建一个空的nginx.pid文件,使用命令"touch /usr/local/nginx/logs/nginx.pid"。 2. 如果创建了nginx.pid文件之后仍然出现错误,这可能是由于nginx进程没有正确关闭导致的。你可以使用命令"ps axu | grep nginx"来查看是否还有nginx进程在运行。如果有未关闭的nginx进程,你可以使用命令"kill -9 <pid>"来强制终止这些进程。 3. 另外,reload失败还有可能是由于nginx配置文件的错误导致的。你可以使用命令"./nginx -t"来检查nginx配置文件是否有错误。如果有错误,根据提示进行修改,并再次尝试使用"./nginx -s reload"重新读取配置文件。 总结一下,当reload nginx失败时,你可以首先确认是否缺少nginx.pid文件,如果是的话,手动创建一个nginx.pid文件。然后检查是否有未关闭的nginx进程,如果有的话,使用kill命令终止这些进程。最后,检查nginx配置文件是否有错误,并进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiejava1018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值