前端开发掌握nginx常用功能之server&location匹配规则

nginx主要是公司运维同学必须掌握的知识,涉及到反向代理、负载均衡等服务器配置。前端开发尤其是纯前端开发来说对nginx接触的并不多,但是在一些情况下,nginx还是需要前端自己来搞;例如我们公司的开发环境和测试环境,虽然qa可以帮助搞定配置,但是每新增一个前端模块或者模块nginx配置经常变更都求着qa搞,麻烦别人还不如自己来搞,这样更能理解自己的需求。这些都需要前端开发对nginx有所理解,下面我们来说说nginx最基础的server和location匹配规则。

1. server匹配规则

nginx的server块可以配置多个,那么一个请求该匹配那个server块呢,这主要是根据server块的server_namelisten来决定的。其中server_name仅仅检查请求的“Host”头以决定该请求应由哪个虚拟主机来处理。

先看一个例子:

server {
    listen      8001;
    server_name *.net;
}

server {
    listen      8001;
    server_name baidu.net;
}

server {
    listen      8001;
    server_name baidu.*;
}

通过测试,发现相同listen端口的情况下,多个server的匹配顺序如下:

  • 完全匹配优先级最高,匹配则终止
  • 通配符在前的优先级其次,如*.com
  • 通配符在后的优先级次之,如baidu.*
  • 正则匹配优先级最低,如~^.www.test.com$

以上若都没有匹配,那么其会走默认的server,即:

  • 优先选择listen配置项后有default或default_server的server,若没有则:
  • 找到匹配listen端口的第一个server块

一种特殊情况,如果nginx中只为某个listen端口配置一个server块的话,那么nginx是不会根据该端口的server_name进行匹配的。因为只有一个server域,那么根据上面没有匹配的规则的情况下会走第一个匹配listen端口的server块。

server {
    listen    8001;
    server_name baidu.net;
}
server { # server没有配置listen的话,root用户默认是80端口,非root用户默认8080
    server_name server.com;
}

如上面8001端口只有一个server的情况下,任何server_name访问server_name:8001都会匹配上面server块(前提是server_name对应域名能请求到该机器上)。

另一种特殊情况,server块配置的虚拟主机是基于域名和IP混合的。如下所示:

server {
    listen      192.168.1.1:8001;
    server_name example.org www.example.org;
    ...
}
server {
    listen      192.168.1.1:8002;
    server_name example.com www.example.com;
    ...
}

这种情况下,其匹配顺序是:

  • 首先,看请求的IP地址和端口是否匹配某个server配置块中的listen指令配置,匹配则命中该server块,否则执行以下
  • 其次,看请求的Host头是否匹配这个server块中的某个server_name的值,匹配这命中,否则走默认server。

第二点需要补充一下,看请求的Host头是否匹配server_name,要满足一个条件,即通过server_name指定的域名可以访问到当前nginx配置所在的机器,因为通过域名访问nginx所在的机器最终还是通过ip的形式来访问的。

比如,访问www.example.org,最终通过dns解析出nginx所在的ip地址来进行访问的,又因为该server监听8001端口,所以通过www.example.org:8001也可以命中192.168.1.1:8001所在的server块。

2. location匹配规则

一个示例:

location  = / {
  # 精确匹配 / ,主机名后面不能带任何字符串
  [ configuration A ]
}

location  / {
  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
  # 但是正则和最长字符串会优先匹配
  [ configuration B ]
}

location /documents/ {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration C ]
}

location ~ /documents/Abc {
  # 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration CC ]
}

location ^~ /images/ {
  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
  [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 结尾的请求
  # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
  [ configuration E ]
}

location /images/ {
  # 字符匹配到 /images/,继续往下,会发现 ^~ 存在
  [ configuration F ]
}

location /images/abc {
  # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
  # F与G的放置顺序是没有关系的
  [ configuration G ]
}

location ~ /images/abc/ {
  # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
    [ configuration H ]
}

location ~* /js/.*/\.js {
  # 不区分大小写匹配
  [ configuration I ]
}
  • = 开头表示精确匹配,匹配则终止后续查找;如 A 中只匹配根目录结尾的请求,后面不能带任何字符串.
  • ^~ 开头表示uri以某个常规字符串开头,不是正则匹配,匹配则终止后续查找,包括正则匹配,它依然支持最长匹配原则
  • ~ 开头表示区分大小写的正则匹配;
  • ~* 开头表示不区分大小写的正则匹配
  • / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

location 顺序 no优先级:

关于location的优先级需要认知三点:

  • 先匹配普通location,后匹配正则location;因为正则会覆盖普通
  • 普通location匹配与顺序无关,因为采用最长匹配原则;正则location匹配与顺序有关,但是正则location依然采用最长匹配原则
  • 普通location指定了^~则一旦该普通规则匹配上,则不会进行后续匹配了,即使是正则匹配;=严格匹配一旦匹配,也不会后续正则匹配

所以,location的优先级如下:

(location =) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 完整路径)  >  (location 部分起始路径) > (/)

