阿里云DDNS-API(php)改进版

阿里云DDNS-API(php)改进版

此版本为改进版,为DDNS解析速度更快!

本文是在


基础上 进行改进优化

实现目标:

增加判断:

每1秒判断一次客户端IP和目标域名的IP是否一致,一致则不调用阿里云DDNS-API(php)减少系统资源消耗
如果不一致,则每1秒强制调用阿里云DDNS-API(php)解析,直到一致为止。

高可用:

本次在DDNS解析逻辑上进行改进的基础上,还加入了一个公网服务器nginx的反向代理,进行高可用解析。
实现目的:nginx作为固定IP 服务器,反向代理动态IP下群晖里的服务,达到更加稳定的效果!

DDNS-API(php)改进版:

部署原方案

按照下文 把AliDDNS API(php)项目下载 部署在群晖指定的Web目录上即可

增加部分:

1.原方案项目下新建文件“GetIP.php”

内入如下:

<?php
//更准确访问ip识别存入$ip_address变量
if (!empty($_SERVER['HTTP_CLIENT_IP']))
{$ip_address = $_SERVER['HTTP_CLIENT_IP'];}
//ip是否来自代理
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{$ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];}
//ip是否来自远程地址
else{$ip_address = $_SERVER['REMOTE_ADDR'];}

2.原方案项目下新建文件“ddns.php”

修改代码中

$dnsip = gethostbyname('xxx.xxx.com');

地址为动态域名的地址

<?php
//引入一次获取IP部分
include 'GetIP.php';

//设置PRC时区
date_default_timezone_set('PRC');

//nslookup 地址 这里改为你动态域名的地址
$dnsip = gethostbyname('xxx.xxx.com');

//显示本地IP地址
echo PHP_EOL;
echo('本地公网IP:');
echo PHP_EOL;
echo($ip_address);
echo PHP_EOL;
echo PHP_EOL;

//显示域名解析IP地址
echo('动态域名IP:');
echo PHP_EOL;
echo($dnsip);
echo PHP_EOL;
echo PHP_EOL;

//浏览器或请求结束后 保持继续执行php代码
    ignore_user_abort();

//程序执行时间无限制
    set_time_limit(0);

//多长时间执行一次单位s
    $sleep_time = 1;

//设定每次执行总数
    $switch = 55;

//while循环部分
    while($switch>=1){
        //循环部分再次引入一次获取IP部分
        include 'GetIP.php';
            //循环部分再次引入一次nslookup地址
        //nslookup 地址 这里改为你动态域名的地址
        $dnsip = gethostbyname('xxx.xxx.com');
      
        //判断本地IP地址和域名解析IP地址是否一致
        if($ip_address == $dnsip){
              if($switch>=2){
                  sleep($sleep_time);
                  $switch --;
                  }else{
                  sleep($sleep_time);
      
                  //地址一致循环结束输出一次解析正确
                  echo $msg=date("Y-m-d H:i:s"),"解析正确",PHP_EOL;
                  $switch --;
                  }
        }else{
                  //地址不一致每秒执行一次解析请求 直到地址一致
            include 'index.php';
            sleep($sleep_time);//等待时间,进行下一次操作。
            $switch --;
        }
    }



    exit();
 

3.修改原方案项目下件“index.php”(覆盖index.php所有内容)

<?php
//此程序要求的时区
date_default_timezone_set('UTC');

//引入PHP API
include_once 'alicloud-php-updaterecord/V20150109/AlicloudUpdateRecord.php';
use Roura\Alicloud\V20150109\AlicloudUpdateRecord;

//更准确访问ip识别存入$ip_address变量
if (!empty($_SERVER['HTTP_CLIENT_IP']))
{$ip_address = $_SERVER['HTTP_CLIENT_IP'];}
//ip是否来自代理
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{$ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];}
//ip是否来自远程地址
else{$ip_address = $_SERVER['REMOTE_ADDR'];}

//填写KeyId和KeySecret
$AccessKeyId     = 'XXXXXXX';
$AccessKeySecret = 'xxxxxxxxxxxxxxxxxxxxxxx';
$updater         = new AlicloudUpdateRecord($AccessKeyId, $AccessKeySecret);

//填写域名相关信息 abc.com为根域名 dsm为二级域名
$updater->setDomainName('abc.com');
$updater->setRecordType('A');
$updater->setRR('dsm');

//自动填入访问者IP作为解析
$updater->setValue($ip_address);

//打印结果
print_r($updater->sendRequest());

4.修改执行命令

原项目中 客户端执行命令如下:
执行命令(脚本) 时间周期建议1分钟一次就行,都是能稳定运行的

curl -u btdnsadmin:passwd http://你服务端域名/dyndns-updater/index.php

btdnsadmin:passwd为你服务端为网站建立的访问账号:密码

修改为:

curl -u btdnsadmin:passwd http://你服务端域名/dyndns-updater/ddns.php

btdnsadmin:passwd为你服务端为网站建立的访问账号:密码

本站例子:

curl -u T325543f:432432432432O https://ddns.zimrilink.com/dyndns-updater/ddns.php

执行结果:

本地公网IP:
212.122.212.221

动态域名IP:
212.122.212.221

2019-10-06 21:57:01 解析正确

nginx高可用:

如群晖中有一个web或者直接就是群晖的管理端,在公务有一个带宽足够的服务器,本站有一个测试服务器100M上下对等。

在该服务器可以部署一个nginx反向代理群晖来解决很多DNS解析生效时间不一的尴尬。

nginx安装过程略过,直接上配置:
xxx.com.conf

 #设置http重定向到https          
server 
      {  
        listen 80;
        server_name xxx.com;
        rewrite ^/(.*)$ https://xxx.com/$1 permanent;
      }
            
#主要https设置 
server 
       {  
         listen 443 ssl http2;
         ssl_certificate /etc/nginx/cert/xxx.pem;
         ssl_certificate_key /etc/nginx/cert/xxx.key;
         server_name xxx.com;

   #反向代理站   
     location / {
         resolver vip1.alidns.com valid=1s;
         set $upstream "https://dsm.xxx.com:5001";
         proxy_pass $upstream;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
            proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-Port $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }


     }

该配置文件首先从http重定向到https
需要事先在/etc/nginx/cert/ 目录下配置ssl证书 并修改以上配置中证书名称。

在反向代理站中增加了如下配置:
resolver配置,该配置是用来查询DNS的,每1秒查一次
set $upstream 就是动态域名。

此处使用resolver配置的DNS,并不是公共DNS,而是使用了一个域名DNS。直接查询域名DNS的性能比公共DNS高。

实测,更改IP后,nginx能在10秒左右正常访问!



本站应网安备相关要求规定全站关闭留言板,如您需要留言欢迎到本站镜像站进行留言
点击前往vas.ink



Last modification:October 7th, 2019 at 12:35 am
If you think my article is useful to you, please feel free to appreciate

Comment here is closed