Nginx动静分离是一项比较常用的功能,这个功能一般比较适合中小型网站,使用场景如:
web_app内的H5页面,ERP系统、传统项目等..
可以起到系统加速的作用。
大型网站一般不适用动静分离,因为中小型网站并发量不是特别高,需要分离出来的资源不是特别多,这样就可以把静态资源挪到前置的nginx中,如果是大型系统,文件太多则不太合适。
所以,建议在资源/目录不是特别多的时候使用动静分离
Nginx动静分离原理如下图:
演示一个简单的配法:
假设有两台虚拟机,ip分别是“192.168.159.100”和“192.168.159.101”,两台虚机根目录有相同的文件:
首先在“192.168.159.100”配置一个负载均衡:
此时访问“192.168.159.100”会被转发到“192.168.159.101”:
然后删除“192.168.159.101”中的静态文件:
再次访问“192.168.159.100”,会看到样式和图片都没了:
在“192.168.159.100”中配置静态文件访问本地,不进行负载均衡转发:
再次访问“192.168.159.100”,页面样式和图片均正常显示:
这是由nginx返回的静态资源,这样一个简单的动静分离就配置完成
细节:
这里有个细节需要注意,倘若访问的路径中包含文件夹,也就是项目的根目录在文件夹中
如访问“192.168.159.100/page”,同样使用上面配置的负载均衡器,会转发到“192.168.159.101/page”目录下
此时做动静分离时,再使用上面的配置方法,会报404找不到文件,实际就是规则有出入,转发到别的文件夹了,这种情况需要改变匹配规则
如下图,在location前,加上文件夹名称即可,表示从哪个位置开始
正常访问
这里只是举个容易理解的例子,实际应用如遇类似问题,可参考解决
优先级:
所有的请求都会被匹配到以“/”斜线开头的location下,这是默认的规则
通过上面的案例可以看出,单以“/”斜线开头的location,优先级比较低,只要配置了其它规则的location,匹配优先级都高于以斜线开头
正则:
使用上面案例中的方法写location,目录非常多时,就要写很多个location,想把多个location合并到一个,可以使用正则表达式,直接在location后面写正则就可以
使用“~”开头,表示要使用正则了
正则说明:
/ 通用匹配,任何请求都会被匹配到
= 精准匹配,不是以指定模式开头
~ 正则匹配,区分大小写
~* 正则匹配,不区分大小写匹配
^~ 非正则匹配,匹配以指定模式开头的location