【问题标题】:PHP7 + curl (SSL/TLS) gives 502 Bad GatewayPHP7 + curl (SSL/TLS) 给出 502 Bad Gateway
【发布时间】:2016-02-27 16:26:32
【问题描述】:

我正在开发一个使用 Dropbox SDK 来做一些事情的网页。其中大部分是通过 CLI 发生的,但必须在浏览器中完成一件特定的事情。不过,我偶然发现了一个有趣的问题。

$dbxClient = new dbx\Client($accountToken, 'xxx/' . VERSION);
$folderMetadata = $dbxClient->getMetadataWithChildren("/");

在 CLI 中运行此代码可以正常工作。然而,在浏览器中运行它会给我一个 502。感到困惑的是,我启动了 xdebug 并跟踪问题出现的位置。我发现 Dropbox 的 curl-call 导致了它,所以我写了一个小示例脚本来查看 curl 是否有效。 没有。

<?php
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://example.com"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch); 

    curl_close($ch);
    echo $output;

在浏览器中运行此代码会立即给出 502。但是,如果我删除 https:// 或将其设为 http:// (或在 CLI 中运行),它可以工作。问题似乎出在 PHP7 + curl + SSL 中。添加curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 不起作用。

我该怎么做才能找出这种情况,为什么会发生这种情况以及如何解决?

系统信息:

  • OS X 10.11.2
  • nginx 1.8.0,通过自制软件安装
  • PHP 7.0.3,通过自制软件安装
  • curl 7.43.0,通过自制软件安装
  • OpenSSL 1.0.2f,通过自制软件安装

【问题讨论】:

  • 502是由什么产生的? php5-fpm? nginx?还是 $output 中的字符串?
  • 我的 nginx。对我来说,看起来 php-fpm 崩溃了。
  • 更新:我现在可以在我的 iMac 上测试该示例。那里的结果相同:502。不过,它确实适用于我所有的三台 Linux 服务器。

标签: php ssl curl


【解决方案1】:

Sooo...经过大量调查,我终于找到了解决方案。希望这对未来的 Google 员工有所帮助。

第 1 步:调查发生了什么。

由于我使用的是自制的 php70-package,OS X 上的目录与 Linux 上的目录略有不同。我需要找到 php-fpm.conf。通过检查自制软件创建的homebrew.*.plist-文件,我发现它位于/usr/local/etc/php/7.0/php-fpm.conf

之后,我查找了二进制文件,幸运的是,它也在 plist 中记录下来。对我来说,它位于/usr/local/opt/php70/sbin/php-fpm

我修改了配置文件,将日志文件写入/var/log/php-fpm.log

log_level = notice
error_log = /var/log/php-fpm.log

我给了/var/log/php-fpm.log chmod 0777(因为我很懒),再次启动了php-fpm (launchctl load -w /path/to/php-fpm.plist) 并尾随了新的日志文件:tail -f /var/log/php-fpm.log

这是我发现的(以及 Google 员工可能会寻找的):

WARNING: [pool www] child 28580 exited on signal 11 (SIGSEGV) after 1.726773 seconds from start

所以发生了分段错误。


第 2 步:修复 SIGSEGV

使用新发现的信息,我搜索了导致分段错误的原因。我在前几页找不到任何有帮助的内容,但在后面的一页中,我找到了这个链接:https://stackoverflow.com/a/34951784/1486930

它说的是:

I experienced same problem early and fixed it with running php-fpm as root.

You just killed me. Running php-fpm as root just works well! Thanks!!

所以这就是我所做的。我再次停止了 php-fpm 并以 root 身份手动运行它:

sudo /usr/local/opt/php70/sbin/php-fpm --fpm-config /usr/local/etc/php/7.0/php-fpm.conf

你看,它有效!我不知道为什么会这样,但确实以 root 身份运行它可以“修复”它。

希望能帮到你。

【讨论】:

  • 以 root 身份运行 php-fpm 也对我有用,但我发现问题来自 --with-imap 选项。我卸载了php并在没有imap的情况下重新安装了它,一切正常。我不需要 imap,但对于需要它的人来说,这是一个问题。此处报告此问题github.com/Homebrew/homebrew-php/issues/2390
  • 男人!我从早上开始就一直在努力解决这个问题——我想给你买杯啤酒!
  • 2021 我通过以 root 身份运行 fpm(使用 macports 安装)解决了这个问题:sudo /opt/local/sbin/php-fpm74 --fpm-config /opt/local/etc/php74/php-fpm.conf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 2020-10-29
  • 2018-06-09
  • 2011-01-29
  • 2018-04-15
  • 2013-09-05
  • 1970-01-01
相关资源
最近更新 更多