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

之前的方案请查看这篇文章 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; ?>

参数说明

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

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

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

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

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