【问题标题】:Skip Nginx reverse Proxy making duplicate requests on timeout for specific URL跳过 Nginx 反向代理在特定 URL 超时时发出重复请求
【发布时间】:2019-10-30 17:33:34
【问题描述】:

下面是 Rails 应用程序的 nginx 配置中的代码 sn-p。该网站正在本地访问 localhost:5478。端口 5479-82 运行 ruby​​ 实例以在处理请求时处理流量。该应用程序用作多个面向用户的应用程序的支持 api,这些应用程序适用于正常操作。

问题是从应用程序上传一张 xls 表时,导入大约需要 5 分钟,并且由于操作超时,nginx 使用相同文件在新端口上发出请求。这会导致数据库中的条目重复。增加超时将无济于事,因为文件的大小和内容是未知的。我想控制不应通过反向代理流的特定 url。我应该去寻找新的位置块来解决这个问题吗?

 upstream rails {
    ip_hash; 
    server 127.0.0.1:5479;
    server 127.0.0.1:5480;
    server 127.0.0.1:5481;
    server 127.0.0.1:5482;
  }

server {
listen          5478 default;
server_name     _;
root            "../protac/public";
add_header X-Frame-Options "SAMEORIGIN";

location ~ ^/assets/ {
  root "../protac/public";
  expires 1y;
  add_header Cache-Control public;

  add_header ETag "";
  break;
}

location ~* /  {


  # Setup redirection headers
  proxy_set_header   X-Real-IP         $remote_addr;
  proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
  proxy_set_header   Host              $http_host;

  proxy_buffer_size   128k;
  proxy_buffers   4 256k;
  proxy_busy_buffers_size   256k;

  # Pass the request thru
  proxy_pass         http://rails;
  add_header X-Frame-Options "SAMEORIGIN";
}

【问题讨论】:

  • 你明白了吗?我遇到了类似的问题

标签: nginx server reverse-proxy


【解决方案1】:

当您配置了多个上游服务器时,有一个 proxy_next_upstream 指令,该指令控制如果其中一个服务器无法处理请求时会发生什么,并且默认情况下,在超时或错误获得响应的情况下,nginx将使用另一个上游重试。

proxy_next_upstream documentation

如果您不希望这种行为,并且针对您的特定情况(上传 5 分钟),您可以使用 proxy_next_upstream_timeout 指令,以防止它在指定时间后尝试新的上游。给它一个相当短的时间来专门捕捉那些长时间的超时。

或者,您可以为此类上传定义一个特定位置,并为该位置设置proxy_next_upstream off;,以仅在该位置防止此行为。

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 2019-06-20
    • 2014-06-09
    • 2016-11-19
    • 1970-01-01
    • 2021-07-10
    • 2014-02-01
    • 2018-02-22
    • 2018-06-20
    相关资源
    最近更新 更多