PHP cURL在本地工作,在AWS服务器上出错77

Ale*_*lou 5 php curl nginx amazon-ec2 parse-platform

最新更新:脚本通过SSH shell成功运行为"php script.php",作为管理员用户.当由nginx用户运行时,curl命令无法执行https请求.所以我想这是nginx用户无法正确使用curl的问题.我检查了十分之一的配置文件,但无法找到可以更改的位置.

我正在尝试发布以下JSON

{
    "where": {
      "userId": "97"
    },
    "data": {
      "alert": "Joe Masilotti answered a question you follow",
      "badge": "Increment","eventId":"3","questionId":"8954","answerId":"977"
    }
}
Run Code Online (Sandbox Code Playgroud)

使用以下代码

$c = curl_init();
curl_setopt($c, CURLOPT_TIMEOUT, 30);
curl_setopt($c, CURLOPT_USERAGENT, 'parse.com-php-library/2.0');
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLINFO_HEADER_OUT, true);

curl_setopt($c, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'X-Parse-Application-Id: '.$this->_appid,
    'X-Parse-REST-API-Key: '.$this->_restkey
)); 
curl_setopt($c, CURLOPT_CUSTOMREQUEST, 'POST');

$postData = str_replace(PHP_EOL,'',$args['data']);
curl_setopt($c, CURLOPT_POSTFIELDS, $postData );
$url = $this->_parseurl . $args['requestUrl'];
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($c);
Run Code Online (Sandbox Code Playgroud)

它适用于我的本地Apache.我在运行在AWS EC2上的nginx服务器上运行此命令并从cURL获取此服务器

Array
(
    [url] => https://api.parse.com/1/push
    [content_type] => 
    [http_code] => 0
    [header_size] => 0
    [request_size] => 0
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.012399
    [namelookup_time] => 0.01232
    [connect_time] => 0.013486
    [pretransfer_time] => 0
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => -1
    [starttransfer_time] => 0
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

    [redirect_url] => 
)


cURL error number:77

cURL error:
Run Code Online (Sandbox Code Playgroud)

使用以下命令从AWS EC2服务器的命令行发送相同的JSON

curl -X POST \
  -H "X-Parse-Application-Id: <...>" \
  -H "X-Parse-REST-API-Key:<..>" \
  -H "Content-Type: application/json" \
  -d '{
        "where": {
          "userId": "97"
        },
        "data": {
          "alert": "Joe answered a question",
          "badge": "Increment","eventId":"3","questionId":"8954","answerId":"977"
        }
      }' \
  https://api.parse.com/1/push
Run Code Online (Sandbox Code Playgroud)

cURL扩展在服务器上正确设置,并且可以在其他脚本中使用.谢谢!

更新:脚本"script.php"在服务器上从命令行以"php script.php"运行时成功运行,而在" http://www.mysite.com/script.php " 浏览器上请求时失败

更新:这是我的卷曲-V

curl 7.36.0 (x86_64-redhat-linux-gnu) libcurl/7.36.0 NSS/3.16 Basic ECC zlib/1.2.7 libidn/1.18 libssh2/1.4.2
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz
Run Code Online (Sandbox Code Playgroud)

我试图检查我的本地和服务器PHP配置之间的卷曲差异,我看到本地卷曲SSL版本是OpenSSL/1.0.1f,而在服务器上是NSS/3.14.3.0

小智 5

我在亚马逊AMI linux上有同样的错误.

我通过在/etc/php.d/curl.ini上设置curl.cainfo来解决

检查我的curl.ini https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b


Ale*_*lou 4

经过两天的调试后回答我自己的问题。在一一编译完所有内容后,我意识到在 Amazon Linux 服务器的最后一次更新之后(由于 Heartbleed 问题引起),NSS 出现了问题,包管理器由于某些依赖项损坏而无法更新它。

一种解决方案是使用 openSSL 而不是 NSS 通过 cURL 重新编译 PHP。在执行此操作之前,我花了几个小时(也不依赖于软件包管理的简便性),创建了一个新的 Amazon Linux 服务器来检查它们是否已更新软件包管理以及 NSS 在新 AMI 中是否正常工作。他们确实做到了。弹出一个新实例,在执行其他操作之前执行 yum 更新,NSS 是第一个更新的。

尝试了上面的代码并成功了。所以,现在我将所有代码库移动到新实例,将 EIP 切换到新实例,一切顺利。

  • @JimOHalloran 重新启动 httpd 对我有用。yum 更新后问题就出现了。 (2认同)