NGINX调优系列(5)--- 通过location字段实现访问控制(来源访问控制,文件执行权限优化,防范ddos攻击)
(1)来源访问控制
该功能需要ngx_http_access_module模块支持,不过一般默认是安装的。
[root@centos7 ~]# vim /usr/local/nginx/conf/nginx.conf //写法类似Apache
location / {
allow 192.168.1.0/24;
deny all;
}
# 以js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF|ico后缀结尾的访问不记录入access日志内。
location ~* .*\.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF|ico)$ {
access_log off;
}
#不执行images目录下的所有以php|php5|js|py|pl|sh结尾的文件
location ~* ^/images/.*\.(php|php5|js|py|pl|sh)$ {
deny all;
}
#不执行images目录下的one目录和two目录下的php|php5|js|py|pl|sh结尾的文件
#这里有点绕,解释下,()是一个子正则表达式,|是或者的意思,.*表示任意字符,\是转义字符的意思
# $符号表示字符串结尾,这样就是一个多级目录的正则表达式规则访问控制。
location ~* ^/images/(one|two).*\.(php|php5|js|py|pl|sh)$ {
deny all;
}
location匹配命令
~ 表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
= 进行普通字符精确匹配
@ 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
location的分类:
~和~*表示这个匹配规则是正则匹配
=,^, ^~ 这样的都是普通匹配规则,=是普通精确匹配,优先级最高。
=前缀的指令严格匹配这个查询。如果找到,停止搜索。
所有剩下的常规字符串,最长的匹配。如果这个匹配使用^?前缀,搜索停止。
正则表达式,在配置文件中定义的上下顺序决定哪个生效。
location 匹配的优先级(与location在配置文件中的顺序无关)
= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。
也就是说,首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
location = / { # 只匹配"/".
#普通精确匹配
[ configuration A ]
}
location / { # 匹配任何请求,因为所有请求都是以"/"开始,但是更长字符匹配或者正则表达式匹配会优先匹配
#普通匹配
[ configuration B ]
}
location ^~ /images/ { # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
#普通匹配
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ { # 匹配以 gif, jpg, or jpeg结尾的请求. 但是所有 /images/ 目录的请求将由 [Configuration C]处理. 注意,这个是正则匹配了,但是执行的是c,如果有c的话
[ configuration D ]
}
(2),防范ddos攻击
root@centos6 ~]# vim /usr/local/nginx/conf/nginx.conf
http字段中配置
limit_conn_zone $binary_remote_addr zone=addr:10m;
server的location字段配置
location / {
root html;
limit_conn addr 1;
}