0%

nginx学习笔记:访问控制

写在前面

这则笔记主要整理访问控制相关的配置。

访问控制依赖于http_access_module模块,默认已经安装。主要包括以下几部分内容:

  • 用户访问控制

  • 访问限速

  • 用户认证

用户访问控制

语法:

allow/deny [参数]

常用参数 说明
address 表示地址
CIDR 表示网段
unix: 指定了特殊值,则允许访问所有UNIX域套接字socket
all 表示所有

基于location进行访问限制

  • 访问指定目录,直接返回403
1
2
3
4
location /aming/
{
deny all;
}
  • 正则匹配,用户请求指定字段的文件,直接返回403
1
2
3
4
location ~ ".bak|\.ht"
{
return 403;
}
  • 请求的uri中包含data、cache、tmp、image、attachment并且以.php结尾的,全部禁止访问。
1
2
3
4
location ~ (data|cache|tmp|image|attachment).*\.php$
{
deny all;
}

基于$document_uri进行访问控制

$document_uri要跟if判断配合,等价于location匹配。

  • 请求uri为/admin.php时返回403状态码
1
2
3
4
5
//此处的/表示根目录
if ($document_uri = /admin.php)
{
return 403;
}
  • 请求的uri包含data或者cache目录,并且是php时,返回403状态码
1
2
3
4
if ($document_uri ~ '/data/|/cache/.*\.php$')
{
return 403;
}

基于$request_uri访问控制

$request_uri比$docuemnt_uri多了请求的参数。
主要是针对请求的uri中的参数进行控制。

  • 请求参数包括9至12位数字的,直接返回403
1
2
3
4
if ($request_uri ~ "gid=\d{9,12}")
{
return 403;
}

基于$user_agent进行访问控制

user_agent包含以上关键词的请求,全部返回403状态码。

1
2
3
4
if ($user_agent ~ 'YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato')
{
return 403;
}

基于$http_referer进行访问控制(防盗链)

从百度而来访问的链接直接返回404状态码,或者返回一段html代码。

1
2
3
4
5
6
7
8
9
10
11
if ($http_referer ~ 'baidu.com')
{
return 404;
}

或者

if ($http_referer ~ 'baidu.com')
{
return 200 "<html><script>window.location.href='//$host$request_uri';</script></html>";
}

访问限速

访问限速需要依赖ngx_http_limit_conn_module和ngx_http_limit_req_module模块来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
http {
//设置白名单
geo $limited {
default 1;
127.0.0.1/32 0;
192.168.100.0/24 0;
}

map $limited $limit {
1 $binary_remote_addr;
0 "";
}
//设置对应的共享内存限制域和允许被处理的最大请求数阈值。 如果请求的频率超过了限制域配置的值,请求处理会被延迟;如果延迟请求数超过了定义的阈值,就会返回503 (Service Temporarily Unavailable) 错误。
limit_req_zone $limit zone=test:10m rate=1r/s;

server {
location ^~ /download/ {
//定义允许超过频率限制的请求数不多于5个
limit_req zone=test burst=5;
}
}
}

访问用户控制

用户认证,需要配合httpd来实现。

  • 安装httpd

    1
    yum install -y httpd
  • 使用htpasswd生产密码文件

1
2
3
4
5
6
//创建密码
//-c 指定文件名
htpasswd -c /usr/local/nginx/conf/htpasswd test

//追加生产用户密码
htpasswd /usr/local/nginx/conf/htpasswd test-1
  • 配置nginx用户认证
1
2
3
4
5
location  /admin/
{
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!