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/ { … }
匹配优先级
多个 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 作为反向代理服务器存在。