余温旧梦-王世彪的博客
关注公众号
  • 开发桌面程序
  • javascript教程
  • css样式
  • vuejs
  • 部署免费CDN
  • SEO搜索引擎优化
  • vuepress教程
  • redis分布式缓存
  • Golang
  • PHP
  • Python
  • Java
  • NodeJs
  • tomcat
  • ELK
  • Mysql数据库
  • Nosql数据库
  • C/C++底层开发
  • 音视频/流媒体
  • linux服务器
  • nginx服务器
  • 容器技术
  • 负载均衡
  • 项目管理
  • 持续集成
  • 大数据
  • 微信公众号运营
  • markdown用法
赞一个
友链
联系作者

王世彪

努力做个影响他人滴人
关注公众号
  • 开发桌面程序
  • javascript教程
  • css样式
  • vuejs
  • 部署免费CDN
  • SEO搜索引擎优化
  • vuepress教程
  • redis分布式缓存
  • Golang
  • PHP
  • Python
  • Java
  • NodeJs
  • tomcat
  • ELK
  • Mysql数据库
  • Nosql数据库
  • C/C++底层开发
  • 音视频/流媒体
  • linux服务器
  • nginx服务器
  • 容器技术
  • 负载均衡
  • 项目管理
  • 持续集成
  • 大数据
  • 微信公众号运营
  • markdown用法
赞一个
友链
联系作者
  • 分布式缓存

  • 分布式存储

  • mysql

  • postgresql

  • mongodb

  • c或c++

  • golang

  • php

    • centos安装php多版本管理工具phpbrew
    • php多版本管理工具phpbrew的用法
    • php curl扩展访问https地址返回502问题的排查
      • 1. 原始的现象描述
      • 2. 总结
      • 3. 解决方法
    • centos8安装php环境
    • 安装php7
    • 配置使apache可通过php用root权限执行命令
    • phpstorm自动同步(部署)本地代码到服务端
    • windows安装phalcon开发环境
    • linux安装phalcon开发环境
    • centos8安装phalcon开发环境
    • php代码加密-借助screw plus
  • java

  • nodejs

  • python

  • tomcat

  • elk

  • 音视频流媒体

  • 后台
  • php
王世彪
2020-12-30
目录

php curl扩展访问https地址返回502问题的排查

# php curl扩展访问https地址返回502问题的排查

本文讲述总结了php中curl函数在某些环境下访问https地址返回502错误的问题排查过程。

# 1. 原始的现象描述

同一套curl请求代码放到不同的机器(A、B、C、D)上,结果截然不同。A、B、C机器为centos6或centos7,D机器为centos8
A、B、C上成功

D上执行时,curl_exec函数会执行中断,并且php-fpm进程自动退出并重启,php-fpm的错误日志如下:

[29-Dec-2020 08:44:45] WARNING: [pool www] child 4487 exited on signal 11 (SIGSEGV - core dumped) after 1286.047350 seconds from start
[29-Dec-2020 08:44:45] NOTICE: [pool www] child 4532 started

该curl逻辑执行失败,导致nginx返回502错误。
该错误并不是每次都会出现,时而成功,时而失败。
并且该错误仅发生在请求https地址时,当请求http地址时不会出错。

# 2. 总结

  • 根本原因是php的openssl扩展的版本和当前操作系统的ssl版本不兼容导致的
    这4台机器的php环境使用的都是同一个定制的php安装包(该安装包是在OpenSSL 1.1.1-pre8 (beta) 20 Jun 2018环境下编译的), 所以这4台机器的openssl扩展的版本是相同的(可以通过phpinfo()查看),都是OpenSSL 1.1.1-pre8 (beta) 20 Jun 2018。但是4个机器上的系统ssl版本却不同(可以通过系统命令curl -V查看或phpinfo() 返回的curl扩展的SSL Version属性),分别为A:NSS/3.28.4, B:NSS/3.44,C:NSS/3.36, D:OpenSSL/1.1.1g。 看出A、B、C这3台机器的ssl版本都是NSS版本,而D是OpenSSL版本,且版本号和openssl扩展的版本号不同。
    可以看出2个问题:

  • A、B、C这3台机器的ssl版本和D并不属于同一个系列,而ABC属于同一个系列
    猜测可能NSS版本兼容性较好,不然怎么解释A、B、C这3台机器都正常呢。

  • D上的openssl版本和php扩展的的版本虽然都属于openssl,但是版本不同
    猜测,很可能是对openssl的版本要求比较严,如果操作系统的ssl版本和php openssl扩展都是openssl版本,那么版本号稍微不一致,可能就会导致curl执行异常。

  • ssl版本分为2种,一种是nss,另一种是openssl

# 3. 解决方法

因为问题的产生是由于定制php安装包携带的php环境与centos8系统不兼容导致的。所以解决办法就是不再使用定制php安装包, 改用系统自带php环境即可解决。

D机器上改用系统自带的php环境(yum install php)后,系统ssl版本和 php扩展openssl的版本是一致的,都是openssl版本且版本号都是OpenSSL/1.1.1g.

#php
上次更新: 2020-12-30 02:49:14
php多版本管理工具phpbrew的用法
centos8安装php环境

← php多版本管理工具phpbrew的用法 centos8安装php环境→

最近更新
01
mysql创建用户
04-09
02
golang错误处理最佳实践
03-17
03
基于proto文件生成rpc接口定义文档
03-11
更多文章>
Theme by Vdoing | Copyright © 2019-2022 王世彪 | MIT License
冀ICP备19016776号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式