目前搭建的家宽服务器已经稳定使用了几个月,虽然中间有点小波折,但是经过不断地优化,抗住的无论是流量还是并发都没太大问题
之前的方案请查看这篇文章 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即可
1 条评论
最近看到这一类的博文也是越来越多了,教程也完善的很多