Rootop 服务器运维与web架构

nginx利用ngx_http_limit_conn_module模块限制连接数

以前介绍过这个模块,再拿出来研究下:http://www.rootop.org/pages/3355.html

ngx_http_limit_conn_module模块默认编译,不需要单独参数。
官方文档:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

http {
    # 以客户端ip做为标识,在内存中设置一块区域名为addr,内存大小为10M的空间
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    # 以server_name做为标识,设置大小为10M名字为perserver的空间
    limit_conn_zone $server_name zone=perserver:10m;

    server {

        # limit_conn 参数的有效配置段 http, server, location
        location / {
            limit_conn addr 1; # 设置同一个ip同一时间只允许建立1个连接。
            limit_conn perserver 100; # 设置当前虚拟主机最大连接数(注意不是最大ip连接数)
            limit_rate 100k; # 限速,特别是下载资源时对每一个连接限速到100kb。
            proxy_pass http://127.0.0.1:8080;
        }
    }
}

有个静态页,比如index.html中引用了3张图片

<html>
<body>
    <img src="./img/1.jpg">
    <img src="./img/2.jpg">
    <img src="./img/3.jpg">
</body>
</html>

那么在浏览器访问的时候,有一定的几率某张图片加载不出来,通过chrome 调试可以看到这个资源出现503错误,
这个错误就是limit_conn addr 1;限制连接数生效了,1张图、一个js、css都是一个连接,所以此配置的值需要根据页面有多少个资源来算出。
之所以说有一定几率出现,而不是百分百,个人推测受下面因素影响。
1、客户端到服务器的网络情况
2、服务器对请求资源的处理速度
3、nginx处理请求头的速度

注意官方文档中的一句话:
Not all connections are counted.
A connection is counted only if it has a request being processed by the server and the whole request header has already been read.
并非所有连接都被计算在内,只有当服务器正在处理请求并且下一个请求已经读取了整个请求头时,才会计算连接。

In HTTP/2 and SPDY, each concurrent request is considered a separate connection.
(这句没做测试,没了解 SPDY,http/2资料说一个页面中的资源都由同一个连接发出请求)

原创文章,转载请注明。本文链接地址: http://www.rootop.org/pages/4375.html

赞赏

微信赞赏支付宝赞赏

作者:Venus

专注于 服务器运维与web架构 E-mail:venus#rootop.org

评论已关闭。