Php nginx x-accel块冲突
X-Accel-Redirect似乎不遵守nginx块配置规则和先例。 考虑这个例子: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
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文件定义不同的限制连接?从源代码(参见上面提交的链接)判断,没有直接的方法,除非您准备打开一个新连接,这将降低性能。我在原来的答案中增加了一个例子,说明如何做到这一点。