按照上面的location写法,以下的匹配示例成立:

  • / -> config A

    精确完全匹配,即使/index.html也匹配不了

  • /downloads/download.html -> config B

    匹配B以后,往下没有任何匹配,采用B

  • /images/1.gif -> configuration D

    匹配到F,往下匹配到D,停止往下

  • /images/abc/def -> config D

    最长匹配到G,往下匹配D,停止往下

    你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序

  • /documents/document.html -> config C

    匹配到C,往下没有任何匹配,采用C

  • /documents/1.jpg -> configuration E

    匹配到C,往下正则匹配到E

  • /documents/Abc.jpg -> config CC

    最长匹配到C,往下正则顺序匹配到CC,不会往下到E

实际使用建议

所以实际使用中,个人觉得至少有三个匹配规则定义,如下:
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
    proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
    root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
#非静态文件请求就默认是动态请求,自己根据实际把握
#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
    proxy_pass http://tomcat:8080/
}

参考

原文地址:https://www.cnblogs.com/wonyun/p/10309491.html

时间: 2024-10-01 02:55:19

前端开发掌握nginx常用功能之server&location匹配规则的相关文章

前端开发掌握nginx常用功能之rewrite

上一篇博文对nginx最常用功能的server及location的匹配规则进行了讲解,这也是nginx实现控制访问和反向代理的基础.掌握请求的匹配规则算是对nginx有了入门,但是这些往往还是不能满足实际的需求场景,例如请求url重写.重定向等等,这都需要对请求的path进行修改操作的,匹配规则是不能独自完成实际需求的,这就需要掌握nginx的另一个常用功能rewrite,下面就来说说这个常用功能. Rewrite规则 rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正

五年干货分享!前端开发中最常用的JS代码片段

很多网友私信我,说学到js就开始卡壳了,甚至初略的看了一下js,就跳过开始学习框架之类的.这里要提醒你,js是前端的重中之重,如果你忽视了,后果不堪设想! 学好,并熟练的运用这门编程语言真的很难吗?本篇文章为大家总结了一些前端开发中最常用的JS代码片段,希望能对大家的学习以及工作上都能有所帮助,有所收获. HTML5 DOM 选择器 javascript 代码 // querySelector() 返回匹配到的第一个元素 var item = document.querySelector('.i

Nginx之location 匹配规则详解

Nginx之location 匹配规则详解 关于一些对location认识的误区 1. location 的匹配顺序是"先匹配正则,再匹配普通". 矫正: location 的匹配顺序其实是"先匹配普通,再匹配正则".我这么说,大家一定会反驳我,因为按"先匹配普通,再匹配正则"解释不了大家平时习惯的按"先匹配正则,再匹配普通"的实践经验.这里我只能暂时解释下,造成这种误解的原因是:正则匹配会覆盖普通匹配(实际的规则,比这复杂,

nginx location 匹配规则

location匹配规则 ~             #波浪线表示执行一个正则匹配,区分大小写 ~*           #表示执行一个正则匹配,不区分大小写 !~和!~*    #分别为区分大小写不匹配及不区分大小写不匹配 ^~           #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录 =             #进行普通字符精确匹配 @            #"@" 定义一个命名的 location,使用在内部定向时,例如 er

前端开发用nginx代理服务器解决服务器跨域问题及跨域访问https访问(mac系统下)

前端开发经常遇到一些服务器由于跨域造成访问不了的情况.以前BS模式,前后端都是一个人开发,跨域问题造成的开发阻碍不是很明显,但是现在前端框架欣欣向荣,很多时候变成了CS模式的开发,但浏览器天生的跨域限制,造成了开发,特别是对单独的前端开发人员(不太懂后台开发的人)造成一定开发障碍.还好有nodejs及其一系列前端自动化工具很好的解决了开发时的问题.但今天我要说的用nginx代理来解决这个问题.我觉得很简单!以下都是基于mac系统的操作!先看没有代理时,随便访问网上一个接口, http://web

Nginx常用功能配置及优化

---------------------------------------------------------------------------------------- 规范优化Nginx配置文件: ---------------------------------------------------------------------------------------- Nginx的主配置文件为nginx.conf,主配置文件包含所有虚拟主机的子配置文件同一放到extra目录中. 虚

22,Nginx常用功能模块

1,Nginx常用模块(日志切割)1)我们可以在虚拟主机配置定义不同网站日志放到以自己名字命名的日志文件里2)systemctl reload nginxcd /var/log/nginx && ll 4)切割日志,让日志按照每天日期去命名5,logrotate -f /etc/logrotate.d/nginx 切割2,查看Nginx状态模块1)cd /etc/nginx/conf.d2)systemctl restart nginx3)curl www.oldzhang.comrequ

Nginx常用功能举例解析

01. 静态HTTP服务器 说明 Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML.图片)通过HTTP协议展现给客户端. 配置 每个人配置文件路径可能会不同,但格式一样. [[email protected]]# vim /etc/nginx/nginx.conf server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main

前端开发 sublime text 常用插件和配置

前端开发sublimeconfig mac配置 此文件目录中文件主要是关于sublime的插件配置,快捷键配置,主题和字体配置. 插件列表 所有插件都可以使用Package Control安装,具体的安装方法可以自行谷歌安装,不在本文的介绍范围之内.也可以是使用git 手动安装. 1.autoprefixer 该插件主要使编写css更加的方便和快捷,可以配置快捷键给标签属性添加浏览器厂商前缀.安装前需要确定电脑安装node. 配置快捷键如下: //autoprefixer快捷键设置 { "key