| 参数 | 作用 |
|---|---|
| limit_conn_module | 连接频率限制 |
| limit_req_module | 请求频率限制 |
Http请求是建立在一次TCP连接基础上
一次TCP请求至少产生一次HTTP请求
- 连接限制
例子:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
...
location /download/ {
limit_conn addr 1;
}
语法:
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
限制客户端的链接,需要根据一个key标记客户端,然后需要记录客户端的状态,记录状态就需要在内存中申请空间。
limit_conn_zone : 是一个共享的存储客户端连接状态的容器,针对客户端连接的指定规则的key。示例中就是申请了命名为 addr,以客户端ip(内置变量$binary_remote_addr)为key,空间大小为10m,命名为addr的连接状态存储的容器。按照32bytes/session, 可以处理320000个session。
如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。
limit_conn: 示例中使用addr的连接状态容器,限制每个IP只能发起一个并发连接。如果超过最大并发连接,则返回503错误。
- 请求限制
nginx.org/en/docs/htt… nginx.org/en/docs/htt…
例子:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=5;
}
语法:
Syntax: limit_req zone=name [burst=number] [nodelay | delay=number];
Default: —
Context: http, server, location
例子中定义了一个以客户端为标记,空间大小为10M,每秒限制链接速率为1,突发缓冲池大小为5的Nginx请求限制。一秒钟限制每个客户端请求一次,多余的5个放入缓冲区,在多余的作为503错误返回。
- 访问控制
access_module
例子:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
语法:
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
allow, deny : 是允许,阻止后面的配置进行访问。规则校验从上往下校验,直到找到第一个符合规则的配置才停止。
address: 可以配置单个ipv4,ipv6或者ipv4段,ipv6段
unix: 配置这个指定的字段,是允许或组织访问unix的socket
all: 代表所有
http_access_module的局限性:
1,$remote_addr
表示发出请求的远程主机的 IP 地址,remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP
2,$http_x_forwarded_for
简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项,正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP, 但是有风险,不能保证这个代理服务器不会篡改这个ip。 格式一般为:
X-Forwarded-For: Client IP, Proxy(1) IP, Proxy(2) IP, ...
解决方法:
1,采用别的HTTP头信息控制访问,如: HTTP_X_FORWARDED_FOR
2,结合geo模块
3,通过自定义的HTTP变量传递
- 访问认证模块
auth_basic_module
Syntax: auth_basic string | off;
Default: auth_basic off;
Context: http, server, location, limit_except
Syntax: auth_basic_user_file file;
Default: —
Context: http, server, location, limit_except
auth_basic_user_file: 是配置指定一个用户密码的文件