是什么导致'底层连接被关闭'在nginx上?

时间:2015-11-12 07:56:47

标签: nginx connection

我们有一个支付网关集成,可以将数据发布到第三方网址。然后,用户完成其付款流程,当交易完成时,网关会回发到我们服务器上的URL。

该帖子失败,网关报告以下错误:

  

错误13326:无法与ServerResultURL [enter image description here对话。

     

完整错误详细信息:基础连接已关闭:发送时发生意外错误。

     

响应对象为空

当我直接发布到# http://expressionengine.stackexchange.com/questions/19296/404-when-sagepay-attempts-to-contact-cartthrob-notification-url-in-nginx location /themes/third_party/cartthrob/lib/extload.php { rewrite ^(.*) /themes/third_party/cartthrob/lib/extload.php?$1 last; } 时,我会得到200响应,因此我不确定它会在哪里掉落。

这是在运行nginx的Ubuntu盒子上。

可能导致该问题的原因是什么?如何找到有关该问题的详细信息以及解决问题的方法?

编辑:

为简洁起见,上面的示例位于{{1}}的网址上,但实际情况是我有重写(见下文)。实际发布到的网址是{{1}},因此我不确定下面的重写是否会导致问题。

我仍然认为不是因为我在通过POSTMAN发布时得到200回复​​。

{{1}}

1 个答案:

答案 0 :(得分:1)

此类错误的典型原因

我敢打赌你的服务器正在使用网关(PaymentSense,对吗?)不期望的东西响应POST到/ bar。这可能是因为:

  1. 网关无法通过网络访问您的Ubuntu盒子,因为两者之间的防火墙或网络硬件阻止它。
  2. 您的https证书已损坏/过期/自签名,网关拒绝连接。
  3. NGINX或您的Web应用程序软件(PHP,我想?或者nginx正在服务)的错误配置导致/ bar响应一些奇怪的响应,例如30x或50x错误页面,或者可能只是错误的回复,例如HTML页面。
  4. 对POST的响应还有其他问题。
  5. 在/ bar运行的脚本/控制器可能会在POST请求中收到意外输入,因此您可能希望查看进入的请求。
  6. 您遇到了网络连接问题。
  7. 我会留下前两个项目给你排除故障,因为我认为这不是你在这个问题上所要求的。

    对NGINX响应进行疑难解答

    我建议将其配置为使用body_filter_by_lua将其响应转储到nginx变量中,以便您可以看到响应的结果。有一个如何设置它的好例子here。我认为这会让你理解为什么/吧不表现。

    对NGINX请求进行疑难解答

    如果没有说明原因,请尝试记录请求数据。你可以用以下的东西来做到这一点:

    location = /bar {
      log_format postdata $request_body;
      access_log  /var/log/nginx/postdata.log  postdata;
      fastcgi_pass php_cgi;
    }
    

    查看此POST的请求标头和正文,如果错误不明显,请尝试重播完全相同的请求(使用可以完全控制的HTTP客户端,例如curl)和使用/ bar调试正在发生的事情。当您对/ bar进行相同的POST时,nginx是否正在运行您认为应该运行的脚本/控制器?将日志记录添加到/ bar脚本/控制器进程。

    如有必要,请使用交互式调试。 (如果您正在使用PHP,这可能需要远程Xdebug,但无论您在服务器上使用什么,大多数Web应用程序工具都提供某种形式的交互式调试。)

    网络疑难解答

    如果这些都不起作用,则网关可能无法到达您正在运行此主机和端口,或者您遇到其他类型的网络连接问题。我会在你的Ubuntu盒子上运行tcpdump来捕获网络流量。如果您可以在安静(网络)系统上重新创建它,那将对您有利。它仍然是TLS(https),所以除了连接打开和数据包到达之外,不要指望看到太多。如果您发现需要查看TLS流量内部以进行故障排除,则可以考虑使用mitmproxy来执行此操作。