一、Nginx主机访问控制
ngx_http_access_module
说明:控制允许/不允许某些客户机访问此网站
Directives
allow
deny
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
例:
allow 192.168.11.11; 允许此IP的主机访问此网站
deny 192.168.11.1; 拒绝此IP的主机访问此网站
deny 192.168.11.0/24; 拒绝此网段的主机访问此网站
deny all; 拒绝任何IP的主机访问此网站
二、nginx用户访问控制
ngx_http_auth_basic_module
1、需求:
当在浏览器中输入网站服务器的域名(网址)或IP地址回车后,显示一个输入用户名、密码的对话框,当用户输入的信息正确时就会显示网站的页面内容,否则提示错误。
有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问。那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那些不速之客。我们在服务课程中学习过apache的访问控制,对于Nginx来说同样可以实现,并且整个过程和Apache 非常的相似。
2、步骤:
location / { root /105/html; index index.html index.htm; auth_basic "haha dialog"; auth_basic_user_file /usr/local/nginx/passwd.db; }
说明:auth_basic是指定启用用户身份认证模块,并指定对话框的关键字为haha dialog。
auth_basic_user_file 是指定用户账号数据文件为 /usr/local/nginx/passwd.db;
注意:htpasswd软件默认是没有安装的,需要安装httpd-tools软件。用yum install -y httpd-tools安装。
[root@web html]# htpasswd -c /usr/local/nginx/passwd.db user1 新建user1用户,密码用0 [root@web html]# htpasswd /usr/local/nginx/passwd.db alice 新建alice用户,密码用0 New password: Re-type new password: Adding password for user alice
3、查看账号文件
[root@node12 conf.d]# cat /usr/local/nginx/passwd.db //查看账号文件 user1:$apr1$NJUedIR4$cou/zQzvgODL1rN8E5.mf0 alice:$apr1$o7c78TxO$3RAuIEmercU/q5e6QU.Ls1
注意:-c选项 是重新创建用户账号文件,只有第一次没有密码文件的时候需要添加,第二次再添加账户的时候,不需要跟-c
4、步骤回顾
①改配置文件
②创建密码文件
③重启服务
④访问测试
curl 192.168.11.12:8011 匿名访问网站,提示401错误,即身份验证错误
curl 192.168.11.12:8011 -u user1:0 用user1及密码访问网站,正常显示出网页内容
三、连接频率限制
ngx_http_limit_conn_module
Directives:
limit_conn
limit_conn_log_level
limit_conn_status
limit_conn_zone
limit_zone
1、需求
经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的***访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制。
ngx_http_limit_conn_module 模块可以根据定义的key来限制每个键值的连接数,如同一个IP来源的连接数。
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
2、示例:
设置一个缓存区保存不同key的状态,大小10m。使用远程ip来作为key,以此限制每个源IP的链接数
http { limit_conn_zone $binary_remote_addr zone=one:10m; } server { location / { ... limit_conn one 2; //定义每个IP的并发连接数量,特别注意这里最高只能限制到2,高了无效 } }
3、ab测试:
注意:ab命令默认是没有安装的,需要安装httpd-tools软件。用yum install -y httpd-tools安装。
[root@tomcat nginx]# ab -n 1000 -c 1000 192.168.11.12:8011/index.htm
解释:-n 是指定请求(request)次数,-c是指定并发数
4、连接与请求
connection 连接,tcp连接
request http请求,GET/POST/DELETE/UPLOAD
5、注释:
客户端的IP地址作为键。
$remote_addr 变量的长度为7字节到15字节
$binary_remote_addr 变量的长度是固定的4字节
如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503错误 (Service Temporarily Unavailable)
四、请求频率限制
ngx_http_limit_req_module
Directives
limit_req
limit_req_log_level
limit_req_status
limit_req_zone
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http
Syntax: limit_req zone=name [burst=number] [nodelay];
Default: —
Context: http, server, location
1、示例:
设置一个缓存区reqps保存不同key的状态,大小10m。这里的状态是指当前的过量请求数。
http { //定义在http里面,server的外面 ... limit_req_zone $binary_remote_addr zone=reqps:10m rate=5r/s; //定义每个IP的每秒请求数量,限制每秒5个连接请求,不延迟 } server { location / { ... limit_req zone=reqps nodelay; //限制每IP的每秒的PHP页面请求次数为上面定义的rate的值:每秒5个请求,不延迟 } }
# tail -f /var/log/nginx/error.log 2018/02/23 15:36:59 [error] 3859#0: *10000 limiting requests, excess: 0.550 by zone "reqps", client: 192.168.245.176, server: www.web2.com, request: "GET / HTTP/1.0", host: "www.web2.com"
可以尝试设置限制请求数为1,用curl快速访问服务器,发现速度太快立即返回503错误。可以设置延迟请求数目
2、设置延迟请求之前:
[root@tomcat nginx]# curl http://www.web2.com/
503 Service Temporarily Unavailable
3、设置延迟请求数目:
limit_req zone=allips burst=5 nodelay;
burst=5 表示最大延迟请求数量不大于5。 如果太过多的请求被限制延迟是不需要的 ,这时需要使用nodelay参数,服务器会立刻返回503状态码。
用curl测试发现会有延迟访问,而并不是立即返回503错误