李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
工具
正文
Nginx文件结构和Location配置介绍
Leefs
2020-11-22 PM
2292℃
0条
# Nginx文件结构和Location配置介绍 ### 一、Nginx文件结构 ```nginx ... #全局块 events { #events块 ... } http #http块 { ... #http全局块 server #server块 { ... #server全局块 location [PATTERN] #location块 { ... } location [PATTERN] { ... } } server { ... } ... #http全局块 } ``` 1、全局块:配置影响Nginx全局的指令。一般有运行Nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。 2、events块:配置影响Nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网络连接,开启多个网络连接序列化等。 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。 4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。 5、location块:配置请求的路由,以及各种页面的处理情况。 ### 二、Location指令语法 **1、Location在语法块的位置** ```nginx http { #协议级别 include mime.types; default_type application/octet-stream; keepalive_timeout 65; gzip on; server { #服务器级别 listen 80; server_name localhost; location / { #请求级别 root html; index index.html index.htm; } } } ``` + laction是在server块中配置 + 可以根据不同的 URI 使用不同的配置(location 中配置),来处理不同的请求 + location 是有顺序的,会被第一个匹配的location 处理 **2、Location区段** 通过指定模式来与客户端请求的URI相匹配,基本语法如下: ```nginx location [=|~|~*|^~|@] pattern{ ...... } ``` (1)没有修饰符 表示:必须以指定模式开始,如: ```nginx server{ server_name baidu.com; location /abc{ ...... } } ``` 如下匹配正确: > http://baidu.com/abc > http://baidu.com/abc?p1 > http://baidu.com/abc/ > http://baidu.com/abcde (2)`=`表示:必须与指定的模式精确匹配,如: ```nginx server{ server_name baidu.com; location = /abc{ ...... } } ``` 如下匹配正确: > http://baidu.com/abc > > http://baidu.com/abc?p1 如下匹配错误: > http://baidu.com/abc/ > > http://baidu.com/abcde (3)`~`表示:指定的正则表达式要区分大小写 ```nginx server{ server_name baidu.com; location ~ ^/abc$ { ...... } } ``` 如下匹配正确: > http://baidu.com/abc > http://baidu.com/abc?p1=11&p2=22 如下匹配错误: > http://baidu.com/ABC > http://baidu.com/abc/ > http://baidu.com/abcde (4)`~*` 表示:指定的正则表达式不区分大小写 ```nginx server{ server_name baidu.com; location ~* ^/abc${ ....... } } ``` 如下匹配正确: > http://baidu.com/abc > > http://baidu..com/ABC > > http://baidu..com/abc?p1=11&p2=22 如下匹配错误: > http://baidu.com/abc/ > http://baidu.com/abcde (5)`^~` 类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配,那么就停止搜索其他模式了 (6)`@`表示:定义命名location区段,这些区段客户段不能访问,只可以由内部产生的请求来访问,如try_files或error_page等 **查找顺序和优先级** > 1:带有“=”的精确匹配优先 > > 2:没有修饰符的精确匹配 > > 3:正则表达式按照他们在配置文件中定义的顺序 > > 4:带有“^~”修饰符的,开头匹配 > > 5:带有“~” 或“~\*” 修饰符的,如果正则表达式与URI匹配 > > 6:没有修饰符的,如果指定字符串与URI开头匹配 **Location区段匹配示例** ```nginx location = / { # 只匹配 / 的查询. [ configuration A ] } location / { # 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。 [ configuration B ] } location ^~ /images/ { # 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。 [ configuration C ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配任何以gif, jpg, or jpeg结尾的文件,但是所有 /images/ 目录的请求将在Configuration C中处 理。 [ configuration D ] } ``` **各请求的处理如下例:** > / → configuration A > > /documents/document.html → configuration B > > /images/1.gif → configuration C > > /documents/1.jpg → configuration D **(7)root、alias指定区别** ```nginx location /img/ { alias /var/www/image/; } ``` + 若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件 ```nginx location /img/ { root /var/www/image; } ``` + 若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。 **区别:** 1、alias是一个目录别名的定义,root则是最上层目录的定义 2、alias后面必须要用“/”结束,否则会找不到文件的,而root则可有可无 **3、总结** (1)规则分类 其中`“~ ”`和`“~”`以及`“!~”和“!~”`前缀表示正则location . 其他前缀(包括:“=”,“^~”和“@ ”)和无任何前缀的都属于普通location . (2)语法规则总结 + `=` 开头表示精确匹配 + `^~` 开头表示uri以某个常规字符串开头, 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。 + `~` 开头表示区分大小写的正则匹配 + `~*` 开头表示不区分大小写的正则匹配 + `!~和!~*`分别为区分大小写不匹配及不区分大小写不匹配 的正则 + `/` 通用匹配,任何请求都会匹配到。 (3)Location的匹配顺序 1. 先进行精准匹配,如果命中,会直接返回并终止解析过程 2. 进行一般匹配,如果没有命中结果,直接进行下一步;如果命中一个,记录该匹配结果,如果命中多个,记录`匹配最长的结果`,然后继续解析。 3. 进行正则匹配(正则匹配是从上到下的顺序匹配),一旦命中匹配,则直接返回匹配结果并停止解析;如果没有命中且第二部中有记录的匹配结果,则返回第二步记录的匹配结果。 ### 正则表达式 | 表达式 | 含义 | | -------- | ------------------------------------------ | | . | 匹配除换行符以外的任意字符 | | \w | 匹配字母或数字或下划线或汉字 | | \s | 匹配任意的空白符 | | \d | 匹配数字 | | \b | 匹配单词的开始或结束 | | ^ | 匹配字符串的开始 | | $ | 匹配字符串的结束 | | * | 重复零次或更多次 | | + | 重复一次或更多次 | | ? | 重复零次或一次 | | {n} | 重复n次 | | {n,} | 重复n次或更多次 | | {n,m} | 重复n到m次 | | *? | 重复任意次,但尽可能少重复 | | +? | 重复1次或更多次,但尽可能少重复 | | ?? | 重复0次或1次,但尽可能少重复 | | {n,m}? | 重复n到m次,但尽可能少重复 | | {n,}? | 重复n次以上,但尽可能少重复 | | \W | 匹配任意不是字母,数字,下划线,汉字的字符 | | \S | 匹配任意不是空白符的字符 | | \D | 匹配任意非数字的字符 | | \B | 匹配不是单词开头或结束的位置 | | [^x] | 匹配除了x以外的任意字符 | | [^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 | *附:* [参考文章连接](https://blog.csdn.net/u012156872/article/details/104114115)
标签:
nginx
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/954.html
上一篇
Nginx反向代理介绍
下一篇
Nginx负载均衡介绍
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
设计模式
Spark Streaming
SpringCloudAlibaba
Quartz
Livy
随笔
JavaSE
JavaScript
Git
Hadoop
Scala
Eclipse
序列化和反序列化
RSA加解密
并发编程
Zookeeper
Java
MyBatisX
Redis
Python
数学
机器学习
Linux
容器深入研究
SQL练习题
递归
微服务
Kibana
排序
FileBeat
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