Nginx 是一款自在的、开源的、高性能的 HTTP 服务器和反向代理服务器,此文次要是记录一下在 Nginx 配置时,location 应该如何配置。
http 区块
Nginx 的 HTTP 配置次要包含三个区块,构造如下:
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;
}
}
}
location 区块
location 是 Nginx 服务器十分外围的配置,用于匹配指定的 uri(申请 uri 不蕴含查问字符串,如http://localhost:8080/test?id=10
,申请 uri 是 /test)。个别在批改 Nginx 配置时,大部分也是围绕着 location 这个配置进行批改。
不局部状况下其实是不须要很简单的配置的,做个动静拆散曾经能满足绝大多数单体服务的;而在分布式环境下,某个 server 中通常须要配置很多 location,来将申请散发到不同的微服务下,此时你必须十分相熟 location 的配置和匹配规定,否则真是无从下手。
上面来看一下一个简略的 location 配置:
location / {
root home/;
index index.html;
}
根本语法
location [= | ~ | ~* | ^~ | @] uri {...}
意思是能够用 =
或 ~
或 ~
* 或 ^~
或@
符号为前缀,当然也能够没有前缀(因为 [A] 是示意可选的 A;A|B 示意 A 和 B 选一个,下面的样例就属于没有符号前缀的例子),紧接着是 uri,再接着是{…} 指令块,整个意思是对于满足这样条件的 uri 实用指令块 {…} 的指令。
匹配模式
所有的模式能够分为两种,匹配程序也是基于这两种模式来进行解决的:
- 一般字符串(literal strings),是以无前缀、
=
、^~
三种模式的 uri; - 正则表达式(regular expression),是以
~
或~*
前缀两种模式的 uri;
匹配程序
- 一般字符
=
准确匹配。如果发现准确匹配,nginx 进行搜寻其余匹配 - 其余一般字符匹配,先匹配所有一般字符串,将最准确 (命中长度) 的匹配临时存储;
- 如果第 2 步中有
^~
命中的,则跳过第 4 步,间接到第 5 步; - 依照配置文件中的申明程序进行正则表达式匹配,只有匹配到一条正则表达式,则进行匹配,取正则表达式为匹配后果;
- 如果所有正则表达式都匹配不上,则取之前一般字符串中存储的后果;
- 如果一般字符串和正则表达式都匹配不上,则报 404 NOT FOUND。
总结一下就是:一般命中程序无所谓,因为是按命中精准度来确定的;正则命中辨别程序,因为是从返回后命中的,命中一个后就不会持续匹配下一个正则。
example
-
无前缀
示意:必须以指定模式开始:server { listen 80; server_name localhost; location /abc {……} } 那么,如下是对的:http://baidu.com/abc http://baidu.com/abc?p1 http://baidu.com/abc/ http://baidu.com/abcde
-
^~
示意:相似于 无前缀 修饰符的行为,区别是,如果此模式匹配,是会进行搜寻正则匹配的,然而会持续搜寻一般模式。 -
=
示意:必须与指定的 uri 准确匹配server { listen 80; server_name localhost; location = /abc {……} } 那么,如下是对的:http://baidu.com/abc http://baidu.com/abc?p1 如下是错的:http://baidu.com/abc/ http://baidu.com/abcde
-
~
示意:指定的正则表达式要辨别大小写server { listen 80; server_name localhost; 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
-
~*
示意:指定的正则表达式不辨别大小写server { listen 80; server_name localhost; 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
-
@
示意:这些 location 区段客户端不能拜访,只能够由外部产生的申请来拜访,如 try_files 或 error_page 等,以 error_page 为例:server { listen 80; server_name localhost; error_page 404 @fallback location /abc { // 检测文件 4.html 和 5.html, 如果存在失常显示, 不存在就去查找 @qwe 值 try_files /4.html /5.html @fallback; } location @fallback {proxy_pass http://www.baidu.com; -- 跳转到百度页面} }
当 uri 匹配上
/abc
时,会按程序检测文件的存在性,并且返回找到的第一个文件,最初一项就是跳转到百度,这种写法能够代替本来罕用的 rewrite,貌似能够进步解析效率;
root&alias 区别
Nginx 指定文件门路有两种形式 root 和 alias,两种指令有不同的应用办法和作用域,root 能够配置在 http、server、location、if 区块中,然而 alias 只能配置在 location 区块中。
root 与 alias 次要区别在于 Nginx 如何解释 location 前面的 uri,这会使两者别离以不同的形式将申请映射到服务器文件上。
-
root 的处理结果是:root 门路+location 门路
location ^~ /appImg/{root /home/nginx;}
这个 location 相当于拜访服务器上的文件门路:/home/nginx/appImg/abc.jpg
-
alias 的处理结果是:应用 alias 门路替换 location 门路
location ^~ /appImg/{alias /home/nginx/;}
这个 location 相当于拜访服务器上的文件目录:/home/nginx/abc.jpg(即 alias 不会应用 location 前面配置的门路),而且如果 alias 指定的是目录,前面肯定要加上
/
,否则会找不到文件。