跳过Nginx反向代理在超时时针对特定URL发出重复请求

时间:2019-06-17 06:47:21

标签: nginx server reverse-proxy

下面是Nginx配置中的Rails应用程序代码段。正在本地通过localhost:5478访问该网站。端口5479-82具有运行的ruby实例,以在处理请求时处理流量。该应用程序可作为多个面向用户的应用程序的后备api,这些应用程序可正常运行。

问题是从应用程序上载一张xls工作表时,导入过程大约需要5分钟,并且由于操作超时,nginx在具有相同文件的新端口上发出了请求。这将导致DB中的条目重复。增加超时将无济于事,因为文件的大小和内容未知。我想控制不应该通过反向代理流程的特定网址。我是否应该寻求新的位置限制来解决此问题?

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

1 个答案:

答案 0 :(得分:0)

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

请参见proxy_next_upstream documentation

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

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