nginx 502 by curl openssl

微信活动项目开发一半、想要本地测试的时候才发现服务器 502 错误了
而上传版本到服务器却是没有问题的

查看 nginx 错误日志发现

1
2017/03/29 09:37:36 [error] 4362#0: *245 upstream prematurely closed connection while reading response header from upstream, client: 12 7.0.0.1, server: film.app, request: "GET /activity/GhostScan/index?activity_id=115&cinema_id=59 HTTP/1.1", upstream: "fastcgi://127.0.0 .1:9000", host: "film.app", referrer: "http://film.app/administrator/ActivityGhostScan/link?activity_id=115"

初步怀疑是本地 nginx 配置有问题,求助度娘修改了如下配置

1
2
3
4
5
6
7
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;

fastcgi_buffers 4 64k;
fastcgi_buffer_size 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

重启 nginx,然而,并没有什么卵用。。。

再次查看 php-fpm 日志发现子进程在访问项目页面时错误退出

1
2
[29-Mar-2017 09:46:41] WARNING: [pool www] child 7007 exited on signal 11 (SIGSEGV) after 26.854745 seconds from start
[29-Mar-2017 09:46:42] NOTICE: [pool www] child 7028 started

使用 dtruss -p php-fpm PID 跟踪 php-fpm 进程,然而,看不懂啊。。。

好吧,放弃了这种思路,一步步从 Yii 框架中断点调试

发现页面在首次请求微信接口后就会报 502 错误,而在之前退出没有问题
接口使用了 curl 请求,我换成 file_get_contents() 之后也没发现问题

难道是 curl 的问题?
接着把该公共方法提出单独测试也没有问题,正常返回抓取数据
无聊试了一下抓取自己的站,服务器 502 了!!!

好吧。和刚才测试比较而言,原来是 curl 在访问 https 协议时报错

定位了错误就好办了,解决一下 curl 没有调用 openssl 的问题就可以了

因为开发机使用的 mac oscurl 使用包管理 brew 安装的

1
2
3
4
# 卸载旧版本 curl
brew uninstall curl
# 安装支持 openssl 的 curl
brew install curl --with-openssl

再次测试项目,OK