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编写:
<?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.
(友情提醒,以上方案,仅用于个人,小型企业等,不适合大型网站等)
更多推荐
所有评论(0)