图文并茂:Nginx动静分离是什么意思?
1. 动静分离
1.1 何为动静分离
Nginx动静分离,简单来说,就是动态请求和静态请求分开,也可以理解成使用Nginx处理静态页面,Tomcat 处理动态页面,动静分离从目前实现角度来讲大致分为两种。
纯粹把静态文件独立成单独的域名,放在独立的服务器上(主流推崇的方案)
动态跟静态文件混合在一起发布,通过Nginx来分开
通过location指定不同的后缀名实现不同的请求转发,也可以通过expires参数设置,使浏览器缓存文件的过期时间,从而减少与服务器之前的请求和流量。
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/目录下找资源,同时该路径下配置了一个autoindex on,当访问/image/目录时,会列出该目录下的所有文件
修改完配置文件后,记得重启Nginx
2.3 测试结果
浏览器中输入地址:
http://192.168.17.129/image/01.jpg
浏览器中输入地址:
http://192.168.17.129/image/
因为配置了autoindex on
浏览器地址栏输入地址:
http://192.168.17.129/www/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
示例
# 将0-9.html的请求路径,重写为/index.jsp页面 rewrite ^/([0-9]+).html /index.jsp?pageNum=1 break;