什么导致';基础连接已关闭';关于nginx?

什么导致';基础连接已关闭';关于nginx?,nginx,connection,Nginx,Connection,我们有一个支付网关集成,将数据发布到第三方URL。然后用户完成他们的支付过程,当交易完成时,网关将发回我们服务器上的URL 该post失败,网关报告以下错误: 错误13326:无法与ServerResultURL[]通话 完整错误详细信息:基础连接已关闭:发送时发生意外错误 响应对象为空 当我直接发布到https://foo.com/bar我得到了预期的200条回复,因此我不确定这条消息会落在哪里 这是在运行nginx的Ubuntu盒上 是什么导致了这个问题?我怎样才能找到更多的细节和解决方法

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

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

错误13326:无法与ServerResultURL[]通话

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

响应对象为空

当我直接发布到
https://foo.com/bar
我得到了预期的200条回复,因此我不确定这条消息会落在哪里

这是在运行nginx的Ubuntu盒上

是什么导致了这个问题?我怎样才能找到更多的细节和解决方法

编辑: 为了简洁起见,上面的例子是在一个URL上的
/bar
,但事实是我有一个重写(见下文)。实际发布到的URL是
/themes/third\u party/carthrob/lib/extload.php/cardsave\u server/result
,所以我不确定下面的重写是否是导致问题的原因

我仍然会假设,当我通过邮递员发帖时,会收到200条回复

# 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;
}

此类错误的典型原因

我敢打赌,您的服务器正在以网关(PaymentSense,对吧?)不期望的方式响应POST to/bar。这可能是因为:

  • 网关无法通过网络到达你的Ubuntu盒,因为两者之间的防火墙或网络硬件正在阻止它
  • 您的https证书已损坏/过期/自签名,网关正在拒绝连接
  • NGINX或您的web应用程序软件(我想是PHP?或NGINX提供的任何东西)的错误配置导致/bar以一些奇怪的响应进行响应,例如30x或50x错误页面,或者可能只是错误响应,例如HTML页面
  • 对这篇文章的回复还有些问题
  • 在/bar上运行的脚本/控制器可能在POST请求中获得意外输入,因此您可能希望查看传入的请求
  • 您有网络连接问题
  • 我将把前两项留给您进行故障排除,因为我认为这不是您在这个问题中提出的问题

    对NGINX响应进行故障排除

    我建议将其配置为使用
    body\u filter\u by\u lua
    将其响应转储到nginx变量中,这样您就可以看到出现了什么响应。这是一个很好的设置示例。我认为这将引导您了解/bar不起作用的原因

    对NGINX请求进行故障排除

    如果这还不能说明原因,请尝试记录请求数据。您可以使用以下方法来完成此操作:

    location = /bar {
      log_format postdata $request_body;
      access_log  /var/log/nginx/postdata.log  postdata;
      fastcgi_pass php_cgi;
    }
    
    查看此帖子的请求头和正文,如果错误没有立即显现,请尝试重播完全相同的请求(使用HTTP客户端提供完全控制,例如
    curl
    )并调试/bar发生的情况。nginx是否正在运行您认为在向/bar发送相同的帖子时应该运行的脚本/控制器?将日志记录添加到/bar脚本/控制器进程

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

    网络故障排除


    如果这些都不起作用,那么可能是网关无法连接到正在运行此功能的主机和端口,或者您存在其他类型的网络连接问题。我会在Ubuntu框上运行
    tcpdump
    ,以捕获网络流量。如果您可以在安静的(网络)上重新创建此功能系统,这将对您有利。不过,它是TLS(https)因此,不要期望看到连接打开和数据包到达的情况。如果你发现你需要在TLS流量内看到故障,你可以考虑使用<代码> MITMyPosivs/CODE >这样做。

    检查请求似乎是逻辑起点,但我似乎遇到了麻烦。ode>log_format配置到
    服务器上的
    位置
    ,但我收到一个错误
    “log_format”在/etc/nginx/sites enabled/foo.com
    中不允许使用指令。因此,我移动到默认nginx配置上的
    http
    ,希望捕获对所有URL的post请求,但我根本没有从任何表单post获取任何记录的数据。我没有尝试使用虚拟主机/服务器块。您尝试过移动
    l吗og_format
    指令在其他地方,例如在服务器块之前?然后将
    access_log
    指令留在
    服务器的
    位置
    块中。。。