Php nginx x-accel块冲突

Php nginx x-accel块冲突,php,nginx,x-accel-redirect,Php,Nginx,X Accel Redirect,X-Accel-Redirect似乎不遵守nginx块配置规则和先例。 考虑这个例子: server { ... limit_conn limitedIP 10; location ^~ /files/ { internal alias /var/www/files/; limit_conn limitedIP 20; } location ~ \.php$ { ... limit_conn limit

X-Accel-Redirect似乎不遵守nginx块配置规则和先例。 考虑这个例子:

server {
   ...
   limit_conn limitedIP 10;

   location ^~ /files/ {
      internal
      alias /var/www/files/;
      limit_conn limitedIP 20;
   }

   location ~ \.php$ {
      ...
      limit_conn limitedIP 30;
   }
}
如果我直接访问/文件(当然是删除内部文件),则使用limit_conn 20规则,这是正常的

但是,如果我在php脚本中使用X-Accel-Redirect到/files,则使用limit_conn 30规则。即使我从php位置块中删除该行,也会使用服务器块中的limit_conn 10规则,这非常奇怪。最后,如果我从服务器块中删除limit_conn 10,那么将使用limit_conn 20规则,这是我最初期望的

我在nginx版本1.6.2上测试了这个


limit_conn只是一个示例,有几个指令的行为与此类似。有什么想法吗?

这就是limit\u conn和limit\u req模块的工作原理。这些模块处理用户和服务器之间的连接,并且由于内部重定向不打开任何新的这种连接,NGNIX只检查每个请求一次的限制,并且不认为有必要再次检查它们。 在您的示例中,用户的请求首先匹配第二个位置,这将触发第一次调用limit_conn处理程序。这就是为什么使用极限连接30规则。处理程序将在内部重定向后第二次被调用,但它几乎会立即结束工作,而不检查任何内容()

如果在第二个位置注释limit_conn 30规则,limit_conn 10规则将从服务器上下文继承,这对于Nginx来说是完全正常的行为。在这种情况下,同样地,将首先为主请求调用limit_conn处理程序,而下一次调用(在内部重定向之后)将什么也不做

最后,当您注释除limit_conn 20规则之外的所有limit_conn行时,limit_conn处理程序将首先在内部重定向后调用,因此最终将使用此规则

更新:

由于在建立新连接时会检查限制连接规则,因此打开新连接将解决您的问题。从概念上讲,配置如下所示:

limit_conn_zone $binary_remote_addr zone=limitedIP:10m;

server {
    # You can use any random unused non-system port
    listen 127.0.0.1:8889;
    server_name internal.server;

    set_real_ip_from  127.0.0.1/32;
    real_ip_header    X-Forwarded-For;

    location ^~ /files/ {
        limit_conn limitedIP 20;
        alias /var/www/files/;
    }
}

server {
    ...

    location ^~ /files/ {
        internal;
        proxy_set_header Host "internal.server";
        proxy_set_header X-Forwarded-For $remote_addr;

        # Make sure you specify the same port as above
        proxy_pass http://127.0.0.1:8889;
    }

    location ~ \.php$ {
        ...
        limit_conn limitedIP 30;
    }
}
但是,这种方法会导致明显的性能下降,尤其是当文件很大时。因此,我不建议使用此变通方法


不幸的是,我无法想象只有Nginx才能解决这个问题。

因此,没有办法为X-Accel-Redirect文件和其他php文件定义不同的限制连接?从源代码(参见上面提交的链接)判断,没有直接的方法,除非您准备打开一个新连接,这将降低性能。我在原来的答案中增加了一个例子,说明如何做到这一点。