运维之道 | Nginx location 深入剖析

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企业运维实战》书籍

发布了97 篇原创文章 · 获赞 10 · 访问量 3414

猜你喜欢

转载自blog.csdn.net/VillianTsang/article/details/103416291
今日推荐