Nginx——location常见配置指令alias、root、proxy_pass

前面说出了一篇关于Nginx安装的文章,这篇就这说下关于Nginx中location的配置,这个很重要。

日常使用中会遇到一个nginx指向不同的系统。页面也好,接口也好,都会进行location的路径匹配和下发,如果location的路径配置规则和优先级不清楚的话,会很麻烦。言归正传,下面开始。

01 【alias】

别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向【alias】配置的路径。如:

location /test/ {

alias /home/sftp/img/;

}

即:请求/test/1.jpg(省略了协议与域名),将会返回文件/home/sftp/img/1.jpg。

02 【root】

根路径配置,用于访问文件系统,在匹配到location配置的URL路径后,指向【root】配置的路径,并把location配置路径附加到其后。如:

location /test/ {

root /home/sftp/img/;

}

即:请求/test/1.jpg(省略了协议与域名),将会返回文件/home/sftp/img/test/1.jpg,相较于alias,使用root会把/test/附加到根目录之后。

即:请求/test/1.jpg(省略了协议与域名),将会返回文件/home/sftp/img/1.jpg。

03 【proxy_pass】

反向代理配置,用于代理请求,适用于前后端负载分离或多台机器、服务器负载分离的场景,在匹配到location配置的URL路径后,转发请求到【proxy_pass】配置的URL,是否会附加location配置路径与【proxy_pass】配置的路径后是否有"/"有关,有"/"则不附加,如:

location /test/ {

proxy_pass http://127.0.0.1:8080/;

}

即:请求/test/1.jpg(省略了协议与域名),将会被nginx转发请求到http://127.0.0.1:8080/1.jpg(未附加/test/路径)。

location /test/ {

proxy_pass http://127.0.0.1:8080;

}

即:请求/test/1.jpg(省略了协议与域名),将会被nginx转发请求到http://127.0.0.1:8080/test/1.jpg(附加/test/路径)。

location /test/ {

proxy_pass http://127.0.0.1:8080/img;

}

即:请求/test/1.jpg(省略了协议与域名),将会被nginx转发请求到http://127.0.0.1:8080/img1.jpg(未附加/test/路径,但附加了/test/之后的路径)。

03 location语法规则

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

nginx转发配置详解(Nginxlocation配置分析)(1)

匹配优先级

多个 location 配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):

1.精确匹配 =

2.前缀匹配 ^~

3.按文件中顺序的正则匹配

4.匹配不带任何修饰的前缀匹配

5.交给/通用匹配

当有匹配成功时候,停止匹配,按当前匹配规则处理请求

注意:前缀匹配,如果有包含关系时,按最大匹配原则进行匹配。比如在前缀匹配:location /dir01 与 location /dir01/dir02,如有请求 将最终匹配到 location /dir01/dir02

示例

nginx配置示例:

location = / {

echo "规则A";

}

location = /login {

echo "规则B";

}

location ^~ /static/ {

echo "规则C";

}

location ^~ /static/files {

echo "规则X";

}

location ~ \.(gif|jpg|png|js|css)$ {

echo "规则D";

}

location ~* \.png$ {

echo "规则E";

}

location /img {

echo "规则Y";

}

location / {

echo "规则F";

}

那么产生的效果如下:

访问根目录 /,比如将匹配 规则A

访问将匹配 规则B, http://localhost/register 则匹配 规则F

访问将匹配 规则C

访问将匹配 规则X,虽然 规则C 也能匹配到,但因为最大匹配原则,最终选中了 规则X。你可以测试下,去掉规则 X ,则当前 URL 会匹配上 规则C。

访问 将匹配 规则D 和 规则 E ,但是 规则 D 顺序优先,规则 E 不起作用,而 则优先匹配到 规则 C

访问 则匹配 规则 E ,而不会匹配 规则 D ,因为 规则 E 不区分大小写。

访问 会匹配上 规则D,虽然 规则Y 也可以匹配上,但是因为正则匹配优先,而忽略了 规则Y。

访问会匹配上 规则Y。

访问则最终匹配到规则 F ,因为以上规则都不匹配,这个时候应该是 Nginx 转发请求给后端应用服务器,比如 FastCGI(php),tomcat(jsp),Nginx 作为反向代理服务器存在。