有时出于某些安全,权限等原因,我们需要对客户端访问进行控制,本文将记录如何
限制访问,
设置连接最大请求数,
或最大的下载速度等。
-
限制访问
-
访问控制可以通过允许或拒绝客户端IP地址或使用HTTP基本认证,我可以通过指令
allow
和deny(类似于Linux的防火墙)。
-
为了开启身份认证,可以使用auth_basic指令。
用户必须输入有效的用户名和密码才能访问站点。而用户名和密码应该列在
auth_basic_user_file指令设置的文件中。
-
auth_basic的off参数可以取消验证,比如对于一些公共资源,则可以取消验证。
-
我们还需使用satisfy指令来组合来使用IP访问和Http验证。
其默认设置为all,即IP访问和HTTP验证同时通过时才允许用户访问,若设置为any,即IP访问和HTTP验证其一通过就允许用户访问。
-
限制访问
限制连接数
-
首先我们使用limit_conn_zone来定义键和共享内存区的大小(工作者进程将使用该区共享键值对的计数信息)。
第一个参数为定义了键的计算表达式,第二个参数zone定义了区的名称和大小:
-
然后我们使用limit_conn指令在
location, server, http上下文中作限制。
-
我们也可以限制server_name的连接数
-
限制请求率
-
类似limit_conn_zone,我们使用limit_req_zone指令设置请求率限制的内存共享区
-
limit_req_zone设置好后,则可用limit_req来限制请求率了
- 也可以使用nodelay不延迟,这将使得超出limit_req的客户端立刻获得503
-
限制带宽
-
我们可以limit_rate指令限制带宽
-
如果还想限制一个客户端只能同时一个连接,则还需要加上limit_conn
我们还可以在后端服务器的响应头中设置X-Accel-Limit-Rate来作限制。
-
当我们仅想当客户端下载了一些数据后,再开始限制下载速度,可以使用limit_rate_after命令
-
下面是一个较为完整的例子