Nginx的:如何设置“limit_conn”和“limit_req”?

我在ubuntu 14.04上使用nginx 版本1.6.2

我试过在引用nginx文档的configuration文件中inputlimit_connlimit_req

Nginx运行良好,没有limit_connlimit_req选项

以下是有日志消息的nginxconfiguration的testing用例。

我不知道我的代码有什么问题。


案例1 – 完整的configuration

/etc/nginx/nginx.conf

 http { ... include /etc/nginx/sites-enabled/*; ... limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s; ... } 

/etc/nginx/sites-enabled/service.conf

 server { ... location / { limit_conn conn_limit_per_ip 30; limit_req zone=req_limit_per_ip burst=5 nodelay; ... } ... } 

log message

 unknown limit_req_zone "req_limit_per_ip" in /etc/nginx/sites-enabled/service.conf 

情况2 – 从启用站点的configuration文件中删除limit_req

/etc/nginx/nginx.conf

 http { ... include /etc/nginx/sites-enabled/*; ... limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s; ... } 

/etc/nginx/sites-enabled/service.conf

 server { ... location / { limit_conn conn_limit_per_ip 30; ... } ... } 

log message

 the size 10485760 of shared memory zone "conn_limit_per_ip" conflicts with already declared size 0 in /etc/nginx/nginx.conf 

情况3 – 从启用站点的configuration文件中删除limit_conn

/etc/nginx/nginx.conf

 http { ... include /etc/nginx/sites-enabled/*; ... limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s; ... } 

/etc/nginx/sites-enabled/service.conf

 server { ... location / { limit_req zone=req_limit_per_ip burst=5 nodelay; ... } ... } 

log message

 unknown limit_req_zone "req_limit_per_ip" in /etc/nginx/sites-enabled/service.conf 

案例4 – 从站点启用configuration文件中删除所有

/etc/nginx/nginx.conf

 http { ... include /etc/nginx/sites-enabled/*; ... limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s; ... } 

/etc/nginx/sites-enabled/service.conf

 server { ... location / { ... } ... } 

log message

 [OK] - nginx reloaded well 

情况5 – 删除limit_req_zonelimit_req

/etc/nginx/nginx.conf

 http { ... include /etc/nginx/sites-enabled/*; ... limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; ... } 

/etc/nginx/sites-enabled/service.conf

 server { ... location / { limit_conn conn_limit_per_ip 30; ... } ... } 

log message

 the size 10485760 of shared memory zone "conn_limit_per_ip" conflicts with already declared size 0 in /etc/nginx/nginx.conf 

情况6 – 删除limit_conn_zonelimit_conn

/etc/nginx/nginx.conf

 http { ... include /etc/nginx/sites-enabled/*; ... limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s; ... } 

/etc/nginx/sites-enabled/service.conf

 server { ... location / { limit_req zone=req_limit_per_ip burst=5 nodelay; ... } ... } 

log message

 unknown limit_req_zone "req_limit_per_ip" in /etc/nginx/sites-enabled/service.conf 

/etc/nginx/nginx.conf合并到/etc/nginx/nginx.conf 。 换句话说,在nginx.conf文件的http块中删除service.conf文件并粘贴server块。 这里是代码。

/etc/nginx/nginx.conf

 http { .. limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=2r/s; limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; .. server { .. location / { limit_req zone=req_limit_per_ip burst=5 nodelay; limit_conn conn_limit_per_ip 30; } .. } } 

variables的含义和testing

  1. limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=2r/s + limit_req zone=req_limit_per_ip burst=5 nodelay

    • 将共享内存设置为10MB
    • 限制每个IP的请求如下
    • 将最大请求设置为rate * burstburst秒内burst
    • 例如,在这种情况下,在5秒内最大值是10(= 2 * 5)个请求
    • 使用nodelay选项:Nginx将返回503响应,不处理过多的请求
    • 没有nodelay选项:Nginx会等待(没有503响应)并处理一些延迟的请求
  2. limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m + limit_conn conn_limit_per_ip 30

    • 将共享内存设置为10MB
    • 在这种情况下,每个IP的连接数限制为30
    • 请注意,正常的浏览器会使2〜8个连接和SPDY协议拆分每个连接
    • 如果连接超过这个值,Nginx会返回503响应

指令limit_req_zonelimit_conn_zone只需要在/etc/nginx/sites-enabled/service.conf包含的相应指令之前。

所以在案例1中,只需要将/etc/nginx/nginx.conf更改为:

 http { ... limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s; ... include /etc/nginx/sites-enabled/*; ... } 

看到:

  1. http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
  2. http://nginx.org/en/docs/http/ngx_http_limit_req_module.html