一.动静分离
1.1 何为动静分离Nginx
动静分离,简单来说,就是动态请求和静态请求分开,也可以理解成使用nginx
处理静态页面,tomcat
处理动态页面,动静分离从目前实现角度来讲大致分为两种.
- 纯粹把静态文件独立成单独的域名,放在独立的服务器上(主流推崇方案).
- 动态跟静态文件混合在一起发布,通过
Nginx
来分开.
通过location
指定不同的后缀名实现不同的请求转发,也可以通过expries
参数设置,使浏览器缓存文件的过期时间,从而减少与服务器之间的请求和流量.
Expires
具体含义: 给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所有不会产生额外的流量,也就是所谓的客户端缓存。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires
来缓存), 假设一下,把这个Expires
设置3d
, 表示在3
天之内访问这个URL
,发送一个请求,对比服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304
,如果有修改,则直接从服务器重新下载,返回状态码200
.
1.2 动静分离目的
为了加快网站的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,来加快解析速度,提高请求的访问效率,降低原来单个服务器的压力,下面是动静分离的原理图.
2. 如何配置
2.1 资源准备
2.2 进行Nginx 配置
找到Nginx
安装目录,打开/conf/nginx.conf
配置文件.
http {
……
server {
listen 80;
server_name 192.168.17.129;
location /www/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
autoindex on; // 列出访问目录
}
}
}
上面的配置,就是当请求是以/www/
开始的,则进入/www/data/
目录下找资源,如果是以/image/
开始的,则进入/image/data/
目录时,会列出该目录下的所有文件.修改完配置文件后,记得重启Nginx
.
2.3 测试结果
浏览器中输入: http://192.168.17.129/image/01.jpg
;
浏览器中输入地址: http:// 192.168.17.129/image
.
因为配置了autoindex on
;
浏览器地址栏输入地址: http: //192.168.17.129/222/a.html
;
3.location
location
前缀可以使用正则表达式
-
/
通用匹配, 任何请求都会匹配到. -
=
精准匹配,不是以指定模式开头. -
~
正则匹配,区分大小写. -
~*
正则匹配, 不区分大小写. -
^~
非正则匹配,匹配以指定模式开头的location
.location
匹配顺序 - 多个正则,
location
直接书写顺序匹配,成功后就不会继续往后面匹配. - 普通(非正则)
location
会一直往下,直到找到匹配度最高的(最大前缀匹配). - 当普通
location
与正则location
同时存在,如果正则匹配成功,则不会再执行普通匹配. - 所有类型
location
存在时,=匹配
>^~匹配
>正则匹配
?普通
(最大前缀匹配).
location ~*/(css|img|js) {
root /usr/local/nginx/static;
index index.html index.htm;
}
alias
与 root
区别
location /css {
alias /usr/local/nginx/static/css;
index index.html index.htm;
}
root
用来设置根目录,而alias
在接受请求时在路径上不会加上location
.
-
alias
指定的目录是准确的,即location
匹配访问的path
目录下的文件直接是在alias
目录下查找的. -
root
指定的目录是location
匹配访问的path
目录的上一级目录,这个path
目录一定要是真实存在root
指定目录下的. - 使用
alias
标签的目录块中不能使用rewrite
的break
,另外,alias
指定的目录后面必须要加上/
符号!. -
alias
虚拟目录配置中,location
匹配的path
目录下如果后面不带/
,那么访问的url
地址中这个path
目录后面加不加/
不影响访问,访问时它会自动加上/
,但是如果location
匹配的path
目录后面加上/
,那么访问的url
地址中这个path
目录必须要加上/
, 访问时它不会自动加上/
, 如果不加上/
,访问就会失败!. -
root
目录配置中,location
匹配的path
目录后面带不带/
,都不会影响访问.
4. UrlRewrite路径重写rewrite
是实现URL
重写的关键指令,根据regex
部分内容,重定向到replacement
, 结尾是flag
标记, 语法如下:
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag标记
- 关键字: 不能改变.
- 正则:
perl
兼容正则表达式语句进行规则匹配. - 替代内容: 将正则匹配的内容替换成
replacement
. - flag标记:
rewrite
支持的flag
标记. 包含以下关键字:last
: 本条规则匹配完成后,继续向下匹配新的location URI
规则.break
: 本条规则匹配完成即终止,不再匹配后面的任何规则.redirect
: 返回302
临时重定向,浏览器地址会显示跳转后的URL
地址.permanent
: 返回301
永久重定向,浏览器地址栏会显示跳转后的URL
地址. -
rewrite
: 参数的标签段位置:server
,location
,if
.
eg:
# 将0-9.html的请求路径,重写为/index.jsp页面
rewrite ^/([0-9]+).html /index.jsp?pageNum=1 break;