Nginx的”流量限制”使用漏桶算法(leaky bucket algorithm),就好比,一个桶口在倒水,桶底在漏水的水桶。如果桶口倒水的速率大于桶底的漏水速率,桶里面的水将会溢出;同样,在请求处理方面,水代表来自客户端的请求,水桶代表根据”先进先出调度算法”(FIFO)等待被处理的请求队列,桶底漏出的水代表离开缓冲区被服务器处理的请求,桶口溢出的水代表被丢弃和不被处理的请求。
“流量限制”配置两个主要的指令,limit_req_zone和limit_req,如下所示:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; upstream myweb { server 10.0.105.196:80 weight=1 max_fails=1 fail_timeout=1; } server { listen 80; server_name localhost; location /login { limit_req zone=mylimit; proxy_pass http://myweb; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 10.0.105.196配置: server { listen 80; server_name localhost; location /login { root /usr/share/nginx/html; index index.html index.html; } }limit_req_zone指令设置流量限制和内存区域的参数,但实际上并不限制请求速率。所以需要通过添加limit_req指令启用流量限制,应用在特定的location或者server块。(示例中,对于”/login/”的所有请求)。
limit_req_zone指令通常在HTTP块中定义,使其可在多个上下文中使用,它需要以下三个参数:
Key - 定义应用限制的请求特性。示例中的 Nginx 变量$binary_remote_addr,保存客户端IP地址的二进制形式。Zone - 定义用于存储每个IP地址状态以及被限制请求URL访问频率的内存区域。通过zone=keyword标识区域的名字(自定义),以及冒号后面跟区域大小。16000个IP地址的状态信息,大约需要1MB。Rate - 连接请求。在示例中,速率不能超过每秒1个请求。一般情况下,客户端超过配置的流量限制时,Nginx响应状态码为503(Service Temporarily Unavailable)。可以使用limit_req_status指令来设置为其它状态码(例如下面的404状态码):
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; upstream myweb { server 10.0.105.196:80 weight=1 max_fails=1 fail_timeout=1; } server { listen 80; server_name localhost; location /login { limit_req zone=mylimit; limit_req_status 404; proxy_pass http://myweb; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }(1)基于IP的访问控制:http_access_module (2)基于用户的信任登录:http_auth_basic_module
1、配置语法
Syntax:allow address | CIDR | unix: | all; default:默认无 Context:http,server,location Syntax:deny address | CIDR | unix: | all; default:默认无 Context:http,server,location =================================================== allow 允许 //ip或者网段 deny 拒绝 //ip或者网段编辑/etc/nginx/conf.d/access_mod.conf内容如下:
[root@192 ~]# vim /etc/nginx/conf.d/access_mod.conf server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.hml; deny 192.168.1.8; allow all; } } [root@192 ~]# nginx -t [root@192 ~]# nginx -s reload #需要注意: 1.按顺序匹配,已经被匹配的ip或者网段,后面不再被匹配。 2.如果先允许所有ip访问,在定义拒绝访问。那么拒绝访问不生效。 3.默认为allow all宿主机IP为192.168.1.8,虚拟机IP为192.168.1.11,故这里禁止宿主机访问,允许其他所有IP访问。 宿主机访问http://192.168.1.11,显示403 Forbidden。 当然也可以反向配置,同时也可以使用IP网段的配置方式,如allow 192.168.1.0/24;,表示满足此网段的IP都可以访问。
如果你想拒绝某个指定URL地址的所有请求,只需要在location块中配置deny all指令:
[root@192 ~]# vim /etc/nginx/conf.d/access_mod.conf server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.hml; deny all; #拒绝所有 } } [root@192 ~]# nginx -t [root@192 ~]# nginx -s reload(2)基于用户的信任登录模块:http_auth_basic_module
有时我们会有这么一种需求,就是你的网站的某些页面不希望公开,我们希望的是某些特定的客户端可以访问。那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那些不速之客。
auth_basic不为off,开启登录验证功能,auth_basic_user_file加载账号密码文件。
3、建立口令文件
[root@192 ~]# yum install -y httpd-tools #htpasswd 是开源 http 服务器 apache httpd 的一个命令工具,用于生成 http 基本认证的密码文件 [root@192 ~]# htpasswd -cm /etc/nginx/auth_conf user10 # -c 创建解密文件,-m MD5加密 [root@192 ~]# htpasswd -m /etc/nginx/auth_conf user20 [root@192 ~]# cat /etc/nginx/auth_conf user10:$apr1$MOa9UVqF$RlYRMk7eprViEpNtDV0n40 user20:$apr1$biHJhW03$xboNUJgHME6yDd17gkQNb04、访问测试