【问题标题】:Request returns 408 on remote machine请求在远程机器上返回 408
【发布时间】:2018-12-04 16:49:08
【问题描述】:

我的家用电脑的 8080 端口上有 nginx + php-fpm 的 docker 容器。Nginx 代理通过 FCGI 和 PHP-FPM 对 PHP 脚本的请求。

它侦听带有名为 data 的 POST 字段的请求,并由 JSON 解码数组组成。出于测试目的,我有 1552 个字符长的 JSON 字符串。

当我使用本地机器的 PHP cUrl 发出请求时,例如http://localhost:8080/path/on/site 我在我的 PHP 应用程序中成功获取了我的 data 字段。

但是!如果我使用除 IP 地址 (http://myhomePcIp:8080/path/on/site) 之外的完全相同的 PHP cUrl 脚本从远程 PC 发出请求 - 我什么也得不到。

在我得到的nginx的访问日志中:

remoteIp - - [26/Jun/2018:04:07:55 +0000] "POST /path/on/site HTTP/1.1" 408 25 "-" "-"

在 php-fmp 方面我根本没有请求。

修剪data字段的长度我得到了长度为1289个字符的成功结果,但1290个字符完全破坏了请求。

这里是 PHP 脚本:

<?php
$c = curl_init();
$opts = array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'http://myHomePcIP:8080/path/on/site',
    CURLOPT_POSTFIELDS => array("data" => '<LONG JSON STRING>')
);

curl_setopt_array($c, $opts);
var_dump(curl_exec($c));

【问题讨论】:

  • 为什么远程访问页面时的myhomePcIp 和PHP 脚本CURLOPT_URL 相同?
  • @JamesWong, totally the same PHP cUrl script except IP addres - 对于本地主机我使用本地主机,对于远程我使用我家 PC 的外部 IP 地址

标签: php docker nginx


【解决方案1】:

从您的描述看来,php cURL 是问题的根源。我建议您在 php.ini 运行时文件中检查以下标志

max_input_vars 可以接受多少个输入变量(限制分别应用于 $_GET、$_POST 和 $_COOKIE 超全局变量)。 [Default = 1000]

post_max_size 设置允许发布数据的最大大小。此设置也会影响文件上传。 [Default = 8M]

将它们设置为以下属性

post_max_size = 8M
max_input_vars = 2000

如果你有更大的json数据包要处理,你可以增加max_input_vars更多。

PS:启用php log可能有用:

【讨论】:

  • 30M 和 5000 被设置为 post max 和 max 输入,没有运气,在 docker php 映像中默认启用 php 日志。对于失败的请求,PHP 的日志是 emty,但是 nginx 在访问日志中有 408 Timeout 响应(nginx 错误日志是 emtpy)。
  • 看起来 PHP fcgi 没有响应,或者 idk
  • 当您从远程位置访问时,是在不同的网络上还是在同一个局域网上?我想知道您的路由器是否有任何问题。
  • 不,它们在不同的局域网上。我的电脑在路由器的 DMZ 中。
猜你喜欢
  • 2018-02-17
  • 2017-05-13
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 2019-06-28
相关资源
最近更新 更多