12.nginx基础模块和location匹配语法优先级

Posted 柯正

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12.nginx基础模块和location匹配语法优先级相关的知识,希望对你有一定的参考价值。

ngx_http_index_module

############## index模块

Syntax: index file ...;              # 语法
Default: index index.html;           # 系统默认
Context: http, server, location      # 环境(放哪)

# 例:
location = / {
    index index.html;
}

ngx_http_autoindex_module

url: 唯一标识符
uri: 域名后面的文件路径

################ 目录索引模块
Syntax: autoindex on | off;        
Default: autoindex off;
Context: http, server, location

# 1. autoindex 系统默认是off,需要改成on,然后注释掉index模块。
# 2.前提是该目录下不能存在index.html文件,如果存在则直接显示页面内容,而不是浏览目录。

# 1.访问modul.zls.com打开主页,加上uri: /zls 访问另外一个页面
server {
		listen 80;
		server_name module.zls.com;
		location / {
		root /code/module;
		index index.html;
		}
		location /zls {
		root /opt/abc;                        # uri:/zls所在的站点目录
		index index.html;
		}
}


# 创建站点目录和index.html页面
[root@web01 ~]# mkdir /code/module -p
[root@web01 ~]# echo 123 > /code/module/index.html
[root@web01 ~]# mkdir /opt/abc/zls -p
[root@web01 ~]# echo 456 > /opt/abc/zls/index.html
# 检查语法
[root@web01 ~]# nginx -t 
# 重新加载配置文件
[root@web01 ~]# nginx -s reload


# 2.把/opt/abc/zls变成一个下载站点(浏览目录,开启autoindex)
server {
		listen 80;
		server_name module.zls.com;
		location / {
		root /code/module;
		index index.html;
		}
		location /zls {
		root /opt/abc;
		autoindex on;
		}
}

# 3.域名后面加down就把/opt/download作为下载站点
server {
		listen 80;
		server_name module.zls.com;
		location / {
		root /code/module;
		index index.html;
		}
		location /zls {
		root /opt/abc;
		autoindex on;
		}
		location /down {
		alias /opt/download;				         # 别名其他目录
		autoindex on;							    # 开启浏览目录
		autoindex_format html;					     # 网页的浏览格式
		autoindex_exact_size off;					 # 关闭详细大小,让他后面有单位	
		autoindex_localtime on;						 # 同步本地服务器时间
		}
}

# 创建下载目录
[root@web01 ~]# mkdir /opt/download
# 检查语法
[root@web01 ~]# nginx -t 
# 重新加载配置文件
[root@web01 ~]# nginx -s reload


# 浏览目录页面的格式,以html显示
autoindex_format html;
# 开启浏览目录的功能
autoindex on;
# 默认情况下是on ,显示详细字节数大小,关闭,带单位
autoindex_exact_size on;
# 默认时区不一样,想要显示本地服务器的时间,改成on
autoindex_localtime off;


# 注意:
# 1.在没有配置任何location的情况下,(location / 不算)直接在域名后面加上路径或者文件,会在location /指定的目录下找该目录或文件
# 2.如果配置了(location /)以外的location,那么在域名后面加目录或者文件,会去location指定的目录下找
# 3.location里面写的是root,那么root指定的目录就代表location /
# 4.root会受到uri的影响,alias不会受到uri的影响

ngx_http_charset_module

################ 字符集模块
# 1.解决乱码,默认字符集是off,如果想要修改字符集,直接加字符集名称,多个字符集用逗号隔开
例:
charset utf-8,gbk;   

utf-8:解决linux的
gbk:解决windows的


# 了解
# 2.除了“文本/html”之外,在具有指定MIME类型的响应中启用模块处理。特殊值“*”匹配任何MIME类型
# 3.确定当从代理服务器或FastCGI/uwsgi/SCGI/gRPC服务器收到的答案已经在“内容类型”响应头字段中带有字符集时,是否应该对这些答案执行转换。如果启用转换,则接收到的响应中指定的字符集将用作源字符集。

ngx_http_stub_status_module

################ Nginx监控状态模块
# ngx_http_stub_status_module模块提供对基本状态信息的访问。
# 默认情况下不构建此模块,应使用--with-http_stub_status_module配置参数启

Syntax:	stub_status;
Default:	—
Context:	server, location

# 添加到server层内,或者location层
server {
		listen 80;
		server_name module.zls.com;
		charset utf-8,gbk;
		location / {
		root /code/module;
		index index.html;
		}
		location /down {
		alias /opt/download;
		autoindex on;
		autoindex_format html;
		autoindex_exact_size off;
		autoindex_localtime on;
		}
		location = /zt {        
         stub_status;
		}
}

http_auth_basic_module

############# 基于用户登入认证模块
ngx_http_auth_basic_module模块允许通过使用“http基本身份验证”协议验证用户名和密码来限制对资源的访问
可以使用“htpasswd”实用程序从Apache HTTP服务器分发版或“openssl passwd”命令生成。

Syntax:	auth_basic string | off;                    # 随便写点东西或者是off就可以开启
Default:	
auth_basic off;
Context:	http, server, location, limit_except
# 例:
location / {                
    auth_basic           "closed site";            
    auth_basic_user_file conf/htpasswd;
}

# 1. 引号里随便写就可以了,想锁哪个location就复制下面3行到某个站点下,用户密码文件需要配一个路径。
# 2. 然后配合htpasswd设置用户和密码(htpasswd命令在httpd服务的包下)。


