在一次cdn排错过程中,发现可以利用nginx的页面缓存功能+dnspod来自己搭建cdn,来节省一定的成本,当然效果不如第三方的cdn效果好。因此自己先搭建了nginx页面缓存来测试一下。
先介绍下页面缓存用到的几个主要命令:
proxy_cache_path 设置缓存的目录
proxy_cache_key 设置以什么参数md5得到缓存的文件名,默认为$scheme$proxy_host$request _uri,即以协议,主机名,请求uri作md5得出缓存的文件名
proxy_cache 反向代理缓存设置命令,语法proxy_cache zone |off
proxy_cache_valid 设置指定状态码的缓存时间
缓存变量说明:
$server_addr 服务器地址,在完成一次系统调用后,可以确定缓存服务器的地址
$upstream_cache_status 缓存是否命中
MISS 未命中
EXPIReD - expired 请求被传送到后端
UPDATGING - expired 由于proxy/fastcgi_cache_use_stale正在更新,将使用旧的应答
STALE - expired 由于proxy/fastcgi_cache_use_stale正在更新,后端将得到过期的应答
HIT 命中
架构:172.16.8.102 nginx做前端的反向代理+页面缓存 apache做后端web
1.mkdir -p /data/nginx/cache/webserver
2.vim /etc/nginx//conf.d/ogzq.conf
proxy_cache_path /data/nginx/cache/webserver levels=1:2 keys_zone=webserver:20m max_size=1g;
proxy_cache_key "$host$request_uri";
server {
listen 80;
server_name 172.16.8.102;
#proxy_set_header Host $host;
#proxy_set_header X-Real-IP $remote_addr;
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
location / {
proxy_pass http://ogzq;
proxy_cache webserver;
proxy_cache_valid 200 10m;
}
}
以上是缓存匹配到/的文件,若只是缓存图片等静态内容,则配置如下
location ~* ^.+\.(js|ico|gif|jpg|jpeg|png|html|htm)$ {
proxy_pass http://ogzq;
proxy_cache webserver;
proxy_cache_valid 200 10m;
}
location配置详解请具体详看
3.vim /etc/nginx/conf.d/up.conf
upstream ogzq{
server 127.0.0.1:81;
}
4.service nginx reload
效果如下:
用chrome浏览器打开网页,然后F12可以看到调试信息,红框处可以看出:所请求的Preloader.html?33已经命中缓存,同样可以查看其他请求内容有没有命中缓存。
ps:1.我们还可以设定请求图片如jpg,png,css,php,jsp等内容进行相对应的缓存,如我们架cdn就可以指定相应的图片进行缓存,以上只介绍主要的参数,还可以根据实际情况进行配置。
2.我们还可以设置日志格式,来判断缓存是否命中。
log_format cache '***$time_local ' '***$upstream_cache_status '
'***Cache-Control: $upstream_http_cache_control '
'***Expires: $upstream_http_expires ' '***"$request" ($status) ' '***"$http_user_agent" ';