由于屌絲購買不起服務器, 從而采用HKvps+家里機器的方式來實現(xiàn),HK vps主要負責反向代理, 采用nginx reverse proxy. 但是問題是家里機器是動態(tài)域名的,而一旦ip發(fā)生變化, nginx(apache, varnish類似)都不對動態(tài)域名重新解析, 這個問題困擾哥好幾個星期,終于解決了。 nginx(apache, varnish類似)僅在啟動的時候,解析域名,并緩存Ip, 所以當動態(tài)ip發(fā)生變化后, nginx(apache, varnish類似)里面的ip還是老的ip, 導致無法訪問后端的服務器(這里是家里的機器)。 目前從nginx本身來講暫無解決辦法。 所以,我們只能額外寫一個腳本,來判斷動態(tài)域名的ip是否發(fā)生了變化,如果發(fā)生了變化,則重啟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' ; //修改成你自己的動態(tài)域名地址
do {
getIp();
sleep(10); //無限循環(huán),等于間隔10秒執(zhí)行一次
} while (true);
function getIp(){
global $server ;
$output = shell_exec( 'host ' . $server ); //通過host命令,獲取動態(tài)域名解析后的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不同, 則執(zhí)行重啟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用戶,避免執(zhí)行的時候,權限不夠。
然后編輯 vi /etc/rc.local文件
把命令“php – f /root/ip.php”加入到末尾, 重啟機器后,ip.php就會自動運行了。
可以通過“ps -aux” 來查看具體的進程,
如果想停止ip.php, 在上面的命令的界面中,找到”php -f /root/ip.php”對應的PID, 然后執(zhí)行:
“kill 21727” 命令即可(把21727替換成你實際的PID)
如果提示“command host not found”, 在centos下,請安裝“yum install bind-utils”
over.
(友情提醒,以上方案,僅用于個人,小型企業(yè)等,不適合大型網站等)
|