目前搭建的家宽服务器已经稳定使用了几个月,虽然中间有点小波折,但是经过不断地优化,抗住的无论是流量还是并发都没太大问题

之前的方案请查看这篇文章 https://www.bzqll.com/2023/09/370.html

优化内容

由于公网IP的服务器装的是宝塔,然而宝塔又有API接口,所以索性就直接调用宝塔的API来进行更新代理

需要注意的是: 因为宝塔的API必须要开启白名单IP才可以操作,但是家宽的IP是会变化的,不然是无法请求云服务的宝塔接口的

但公网IP是不变的,所以我们直接利用云服务器的本地IP 127.0.0.1来进行更新配置

最后直接在宝塔API的白名单中把云服务器IP和127.0.0.1加入白名单即可。

对应的PHP代码:

<?php
class bt_api {
    private $BT_KEY = "xxxxxxxxx";  //接口密钥
      private $BT_PANEL = "http://127.0.0.1:8888";       //面板地址
    
      //如果希望多台面板,可以在实例化对象时,将面板地址与密钥传入
    public function __construct($bt_panel = null,$bt_key = null){
        if($bt_panel) $this->BT_PANEL = $bt_panel;
        if($bt_key) $this->BT_KEY = $bt_key;
    }
    
      //示例取面板日志    
    public function GetLogs(){
        //拼接URL地址
        $url = $this->BT_PANEL.'/data?action=getData';
        
        //准备POST数据
        $p_data = $this->GetKeyData();        //取签名
        $p_data['table'] = 'logs';
        $p_data['limit'] = 10;
        $p_data['tojs'] = 'test';
        
        //请求面板接口
        $result = $this->HttpPostCookie($url,$p_data);
        
        //解析JSON数据
        $data = json_decode($result,true);
          return $data;
    }
    
    //获取网站反向代理配置文件    
    public function GetWebProxyConf($proxy_name,$domain){
        //拼接URL地址
        $url = $this->BT_PANEL.'/files?action=GetFileBody';
        
        //准备POST数据
        $p_data = $this->GetKeyData();        //取签名
        $p_data['path'] = '/www/server/panel/vhost/nginx/proxy/'.$domain.'/'.md5($proxy_name).'_'.$domain.'.conf';
        
        //请求面板接口
        $result = $this->HttpPostCookie($url,$p_data);
        
        //解析JSON数据
        $data = json_decode($result,true);
          return $data;
    }    
    
    //更新网站反向代理配置文件    
    public function SetWebProxyConf($proxy_name,$domain,$data){
        //拼接URL地址
        $url = $this->BT_PANEL.'/files?action=SaveFileBody';
        
        //准备POST数据
        $p_data = $this->GetKeyData();        //取签名
        $p_data['path'] = '/www/server/panel/vhost/nginx/proxy/'.$domain.'/'.md5($proxy_name).'_'.$domain.'.conf';
        $p_data['data'] = $data;
        $p_data['encoding'] = 'utf-8';
        
        //请求面板接口
        $result = $this->HttpPostCookie($url,$p_data);
        
        //解析JSON数据
        $data = json_decode($result,true);
          return $data;
    }
    
      /**
     * 构造带有签名的关联数组
     */
      private function GetKeyData(){
          $now_time = time();
        $p_data = array(
            'request_token'    =>    md5($now_time.''.md5($this->BT_KEY)),
            'request_time'    =>    $now_time
        );
        return $p_data;    
    }
      
  
      /**
     * 发起POST请求
     * @param String $url 目标网填,带http://
     * @param Array|String $data 欲提交的数据
     * @return string
     */
    private function HttpPostCookie($url, $data,$timeout = 60)
    {
        //定义cookie保存位置
        $cookie_file='./'.md5($this->BT_PANEL).'.cookie';
        if(!file_exists($cookie_file)){
            $fp = fopen($cookie_file,'w+');
            fclose($fp);
        }
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }
}



//实例化对象
$api = new bt_api();
// 执行动作
$key = $_GET['key'];
// 更新的IP
$ip = $_GET['ip'];

header('Content-Type: application/json');

// 更新配置
if ($key == 'nginx_update') {
    
    if(empty($ip)){
        echo '{"status":false,"msg":"参数缺失"}';
        return;
    }
    
    //获取配置文件
    $res_json = $api->GetWebProxyConf('反向代理名称','域名');
    // 获取配置文件内容
    $proxy_conf = $res_json['data'];
    // 正则
    $pattern = '/proxy_pass http:\/\/(.*?);/i';
    // 进行匹配
    preg_match($pattern,$proxy_conf, $matches);
    // 替换内容
    $proxy_conf = str_replace('http://'.$matches[1],'http://'.$ip,$proxy_conf);
    // 使用替换以后得内容进行更新 并返回
    echo json_encode($api->SetWebProxyConf('反向代理名称','域名',$proxy_conf));
    
    return;
}else if ($key == 'nginx_get') {
    echo json_encode($api->GetWebProxyConf('反向代理名称','域名'));
    return;
}

echo '{"status":false,"msg":"error"}';
return;
?>

参数说明

$proxy_name 宝塔新建反向代理时填写的名称
$domain 你需要代理的网站域名

最终的反向代理文件名称为

代理名称MD5后+_+域名+.conf

最后只需要修改在你本地检测IP是否变化的逻辑中判断php文件返回的status是否为true即可

最后修改:2024 年 03 月 22 日
如果觉得我的文章对你有用,请随意赞赏