# 放在nginx状态下
server {
		listen 80;
		server_name module.zls.com;
		charset utf-8,gbk;
		location / {
		root /code/module;
		index index.html;
		}
		location /down {
		alias /opt/download;
		autoindex on;
		autoindex_format html;
		autoindex_exact_size off;
		autoindex_localtime on;
		}
		location = /status {
		stub_status;
		auth_basic "xxx";
		auth_basic_user_file /etc/nginx/pass/abc.pass;
		}
}


# 下载命令包
[root@web01 ~]# yum install -y http-tools
# 创建密码文件目录
[root@web01 ~]# mkdir /etc/nginx/pass
# 设置密码文件
[root@web01 ~]# htpasswd -b -c /etc/nginx/pass/abc.pass zls zls123
Adding password for user zls

# 检查语法
[root@web01 /cole/lol]# nginx -t


# htpasswd:创建一个http协议支持的用户名和加密密码
-b:免交互,直接在命令行输入密码
-c:创建一个新文件,后面跟文件路径(将用户名和加密密码放入)
文件路径后面跟: user password

ngx_http_access_module

################# 基于IP访问控制模块
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
# 规则会按顺序检查,直到找到第一个匹配项。在此示例中,仅允许IPv4网络10.1.1.0/16和192.168.1.0/24(不包括地址192.168.1.1)以及IPv6网络2001:0db8::/32访问。在很多规则的情况下,使用ngx_http_geo_module变量更好。

# allow 允许
# deny 拒绝
# deny all 全部拒绝

# 注意:
deny all; 放最后


# 哪个不想被访问就放在那个location的下面,比如状态:

server {
			...
			...
			location = /zt {
			stub_status;
			allow 10.0.0.8;                                     # 允许被访问的IP
			deny all;
			}
}

技术图片

ngx_http_limit_conn_module

################### 访问限制模块
## 连接频率限制(公网nginx)
Syntax:	limit_conn zone number;
Default:	—
Context:	http, server, location


# 为给定的键值设置共享内存区域和允许的最大连接数。当超过此限制时,服务器将返回错误以回复请求。例如,指令
limit_conn_zone $remote_addr zone=addr:10m;          # 写在http层(般写在主配置文件)

server {                                                         
    location /download/ {
        limit_conn addr 1;                                  # 写在server层,一次只允许每个IP有一个连接
    }

ngx_http_limit_req_module

################### 访问限制模块
## 请求频率的限制
limit_req_zone $remote_addr zone=one:10m rate=1r/s;

server {
    location /search/ {
        limit_req zone=one burst=5 nodelay;
    }


# $remote_addr
客户端 IP
# zone=one
共享内存名字,必须和http层的一样
# 10m
共享内存区域大小
# rate=1r/s
平均请求处理速率不能超过每秒1个请求。
# burst=5
突发不超过5个请求。
# nodelay
过度请求延迟的限制。默认值为零,即所有过多的请求都被延迟。
# 调用limit req变量(http层),zone 指定共享内存空间的名字(http),burst 超过该配置的请求数,则返回503



[root@web01 ~]# vim /etc/nginx/nginx.conf
# 写在http层里面
limit_conn_zone $remote_addr zone=addr:10m;                             # 连接频率限制
limit_req_zone $remote_addr zone=one:10m rate=1r/s;                     # 请求频率的限制

[root@web01 ~]# vim /etc/nginx/conf.d/module.conf
server {
		listen 80;
		server_name module.zls.com;
		charset utf-8,gbk;
		limit_conn addr 1;                               # 连接频率限制
			limit_req zone=one burst=1 nodelay;          # 请求频率的限制
			location / {
			root /code/module;
			index index.html;
			}
			location /down {
			alias /tmp;
			autoindex on;
			autoindex_format html;
			autoindex_exact_size off;
			autoindex_localtime on;
			}
			location = /zt {
			stub_status;
			auth_basic "xxx";
			auth_basic_user_file /etc/nginx/pass/xxx.pass;
			allow 10.0.0.253;
			deny all;
			}
}

HTTP的请求限制比连接限制有效,所以limit_conn不常用

技术图片

location的匹配

location的语法

location [=|^~|~|~*|!~|!~*|/] /uri/ { ...
}

使用Nginx Location可以控制访问网站的路径,但一个server可以有多个location配置, 多个location的优先级该如何区分

Location语法优先级排列

匹配符 匹配规则 优先级
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
!~ 区分大小写不匹配的正则 5
!~* 不区分大小写不匹配的正则 6
/ 通用匹配,任何请求都会匹配到 7
# 可以用这个方法测试优先级
server {
    ...
    location / {
        default_type text/html;          # 定义html页面路径
        return 200 "location /";         # 返回200状态码并且返还内容
    }

location应用场景

# 通用匹配,任何请求都会匹配到
location / {
    ...
}
 
# 严格区分大小写,匹配以.php结尾的都走这个location    
location ~ .php$ {
    ...
}
 
# 严格区分大小写,匹配以.jsp结尾的都走这个location 
location ~ .jsp$ {
    ...
}
 
# 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
location ~* .*.(jpg|gif|png|js|css)$ {
    ...
}
 
# 不区分大小写匹配
location ~* ".(sql|bak|tgz|tar.gz|.git)$" {
    ...
}

以上是关于12.nginx基础模块和location匹配语法优先级的主要内容,如果未能解决你的问题,请参考以下文章

Nginx-location模块

Nginx配置之location模块和proxy模块

Location配置与ReWrite语法

nginx中location配置及匹配详解

Nginx Location匹配规则

location优先级和验证方法及语法