一,Nginx缓存
一,Nginx缓存的概念
缓存概念:缓存就是数据交互的缓冲区(cache),当用户要获取数据的时候,会先从缓存中去查询获取数据,如果缓存中有就会直接返回数据给客户端,如果没有就从应用程序或者数据库查询数据,再将数据返回给客户端并同时将数据放入缓存,下次用户直接从缓存中获取数据缓存的多种应用场景:
场景 |
作用
|
操作系统磁盘缓存
|
减少磁盘机械操作
|
数据库缓存
|
减少对文件系统的IO操作
|
应用程序缓存
|
减少对数据库的查询
|
Web服务器缓存(Nginx)
|
减少对应用服务器的请求次数
|
浏览器缓存 |
减少对web后台服务器的交互
|
Nginx做为WEB应用服务器的反向代理服务器,它的缓存主要减少请求对应用服务器的访问,提高用户访问效率
缓存的优点:
- 减少数据传输,节省网络流量,加快响应速度,提升用户体验
- 减轻服务器压力
- 提供服务器压力
缓存的缺点:
- 数据的不一致
- 增加成本
二,Nginx的web缓存服务
Nginx是从0.7.48版本开始提供缓存功能,Nginx是基于Proxy Store来实现,其原理是把URL及相关组合当做Key,在使用MD5算法对key进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目录中,它可以支持URL连接,同时也支持404/301/302这样的非200状态码,Nginx即可以支持对指定URL或者状态码设置过期时间,也可以使用purge命令来手动清除指定URL的缓存
三,Nginx缓存设置相关指令
Nginx的web缓存服务主要使用ngx_http_proxy_module模块相关指令集来完成
一,proxy_cache_path指令(重点指令)
该指令用于设置缓存文件的存放路径
语法 | proxy_cache_path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size] |
默认值 | - |
配置位置 | http块 |
参数:
1,path:缓存路径地址
/usr/local/proxy_cache
2,levels:指定该缓存空间对应的目录,最多可以设置三层目录结构
levels=1:2:4 表示缓存空间有三层目录,第一层目录名为一个字符,第二层目录为两个字符,第三层为4个字符 假如url(wql.luoqin.ltd)做为key通过MD5加密的值为:318ae649df801ddfbb8d2a1d3593311f 那么: levels=1:2:4 缓存存储目录为 /usr/local/proxy_cache/f/11/5933 levels=4:2 缓存存储目录为 /usr/local/proxy_cache/311f/93 levels=5:3:2 缓存存储目录为 /usr/local/proxy_cache/3311f/359/1d 最终用户最次访问,在通过MD5加密来寻找有没有对应缓存目录来判断缓存是否存在
3,keys_zone:用来为这个缓冲区设置名称和指定大小
keys_zone=wql:200m 缓冲区名称为wql,大小为200MB,1MB大概能存储8000个keys
4,max_size:设置最大的缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源
max_size=20g
5,inactive:设置缓存过期时间,当多少时间该缓存没有被访问,就删除
inactive=1d 当一天没有访问就删除
配置实例:
proxy_cache_path /usr/local/proxy_cache levels=3:2 keys_zone=wql:200m inactive=1d max_size=10g;
二,其他指令
1,proxy_cache:该指令用来开启或者关闭代理缓存,如果开启则指定定使用那个缓存区来进行缓存
语法 | proxy_cache zone_name |off |
默认值 | proxy_cache off |
配置位置 | http块,server块,location块 |
zone_name:指定缓冲区的名称
2,proxy_cache_key:用来设置web缓存的key值,Nginx会根据key值MD5哈希存缓存
语法 | proxy_cache_key key |
默认值 | proxy_cache_key $scheme$proxy_host$request_uri |
配置位 | http块,server块,location块 |
3,proxy_cache_valid:用来对不同返回状态的URL设置不同的缓存时间
语法 | proxy_cache_valid [code……] time |
默认值 | - |
配置位置 | http块,location块,server块 |
proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; 为200和302的响应URL状态码设置10分钟的缓存,为404的响应状态码设置1分钟的缓存 proxy_cache_valid any 1m; 对所有的响应状态码都设置1分钟的缓存
4,proxy_cache_min_uses:设置资源被访问多少次被缓存
语法 | proxy_cache_min_uses number |
默认值 | proxy_cache_min_uses 1 |
配置位 | http块,server块,location块 |
5,proxy_cache_methods:设置缓存那些HTTP请求方式
语法 | proxy_cache_methods GET|HEAD|POST |
默认值 | proxy_cache_methods GET|HEAD |
配置位置 | http块,server块,location块 |
默认缓存GET和HEAD请求方式
四,缓存案例
准备:一台Linux服务器安装Nginx(192.168.68.133:9090),一台服务器安装Tomcat(192.168.68.153:8080),Tomcat的webapp下创建一个photo目录并放入一张wql.jpg的图片,使用nginx反向代理tomcat访问图片,并缓存
tomcat服务器安装和webapp直接访问不进行描述了,主要侧重nginx的配置
nginx的配置:
http { proxy_cache_path /usr/local/proxy_cache levels=2 keys_zone=wqlfq:200m inactive=1d max_size=10g; #负载均衡 upstream up{ server 192.168.68.153:8080; } server { listen 9090; server_name localhost; location /{ proxy_cache wqlfq; proxy_cache_key $scheme$proxy_host$request_uri; proxy_cache_min_uses 1; proxy_cache_valid 200 5d; proxy_cache_valid 404 405 30s; proxy_cache_valid any 1m; #$upstream_cache_status内置参数为是否被缓存,假如值为HIT为被缓存,MISS为没有被缓存 add_header nginx-cache "$upstream_cache_status"; #反向代理tomcat proxy_pass http://up; }}
结果:
五,Nginx缓存的清除
Nginx缓存清除有两种方式:
- 删除对应的缓存目录:一般使用这种方式删除所有缓存
- 使用第三方拓展模块:这个方式一般用来删除某个具体的资源缓存
一,删除对应缓存目录
这个方式很简单
例:
rm -rf /usr/local/proxy_cache/……
二,使用第三方拓展模块
ngx_cache_purge第三方模块需要手动安装
子模块安装步骤(和之前with-http_ssl_module添加是一样的):
① 下载模块(地址)
http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
② 上传并解压
上传不多说有多种方式 tar -zxvf ngx_cache_purge-2.3.tar.gz
③ 修改文件名称方便配置(自选)
mv ngx_cache_purge-2.3/ purge
④ 查询Nginx的配置参数
nginx -V
⑤ 使用./configure进行模块添加
./configure --add-module=/home/ceat/purge
⑥ 使用make进行编译
make
⑦ 备份sbin目录下的nginx可执行文件
mv nginx nginxfq
⑧ 将objs目录下的nginx可执行文件拷贝到sbin文件中
cp ./objs/nginx /usr/local/nginx/sbin/
⑨ 使用make upgrade对nginx进行更新
make upgrade
清除指令:
语法 | proxy_cache_purge cachename cachekey |
默认值 | - |
配置位置 | http块,location块,server块 |
- cachename:指定缓存的名称,要和proxy_cache保持一致
- cachekey:指定缓存的key,要和proxy_cache_key保持一致
例:
location ~ /purge(/.*){ proxy_cache_purge wql fq; #访问/purge/url地址,就把名为wql的cache下的fq为key的缓存目录删除 }
二,设置指定资源不缓存
在使用Nginx缓存时,会遇到一个问题就是不是使用的数据都适合缓存,一般经常发生变化的数据如果进行缓存会导致用户无法访问真实服务器的数据造成数据错误,所以在缓存过程中需要对数据进行过滤
nginx提供过滤缓存的功能设置,主要使用两个指令
一,proxy_no_cache指令
该指令用来定义不将数据进行缓存的条件
语法 | proxy_no_cache string… |
默认值 | - |
配置位置 | http块,location块,server块 |
二,proxy_cache_bypass指令
该指令用来设置不从缓存中获取数据的条件
语法 | proxy_cach_bypass string… |
默认值 | - |
配置位置 | http块,location块,server块 |
这两个指令都需要一个条件,它主要使用三个内置参数来进行条件判断,当三个条件至少有一个不为空且不等于0,则条件处理
三个内置参数作为条件进行设置过滤:
- $cookie_nocache:使用cookie来判断是否需要缓存,如果不为空就不缓存(默认为空,需要在add_header进行设置值)
- $arg_nocache:获取url的请求中的nocache参数,不为空将不缓存(默认为空,需要自己在url中添加)
- $arg_comment:获取url的请求中comment参数,不为空将不缓存(默认为空,需要自己在url中添加)
例:
server{ if($request_uri ~ /.*\.js$){ set $cookie_nocache 1; } } 表示访问任何.js文件,都将cookie_nocache值设置为1,不进行缓存
二,Nginx动静分离
一,动静分离的概念
动静分离的两个名词一个动词:
- 动:后台应用程序的由于处理
- 静:web前端的静态资源(如:jpg,html,css,js等文件)
- 分离:将两种分开部署访问,将所有静态资源相关内容都交给Nginx来部署访问,非静态内容则交类似于Tomcat的web服务器进行部署访问
动静分离的原因:
- Nginx在处理静态资源的时候,效率非常高,而且Nginx的并发访问效率在多种服务器软件中也是出类拔萃,而Tomcat则相对比较弱一点,所有静态资源交与nginx后,可以减轻Tomcat服务器的访问压力并提高资源的访问效率
- 动静分离后,降低了动态资源和静态资源的耦合度,动态资源服务器的宕机也不会影响静态资源的展示
动静分离的实现的两种方式:
- 把纯粹的静态资源独立成单个域名,放在独立的Nginx服务器上(主流方案)
- 动态和静态资源混合发布,提高nginx进行区别
二,动静分离的配置
动静分离的原理很简单,通过location对请求url进行匹配即可,在/Users/Hao/Desktop/Test(任意目录)下创建 /static/imgs 配置如下:
###静态资源访问(直接访问本地) server { listen 80; server_name static.haoworld.com; location /static/imgs { root /usr/local/nginx/html; index index.html index.htm; } } ###动态资源访问(代理Tomcat服务器) server { listen 80; server_name www.haoworld.com; location / { proxy_pass http://127.0.0.1:8080; index index.html index.htm;} }
三,Nginx下载站点
nginx使用的是模块ngx_http_autoindex_module来实现下载站点的,该模块处理以斜杠("/")结尾的请求,并生产目录列表
nginx再编译的时候会自动加载该模块所有不需要手动下载添加,但默认该模块是关闭的,需要使用指令配置才能开启
一,配置站点的指令
一,autoindex指令
该指令原来启用或禁用目录列表输出
语法 | autoindex on | off |
默认值 | autoindex off |
配置位置 | http块,server块,location块 |
二,autoindex_exact_size指令
该指定对应HTML格式,指定是否再目录列表展示文件的纤细大小
- 默认为on,显示出文件的确定大小,单位是byte
- off,显示出文件的大概大小,单位是KB或者MB或者GB
语法 | autoindex_exact_size on | off |
默认值 | autoindex_exact_size on |
配置位置 | http块,server块,location块 |
三,autoindex_format指令
设置目录列表的格式
语法 | autoindex_format html | xml | json | jsonp |
默认值 | autoindex_format html |
配置位置 | http块,server块,location块 |
注:该指令在1.7.9及以后版本出现
四,autoindex_localtime指令
对应HTML格式,是否在目录列表上显示时间
- 默认为off,显示的文件时间为GMT时间
- on,显示的文件时间为文件的服务器时间
语法 | autoindex_localtime on | off |
默认值 | autoindex_localtime off |
配置位置 | http块,server块,location块 |
二,配置实例
准备:在linux的/home新建一个download目录,再往里面放一些安装包,提供下载
配置nginx:
server{ listen 9998; server_name localhost; location /{ root /home/download; autoindex on; autoindex_exact_size on; autoindex_format html; autoindex_localtime on; } }
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109