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

由于屌丝购买不起服务器, 从而采用HKvps+家里机器的方式来实现,HK vps主要负责反向代理, 采用nginx reverse proxy.
但是问题是家里机器是动态域名的,而一旦ip发生变化, nginxapache, varnish类似)都不对动态域名重新解析, 这个问题困扰哥好几个星期,终于解决了。

nginxapache, varnish类似)仅在启动的时候,解析域名,并缓存Ip, 所以当动态ip发生变化后, nginxapache, varnish类似)里面的ip还是老的ip 导致无法访问后端的服务器(这里是家里的机器)。

目前从nginx本身来讲暂无解决办法。

所以,我们只能额外写一个脚本,来判断动态域名的ip是否发生了变化,如果发生了变化,则重启nginx。由于重启nginx,会导致nginx重新解析域名,这样我们的问题就解决了。

脚本采用php编写:

<?php
set_time_limit(0);
date_default_timezone_set( 'Asia/Chongqing' ); //用于调式用,本身功能不需要
# echo date ( 'Y-m-d-H-m-s' );
 
$server = 'dynamic.domain.com' ; //修改成你自己的动态域名地址
 
do {
     getIp();
     sleep(10); //无限循环,等于间隔10秒执行一次
} while (true);
 
function getIp(){
global $server ;
$output = shell_exec( 'host ' . $server ); //通过host命令,获取动态域名解析后的ip地址。
 
# echo $output ;
 
if ( $output == '' ) {
     echo 'nothing found' ;
     exit ;
}
 
# $ip = str_replace ( $output , $server . ' has address ' , '' );
 
$p = "/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/" ;
preg_match( $p , $output , $matches ); //通过正则表达式获取实际的ip字符串。
#print_r( $matches );
 
if ( count ( $matches ) == 0)
exit ;
 
$filename = '/root/current_ip.txt' ; //把ip字符串保存到这个文件里面,  用于下次判断。
touch( $filename );
 
//get old ip
$old_ip = file_get_contents ( $filename );
 
//save current ip to the file
$ip = $matches [0];
file_put_contents ( $filename , $ip );
 
# $output = shell_exec( 'service nginx stop' );
 
//detect if ip was changed.
if ( $ip != $old_ip ){ //如果最新的ip和上次的ip不同, 则执行重启nginx
     shell_exec( 'service nginx restart' );
}
 
# echo $old_ip ;
 
//test crontab
//file_put_contents('/root/'.date('Y-m-d-H-m-s').'.txt',date('Y-m-d-H-m-s')); //仅用于测试定时器而已。
}
 
?>

把以上代码保存到/root/ip.php
注意: ip.php脚本的所有者最好是root用户,避免执行的时候,权限不够。

然后编辑 vi /etc/rc.local文件
把命令“php – f /root/ip.php”加入到末尾, 重启机器后,ip.php就会自动运行了。

可以通过“ps -aux” 来查看具体的进程,

如果想停止ip.php, 在上面的命令的界面中,找到”php -f /root/ip.php”对应的PID, 然后执行:
“kill 21727” 命令即可(把21727替换成你实际的PID)

如果提示“command host not found”, 在centos下,请安装“yum install bind-utils”

over.

(友情提醒,以上方案,仅用于个人,小型企业等,不适合大型网站等)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值