Nginx 静态服务器与动静分离(三)
Nginx - 静态服务器
在公司中经常会遇到静态服务器,通常会提供一个上传的功能,其他应用如果需要静态资源就从该静态服务器中获取。
在/Users/chengzhi/test/nginx(此目录可自定义)目录下分别创建image、img和document目录,分别在每个目录下放一个文件。
自定义变量使用set指令,语法 set 变量名值;引用使用变量名值;引用使用变量名; 这里自定义了doc_root变量。
静态服务器location的映射一般有两种方式:
-
使用路径,如 /images/ 一般图片都会放在某个图片目录下, -
使用后缀,如 .jpg、.png 等后缀匹配模式
访问http://localhost:8004/nginx.jpg
会映射到 $doc_root/img
访问http://localhost:8004/images/nginx.jpg
当同一个路径满足多个location时,优先匹配优先级高的location,由于^~
的优先级大于 ~
, 所以会走/images/
对应的location
常见的location路径映射路径有以下几种:
-
=
进行普通字符精确匹配。也就是完全匹配。 -
^~
前缀匹配。如果匹配成功,则不再匹配其他location。 -
~
表示执行一个正则匹配,区分大小写 -
~*
表示执行一个正则匹配,不区分大小写 -
/xxx/
常规字符串路径匹配 -
/
通用匹配,任何请求都会匹配到
location优先级
当一个路径匹配多个location时究竟哪个location能匹配到是有优先级顺序的,而优先级的顺序与location值的表达式类型有关,和在配置文件中的先后顺序无关。相同类型的表达式,字符串长的会优先匹配。
以下是按优先级排列说明:
-
等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项,停止搜索。 -
^~
类型表达式,不属于正则表达式。一旦匹配成功,则不再查找其他匹配项,停止搜索。 -
正则表达式类型( ~ ~*
)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。 -
常规字符串匹配类型。按前缀匹配。 -
/ 通用匹配,如果没有匹配到,就匹配通用的
优先级搜索问题:不同类型的location映射决定是否继续向下搜索
-
等号类型、 ^~
类型:一旦匹配上就停止搜索了,不会再匹配其他location了 -
正则表达式类型( ~ ~*
),常规字符串匹配类型/xxx/
: 匹配到之后,还会继续搜索其他其它location,直到找到优先级最高的,或者找到第一种情况而停止搜索
location优先级从高到低:
(location =
) > (location 完整路径
) > (location ^~ 路径
) > (location ~,~* 正则顺序
) > (location 部分起始路径
) > (/
)
location = / {
# 精确匹配/,主机名后面不能带任何字符串 /
configuration A ]
}
location / {
# 匹配所有以 / 开头的请求。
# 但是如果有更长的同类型的表达式,则选择更长的表达式。
# 如果有正则表达式可以匹配,则优先匹配正则表达式。
configuration B ]
}
location /documents/ {
# 匹配所有以 /documents/ 开头的请求,匹配符合以后,还要继续往下搜索。
# 但是如果有更长的同类型的表达式,则选择更长的表达式。
# 如果有正则表达式可以匹配,则优先匹配正则表达式。
configuration C ]
}
location ^~ /images/ {
# 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找,停止搜索。
# 所以,即便有符合的正则表达式location,也不会被使用
configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif jpg jpeg结尾的请求。
# 但是 以 /images/开头的请求,将使用 Configuration D,D具有更高的优先级
configuration E ]
}
location /images/ {
# 字符匹配到 /images/,还会继续往下搜索
configuration F ]
}
location = /test.htm {
root /usr/local/var/www/htm;
index index.htm;
}
注意:location的优先级与location配置的位置无关
Nginx - 动静分离
动静分离从目前实现角度来讲大致分为两种:
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。
具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。
什么是动态资源、静态资源分离?
为什么要做动、静分离?
Nginx怎么做的动静分离?
只需要指定路径对应的目录。location/可以使用正则表达式匹配。并指定对应的硬盘中的目录。如下:(操作都是在MacOS上)
步骤:
文件目录结构:
打开浏览器 输入 http://localhost:8003/image/nginx.jpg 就可以访问该静态图片了