Nginx location 深入剖析
- Nginx 由
内核和模块
组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅是通过查找配置文件将客户端的请求映射到一个location block ,而location 是Nginx 配置中的一个指令,用于访问的URL 匹配,而在这个location 中所配置的每个指令将会启动不同的模块去完成相应的工作。 - 默认nginx.conf 配置文件中至少存在一个
location /
,即表示客户端浏览器请求的URL为域名+“ / ”,如果location / newindex /
,则表示客户端浏览器请求的URL 为域名+“ / newindex / ” 。
一、常见location 匹配 URL 的方式如下:
=
:字面精确匹配;^~
: 最大前缀匹配;/
:不带任何前缀;~
:大小写相关的正则匹配;~*
:大小写无关的正则匹配;@
: lo cation 内部重定向的变量;
1、其中location=
、^~
、/
属于普通字符串匹配;location ~
、~*
属于正则表达式匹配;location 优先级与其在nginx.conf 配置文件中的先后顺序无关。
2、location=
精确匹配会第一个被处理,如果发现精确匹配,Nginx 则停止搜索其他任何location 的匹配。
- 普通字符匹配,正则表达式规则和完整URL规则将被优先查询匹配
^~
为最大前缀匹配,如果匹配到该规则, Nginx 则停止搜索其他任何location 的匹配,否则Nginx 会继续处理其他location 指令。 - 正则匹配
~
和~*
,如果找到相应的匹配,则Nginx 停止搜索其他任何location 的匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用
二、location 规则匹配优先级总结如下:
(location =) > (location 完整路径) > (location ^~路径) > (location ~或~ *正则顺序)> (location 部分起始路径) > (location/ )
以下为Nginx location 规则案例演示:
location = / {
[ configuration L1 ]
#只会匹配/,优先级比location/低
}
location = / index.html {
[ configuration L2 ]
#只会匹配/index.html,优先级最高
}
location /{
[ configuration L3 ]
#匹配任何请求,因为所有请求都是以“/”开始
#但是更长字符匹配或者正则表达式匹配会优先匹配,优先级最低
}
location = /images/ {
[ configuration L4 ]
#匹配任何以/images/开始的请求,并停止匹配其他location
}
location ~*\.(html | txt | gif | jpgl jpeg)$ {
[ configuration L5]
#匹配以html 、txt 、gif ,jpg 、jpeg 结尾的URL 文件请求
#但是所有/images/目录的请求将由[ configuration L4 ]处理
}
浏览器发起HTTP request URI 案例与location 规则案例匹配如下:
/ ->匹配config uration L3;
/ index. html 匹配configuration L2;
/ images / 匹配configuration L4;
/ images/ logo. png 匹配configuration L4;
/ img / test. jpg 匹配configuration L5;
企业生产环境中无须在nginx.conf 配置文件中同时添加5种规则匹配,以下为企业生产环境Nginx location 部分配置代码:
location /
{
root /var/www/html/;
expires 60d;
}
location ~.*\.( git | jpg | jpeg | bmp | png l | ico | txt | js | css)$
{
root /var/www/html/;
expires 60d;
}
location ~.*\.(jsp l phplcgildo)$
{
root /var/www/html/;
proxy_pass http://linux_web;
proxy_http_version1.1;
proxy_set_header Connection"";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location = /newindex.html
{
root/var/www/newwww/;
expires 60d;
}
摘取至:《曝光:Linux企业运维实战》书籍