一、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/ <html> <head><title>503 Service Temporarily Unavailable</title></head> <body bgcolor="white"> <center><h1>503 Service Temporarily Unavailable</h1></center> <hr><center>nginx/1.12.2</center> </body> </html>

3、设置延迟请求数目:

limit_req zone=allips burst=5 nodelay;

burst=5 表示最大延迟请求数量不大于5。 如果太过多的请求被限制延迟是不需要的 ,这时需要使用nodelay参数,服务器会立刻返回503状态码。

用curl测试发现会有延迟访问,而并不是立即返回503错误