# Nginx——location 常见配置指令,alias、root、proxy_pass 路径问题
1.【alias】
别名配置,用于访问文件系统,在匹配到 location 配置的 URL 路径后,指向【alias】配置的路径。如:
location /test/
{
alias /home/sftp/img/;
}
location /test/aaa/
{
alias /home/sftp/img/;
}
location /test/aaa/bbb/
{
alias /home/sftp/img/;
}
即:请求 /test/1.jpg、/test/aaa/1.jpg、/test/aaa/bbb/1.jpg(省略了协议与域名),将会返回文件 /home/sftp/img/1.jpg。
注意 alias 后面有没有 “/” 要和 location 后面 “/” 保持一致,否则找不到资源文件
2.【root】
根路径配置,用于访问文件系统,在匹配到 location 配置的 URL 路径后,指向【root】配置的路径,并把 location 配置路径附加到其后。如:
location /test/
{
root /home/sftp/img/;
}
即:请求 /test/1.jpg(省略了协议与域名),将会返回文件 /home/sftp/img/test/1.jpg,相较于 alias,使用 root 会把 /test/ 附加到根目录之后。
3.【proxy_pass】
反向代理配置,用于代理请求,适用于前后端负载分离或多台机器、服务器负载分离的场景,在匹配到 location 配置的 URL 路径后,转发请求到【proxy_pass】配置的 URL,是否会附加 location 配置路径与【proxy_pass】配置的路径后是否有 "/“有关,有”/" 则不附加,proxy_pass 带 “/” 类似于 alias 如:
location /test/
{
proxy_pass http://127.0.0.1:8080/;
}
location /test/aaa/
{
proxy_pass http://127.0.0.1:8080/;
}
location /test/aaa/bbb/
{
proxy_pass http://127.0.0.1:8080/;
}
在 tomcat 的 webapp/ROOT/ 放一个 1.png 图片
即:请求 /test/1.jpg、/test/aaa/1.jpg、/test/aaa/bbb/1.jpg(省略了协议与域名),将会被 nginx 转发请求到 http://127.0.0.1:8080/1.jpg(未附加 /test/ 和 /test 子目录路径)。
proxy_pass 不带 “/” 类似于 root 如:
location /test
{
proxy_pass http://127.0.0.1:8080;
}
location /test/aaa
{
proxy_pass http://127.0.0.1:8080;
}
location /test/aaa/bbb
{
proxy_pass http://127.0.0.1:8080;
}
需要在 tomcat webapp/ROOT/ 创建 aaa/bbb 目录 之后把 1.png 方式 aaa 和 bbb 目录中
即:请求 /test/1.jpg,/test/aaa/1.jpg,/test/aaa/bbb/1.jpg(省略了协议与域名),将会被 nginx 转发请求到 http://127.0.0.1:8080/test/1.jpg,http://127.0.0.1:8080/test/aaa/1.jpg,http://127.0.0.1:8080/test/aaa/bbb/1.jpg(附加 /test/ 以及子目录路径)。
以下特殊 是 proxy_pass http://127.0.0.1:8080/img; 带 img 目录的情况
location /test 不能加 “/” 如果加了,那么这个 proxy_pass http://127.0.0.1:8080/img; 也得加 proxy_pass http://127.0.0.1:8080/img/; 否则 http://127.0.0.1:8080/img1.png
{
proxy_pass http://127.0.0.1:8080/img; 效果一样
proxy_pass http://127.0.0.1:8080/img/;
}
location /test/aaaa
{
proxy_pass http://127.0.0.1:8080/img; 效果一样,和 y 一开始说 proxy_pass 末尾加不加 “/” 行为不一样了
proxy_pass http://127.0.0.1:8080/img/;
}
即:请求 /test/1.jpg、/test/aaa/1.jpg(省略了协议与域名),将会被 nginx 转发请求到 http://127.0.0.1:8080/img/1.jpg(未附加 /test/ 和子目录路径)。
匹配规则:
location 语法
location [=||*|^~] /uri/
= 开头表示精确匹配 此时和 location 中的 root 没关系了。至于 location 外面的 root 才能影响 = 的配置路径
- ^~ 开头表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可。nginx 不对 url 做编码,因此请求为 /static/20%/aa,可以被规则 ^~ /static//aa 匹配到(注意是空格)。
- 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
! 和!* 分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
第一:一般匹配和精准匹配
1、精准匹配和一般匹配,uri 后面不带 “/” 匹配
如图:
请求 URL:http://192.168.60.106/zg/ 访问时匹配的是:/zg
2、精准匹配和一般匹配,uri 前面和后面都不带 “/”
如图:
请求 URL:http://192.168.60.106/zg/ 访问时匹配的是:= zg
3、精准匹配和一般匹配,uri 带 "/“和不带”/" 匹配
如图:
请求 URL:http://192.168.60.106/zg/ 访问时匹配的是:/zg/ 顺序换也是一样
综上所述:路径相同时的精准匹配优先,必须是满足 /uri/ 或者 uri,要么 uri 两边都加 /,要么 uri 两边都不加斜杆的情况
4、精准匹配 就是访问路径和 location 后面的完全一样 包括(前后的 "/")
server {
listen 80;
server_name localhost;
root /opt/wubo; 起作用 全局
index 1.html; 起作用 全局
location = /jetto {
root和alias此时不起作用;
index index.html;也不起作用;
}
正则
location ~ /jetto/.*/\.html {
root和alias此时不起作用;
index index.html;也不起作用;
}
正则
location ~ /wubo/(.*\.mp4) {
root和alias此时起作用;
alias video/mp4/$1;
#echo_sleep 4;
#echo "2222";
#alias video/mp4;
#mp4;
#index wubo.mp4;
}
正则
location ~ /jetto {
root和alias此时起作用;
index index.html;也起作用;
}
}
访问路径:http://ip:port/jetto 本地真实路径:/opt/wubo/jetto 如果没有上面红色部分默认是 /opt/wubo/html/jetto
5、通用匹配 以最长 uri 匹配优先
server {
listen 80;
server_name localhost;
root /opt/wubo; 起作用 全局
index 1.html; 起作用 全局
location /jetto {
#root alias index起作用,此时root alias的路径想对与全局的相对路径;index 会覆盖全局 index 的默认值
#root /opt/wubo/html; # 本地真实路径/opt/wubo/html/jetto
#root html; #本地真实路径/opt/wubo/html/jetto
#root /opt/wubo/jettopro; #本地真实路径/opt/wubo/jettopro/jetto
#root jettopro; #本地真实路径/opt/wubo/jettopro/jetto
#alias /opt/wubo/jettoapi; #本地真实路径/opt/wubo/jettoapi
alias jettoapi; #本地真实路径/opt/wubo/jettoapi
index index.html jwplayer.html;
}
}
访问路径:http://ip:port/jetto 本地真实路径:/opt/wubo/jetto/1.html 如果没有上面红色部分默认是 /opt/wubo/html/jetto/index.html
第二:^~ 开头的非正则匹配和一般匹配
^~ 代表非正则匹配,非正则,不需要继续正则匹配。
^~
~: 如果这个匹配使用〜前缀,搜索停止。这个前缀官网和网上都说得很含糊,加上这个前缀,是会停止搜索正则匹配,但是对一般匹配是不会停止的,也就是说还是可以匹配到一般匹配的。
请求 url: http://ip:port/images/aa/test.jpg,匹配结果:/images/aa/
http://ip:port/api/ 匹配结果:/jettoapi/index.html
http://ip:port/api/wubo 匹配结果:/jettoapi/index.html
意思就是说 ^~ 的作用对一般匹配不会停止,对正则匹配会停止正则匹配是: ~
- 7、^~ 开头的非正则匹配和正则匹配
- 开头表示区分大小写的正则匹配
如图:
请求 url: http://192.168.60.106/images/aa/test.jpg,匹配结果:^~/images/
location /api {
alias jettoapi; #/opt/wubo/jettoapi
index 1.html;
}
访问路径:http://ip:port/api/wubo 本地路径:/opt/wubo/jettoapi/wubo/1.html
location /api/wubo {
alias jettoapi; #/opt/wubo/jettoapi
index 1.html;
}
访问路径:http://ip:port/api/wubo 本地路径:/opt/wubo/jettoapi/1.html
访问路径和 location 中的路径完全匹配的话 就不需要在本地真实路径下有对应的访问路径,如果 location 的路径只是访问路径中一部分,则需要在本地路径有对应访问中的路径
8、严格精准匹配和正则匹配
如图:
严格精准匹配,如果被严格精准匹配到了,则不会继续搜索正则匹配
如果 http://192.168.60.106, 这个就严格精准匹配到了 /, 则不会继续匹配~.html$
如果:http://192.168.60.106/index.html,则会被 / 匹配到,但不是严格精准匹配,则会继续搜索正则匹配
9、正则匹配规则
都是正则 uri 的情况下,匹配是按照编辑顺序的
如图
请求 URL:http://192.168.60.106/prefix/index.html,会优先匹配前面定义的 location。
10、@开头的 uri
如图:
@开头的,如果请求的 URI 存在,则本 nginx 返回对应的页面;如果不存在,则把请求代理到 baidu.com 上去做个弥补,其实就是做了一个容错,把找不到的 url 全部转发到 fallback 的反向代理服务器去。
最后总结:
-
先判断精准命中,如果命中,立即返回结果并结束解析过程
-
判断普通命中,如果有多个命中,记录下来最长的命中结果
3、如果是 ^~ 开头的命中,则不会继续搜索正则命中,但是会继续搜索一般命中
- 继续判断正则表达式的解析结果,按配置里的正则表达式顺序为准,由上到下开始匹配,一旦匹配成功立刻返回结果,并结束解析过程。
延伸分析:a. 普通命中:顺序无所谓,是因为按命中长短来确定的 b. 正则命中:顺序有所谓,因为是从前往后命中的
注意:当和正则一起使用寻找目录的时候,以下一定是配套的使用。A 相当于定义局部资源目录,B 相当于在 A 定义好的资源目录里面寻找资源
C 是在全局定义一个资源目录
A: location /wubo {
alias video/mp4; #/opt/wubo/video/mp4
}
B: location ~ /wubo/.mp4$ {
mp4;
#limit_conn addr 20;
#limit_rate 2000k;
}
访问:http://ip:port/wubo/wubo.mp4
server: root /opt/wubo/video/mp4;
C:location ~ .mp4$ {
mp4;
#limit_conn addr 20;
#limit_rate 2000k;
}
访问:http://ip:port/wubo.mp4
https://blog.csdn.net/shangrila_kun/article/details/89643964
Nginx 是什么
Nginx(发音同 engine x)是一个异步框架的 Web 服务器,也可以用作反向代理,负载平衡器 和 HTTP 缓存。
也有人这么解释
nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;
同时也是一个 IMAP、POP3、SMTP 代理服务器;
nginx 可以作为一个 HTTP 服务器进行网站的发布处理,
另外 nginx 可以作为反向代理进行负载均衡的实现。
nginx.conf 的目录结构
nginx.conf 的目录结构
整个 conf 文件分为 ** 全局块、events 块、http 块、server 块、location 块 **。每个块有每个块的作用域,越外层的块作用域就包含内部块的作用域,如全局块作用域就包含 events 块、http 块、server 块和 location 块
#全局块
event { #events 块
…
}
http { #http 块
server{ #server块
... #server全局块
location{ #location块
...
}
location{ #location块
...
}
}
server{ #server块
...
}
... #http全局块
}
http 块
http 块是 Nginx 服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这模块中。作用包括:文件引入、MIME-Type 定义、日志自定义、是否使用 sendfile 传输文件、连接超时时间、单连接请求数上限等。
server 块
server 块,虚拟主机(虚拟服务器)。作用:使得 Nginx 服务器可以在同一台服务器上至运行一组 Nginx 进程,就可以运行多个网站。
location 块
location 块是 server 块的一个指令。作用:基于 Nginx 服务器接收到的请求字符串,虚拟主机名称(ip,域名)、url 匹配,对特定请求进行处理。
location 说明
location 语法
location [=||*|^~|@] /uri/ … } ,意思是可以以 “=” 或 “ ~* ” 或 “ ~ ” 或 “ 指令块,整个意思是对于满足这样条件的 /uri/ 适用指令块 {…} 的指令。
location 的分类
location 分为两类,一类为普通 location,一类为正则 location。
多个 location 场景下的 location 匹配
Nginx 的 location 匹配规则是:“正则 location” 让步 “普通 location” 的严格精确匹配结果;但覆盖 “普通 location ” 的最大前缀匹配结果。
例子 1 先普通 location,再正则 location 匹配
server {
listen 9090;
server_name localhost;
location / {
root html;
index index.html index.htm;
deny all;
}
location ~ .html$ {
allow all;
}
}
例子 2 普通 location 的 “隐式” 严格匹配
// 在例子 1 的基础上增加精确匹配
server {
listen 9090;
server_name localhost;
location /exact/match.html {
allow all;
}
location / {
root html;
index index.html index.htm;
deny all;
}
location ~ .html$ {
allow all;
}
}
# 正则 location 与编辑顺序
location 的指令与编辑顺序无关,这句话不全对。对于普通 location 指令,匹配规则是:最大前缀匹配(与顺序无关),如果恰好是严格精确匹配结果或者加有前缀 “^~” 或 “ = ”(符号 “ = ” 只能严格匹配,不能前缀匹配),则停止搜索正则 location ;但对于正则 location 的匹配规则是:按编辑顺序逐个匹配(与顺序有关),只要匹配上,就立即停止后面的搜索。
server
listen 9090;
server_name localhost;
location ~ \.html$ {
allow all;
}
location ~
}
server
listen 9090;
server_name localhost;
location ~
location ~ .html$ {
allow all;
}
}