nginx对动态域名不重新解析的问题
由于屌丝购买不起服务器, 从而采用HKvps+家里机器的方式来实现,HK vps主要负责反向代理, 采用nginx reverse proxy.但是问题是家里机器是动态域名的,而一旦ip发生变化, nginx(apache, varnish类似)都不对动态域名重新解析, 这个问题困扰哥好几个星期,终于解决了。nginx(apache, varnish类似)仅在启动的时候,解析域名,并缓存Ip, 所
由于屌丝购买不起服务器, 从而采用HKvps+家里机器的方式来实现,HK vps主要负责反向代理, 采用nginx reverse proxy.
但是问题是家里机器是动态域名的,而一旦ip发生变化, nginx(apache, varnish类似)都不对动态域名重新解析, 这个问题困扰哥好几个星期,终于解决了。nginx(apache, varnish类似)仅在启动的时候,解析域名,并缓存Ip, 所以当动态ip发生变化后, nginx(apache, varnish类似)里面的ip还是老的ip, 导致无法访问后端的服务器(这里是家里的机器)。
目前从nginx本身来讲暂无解决办法。
所以,我们只能额外写一个脚本,来判断动态域名的ip是否发生了变化,如果发生了变化,则重启nginx。由于重启nginx,会导致nginx重新解析域名,这样我们的问题就解决了。
脚本采用php编写:
<?phpset_time_limit(0);date_default_timezone_set('Asia/Chongqing');//用于调式用,本身功能不需要#echodate('Y-m-d-H-m-s');$server='dynamic.domain.com';//修改成你自己的动态域名地址do{getIp();sleep(10);//无限循环,等于间隔10秒执行一次}while(true);functiongetIp(){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不同, 则执行重启nginxshell_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.
(友情提醒,以上方案,仅用于个人,小型企业等,不适合大型网站等)
更多推荐



所有评论(0)