Laravel部署Cpanel调用第三方API报cURL error 7连接失败
问题现象
在控制器中携带raw格式JSON请求体发起POST请求调用第三方API时,本地localhost环境测试功能运行完全正常,项目发布部署到Cpanel服务器后抛出如下连接错误:
GuzzleHttp\Exception\ConnectException: cURL error 7: Failed to connect.
两种代码实现方式均出现相同问题,第一种为使用Laravel自带Http门面的实现代码:
use Illuminate\Support\Facades\Http; public function testApi(){ $array = [ 'FullName' => 'Full Name', 'PhoneNumber' => '9999999999', 'Date' => '2022-06-26 17:20', 'Note' => '', ]; try { $response = Http::withBody(json_encode($array) , 'application/json') ->post('https://example'); return $response->status(); } catch (Exception $exception){ return $exception; } }
第二种为直接调用GuzzleHttp客户端的实现代码:
use GuzzleHttp\Client; public function testApi(){ $array = [ 'FullName' => 'Full Name', 'PhoneNumber' => '9999999999', 'Date' => '2022-06-26 17:20', 'Note' => '', ]; try { $client = new Client(); $response = $client->request('POST', 'https://example', [ 'body' => json_encode($array), 'headers' => [ 'Content-Type' => 'application/json', ] ]); return $response->getStatusCode(); } catch (Exception $exception){ return $exception; } }
排查与解决
cURL error 7属于TCP连接层面故障,和请求格式、业务代码逻辑无关——本地运行正常已经排除代码问题,故障点在Cpanel服务器的网络或环境配置,按以下优先级排查即可:
- 域名解析校验:通过Cpanel提供的SSH终端执行
ping 第三方API实际域名,如果返回unknown host提示,说明服务器DNS配置异常,联系Cpanel主机商将服务器公共DNS修改为公共可用DNS(如1.1.1.1、8.8.8.8)即可。 - 连通性校验:域名解析正常的情况下,在服务器终端执行
curl -v https://第三方API实际地址手动测试请求:- 如果返回Connection refused,首先检查第三方API的防火墙规则是否拦截了Cpanel服务器的出口IP,如有拦截联系API服务商将服务器IP加入白名单;如果IP未被拦截,说明Cpanel主机商限制了对应端口的出站请求,联系主机商放开目标地址的出站访问规则即可。
- 如果返回SSL证书相关错误,说明服务器系统内置的CA根证书包过期,可更新系统CA证书包修复;临时验证时可在Guzzle请求参数中加入
'verify' => false关闭证书校验,生产环境不建议长期关闭该配置,存在中间人攻击风险。
- PHP环境校验:进入Cpanel的PHP配置面板,确认当前运行项目的PHP版本已安装并启用curl扩展,同时
allow_url_fopen配置项为开启状态。 - 配置项校验:确认生产环境配置的API地址为第三方服务的公网可访问地址,不要误填本地测试用的localhost、内网IP等仅本地可访问的地址。
内容的提问来源于stack exchange,提问作者Ahmad Izzat
相关产品推荐
相关产品推荐

