友情提示: 缓存模块是在动静分离的环境基础上搭建
介绍
提高网站响应速度是web应用不容忽视的目标,在之前动静分离的基础上,我们已经降低了后端服务器压力,提高了处理请求的性能,但是用户请求的静态资源是从硬盘读取,相比内存的性能还有很大的提高;
Nginx自带的缓存模块可以把静态资源缓存到内存中,提高了用户请求静态资源的速度,并且nginx自带缓存模块配置简单,使用灵活,搭配第三方插件可以实现手动清除指定的缓存。
配置
添加缓存模块
#创建缓存目录
mkdir /dev/shm/demo
#进入nginx安装的conf目录
cd /usr/local/nginx/conf/
#打开nginx.conf文件添加以下内容:
proxy_temp_path /dev/shm/transfer/proxy_temp_path;
proxy_cache_path /dev/shm/transfer/proxy_cache_path levels=1:2 keys_zone=cache_one:6072m inactive=7d max_size=30g;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
proxy_cache cache_one;
proxy_cache_valid 200 304 302 5d;
proxy_cache_valid any 7d;
proxy_cache_key $host$uri$is_args$args;
add_header X-Cache '$upstream_cache_status from $host';
完整的配置文件
#工作进程个数:多开几个可以减少io带来的影响,
#根据 lscpu查出来的cpus设置(一般为当前机器核心数的1-2倍,最大不超过8),
worker_processes 2;
#worker_cpu_affinity需要结合worker_processes使用,一个worker_processes绑定一个CPU,
#比如两核是01,四核是0001,下面是8核绑定8个worker_processes的示例
worker_cpu_affinity 01 10;
#error_log logs/error.log info;
events {
#使用epoll模型提高性能
use epoll;
#单个进程连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}
http {
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
#注意:如果图片显示不正常把这个改成off
sendfile on;
#长连接超时时间,单位是秒
keepalive_timeout 65;
#gzip 是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
gzip on;
gzip_min_length 1k; #最小1K
gzip_buffers 16 64K;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain application/x- text/css application/xml application/;
gzip_vary on;
#header设置:用户真实的ip地址转发给后端服务器
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
#缓冲
client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
##########################缓存#####################
#设置缓存临时目录,要配合linux的内存目录/dev/shm使用的话,必须给赋予目录权限,因为默认root权限
proxy_temp_path /dev/shm/demo/proxy_temp_path;
#设置缓存目录,并设置Web缓存区名称为cache_one,内存缓存空间大小为128m,7天没有被访问的内容自动清除,硬盘缓存空间大小为5GB。
proxy_cache_path /dev/shm/demo/proxy_cache_path levels=1:2 keys_zone=cache_one:128m inactive=7d max_size=5g;
#启用html、jsp...<meta>标签不缓存的设置
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
################################################集群 ###################################################
#动态资源集群
upstream dynamic_server {
#服务器配置 weight是权重的意思,权重越大,分配的概率越大。
server 192.168.1.111:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.111:8081 weight=1 max_fails=2 fail_timeout=30s;
}
#静态资源集群(一般由nginx管理,因为nginx处理静态资源性能好,如果服
#务器有限,也可以部署在代理服务器本地)
upstream static_server {
server 192.168.1.111:808 weight=1;
}
################################################Nginx代理###################################################
server {
#监听80端口,可以改成其他端口
listen 80;
#nginx服务的域名,通过域名就可以访问应用
server_name localhost;
##静态资源存放在nginx服务器的地址
#root /opt/static/demo;
#用于清除缓存的url设置
#假设一个URL为demo/test.gif,那么就可以通过访问demo/purge/test.gif清除该URL的缓存。
location ~ /purge(/.*) {
#设置只允许指定的IP或IP段才可以清除URL缓存
allow 127.0.0.1;
allow 10.74.147.91;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
#反向代理:网页、视频、图片文件从nginx服务器读取
location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{
##########################缓存#####################
#使用web缓存区cache_one
proxy_cache cache_one;
#对200 304 302状态码设置缓存时间5天,其他的7天
proxy_cache_valid 200 304 302 5d;
proxy_cache_valid any 7d;
#以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_cache_key $host$uri$is_args$args;
#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移
#proxy_next_upstream http_502 http_504 error timeout invalid_header;
#增加一个header字段方便在浏览器查看是否击中缓存(生产中可注释)
add_header X-Cache '$upstream_cache_status from $host';
#反向代理,静态的由nginx来处理(不配置默认nginx的html目录,静态资源的目录结构必须和tomcat的web工程一致)
proxy_pass http://static_server;
#浏览器中缓存30天
expires 30d;
}
#反向代理: 其他动态文件转发到后端的tomcat集群
location ~ .*$ {
proxy_pass http://dynamic_server;
}
#错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#静态资源服务器,这里监听本地808端口,因为静态资源服务器和代理服务器是同一台机器,所以有如下配置
#如果是独立的服务器,直接在集群upstram配置即可。
server{
listen 808;
server_name static;
#反向代理:网页、视频、图片文件从nginx服务器读取
location /
{
#浏览器中缓存30天
expires 30d;
}
}
}
View Code
重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload
测试
添加测试图片
在/usr/local/nginx/html/demo目录下添加测试图片test.png
测试缓存
1、当我们第一次访问测试图片地址 http://192.168.1.111/demo/test.png 是没有缓存命中的:
2、再次访 问http://192.168.1.111/demo/test.png 我们可以看到命中缓存了:
3、清除之前访问url的缓存: