最近对负载均衡、缓存这方面有比较大的兴趣,于是决定用redis作为nginx的缓存
期间在网上看了几篇博客,发现内容都基本一致,而我自己按照博客指示来不奏效的,可能我是自己问题
后来经过一系列的摸索,成功对页面进行了缓存,所以以此篇博客记录下来,也希望能帮助到有需要的人
nginx、redis的安装配置就不记录,只记录最核心关键的部分:
我的环境:
系统:Ubuntu 14.04.5 LTS
nginx:1.9.9
一、首先先介绍一个网址
https://www.nginx.com/resources/wiki/modules/
这是nginx的第三方模块列表,有模块名字、模块介绍、和github的地址,github里面有详细的介绍和教程
srcache-nginx-module就是我要用到的模块
二、下载srcache-nginx-module
我们来到以下地址,可下载该模块
https://github.com/openresty/srcache-nginx-module
三、nginx添加srcache-nginx-module之前
nginx.conf的配置:
user www-data;
worker_processes 1;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
access_log on;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name localhost;
location / {
}
}
}
我把注释和其他无关配置都删除,更简单明了
除了开启了gzip等一些配置项以外,基本没改动,同时我们再看看nginx现有的模块
没有任何的添加模块
首页和css文件内容如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首页</title>
<link rel="stylesheet" type="text/css" href="css/index.css" />
</head>
<body>
</body>
</html>
@CHARSET "UTF-8";
body {
background:blue;
}
目录结构如下:
页面和css也非常简单,首页引入index.css,body背景为蓝色
如无意外启动nginx成功后,访问首页会看到如下图:
F12打开console,查看Response Headers,方便后面对比
四、准备srcache-nginx-module和其他模块
下载srcache-nginx-module之前,我们先不妨看一下用redis作缓存的介绍
https://github.com/openresty/srcache-nginx-module#caching-with-redis
会看到一个配置的例子,和另外需要到的模块的说明
echo-nginx-module、HttpRedisModule、redis2-nginx-module、ngx_devel_kit-0.2.19、set-misc-nginx-module
把各模块都下载解压好后,我的目录结构如下图:
五、重新编译nginx
重新编译就是通过./configure的--add-module来添加模块
./configure --add-module=/usr/local/nginx/ngx_redis_module/echo-nginx-module-master --add-module=/usr/local/nginx/ngx_redis_module/ngx_http_redis-0.3.8 --add-module=/usr/local/nginx/ngx_redis_module/redis2-nginx-module-master --add-module=/usr/local/nginx/ngx_redis_module/srcache-nginx-module-master
模块存放的目录要自行修改
之后make,但不要用make install
我们进到objs目录下
只需要把nginx复制到之前nginx的安装目录的sbin即可
再看看nginx现有的模块
六、修改nginx.conf
user www-data;
worker_processes 1;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
access_log on;
sendfile on;
keepalive_timeout 65;
gzip on;
upstream redisServer{
server 127.0.0.1:20169;
keepalive 10;
}
server {
listen 80;
server_name localhost;
location / {
}
location /css {
default_type text/css;
set $key $uri;
set_escape_uri $escaped_key $key;
add_header X-Cached-From $srcache_fetch_status;
add_header X-Cached-Store $srcache_store_status;
add_header X-Key $key;
srcache_fetch GET /redis $key;
srcache_store PUT /redis2 key=$escaped_key&exptime=120;
}
location = /redis {
internal;
set_md5 $redis_key $args;
redis_pass redisServer;
}
location = /redis2 {
internal;
set_unescape_uri $exptime $arg_exptime;
set_unescape_uri $key $arg_key;
set_md5 $key;
redis2_query set $key $echo_request_body;
redis2_query expire $key $exptime;
redis2_pass redisServer;
}
}
}
七、对比开启缓存后的区别
打开浏览器访问首页(为了更好测试,先把Disable cache勾上)
因为在nginx.conf加了X-Cached-From、X-Cached-Store、X-Key的显示,所以这里是可以看到缓存的情况
这是配置了redis缓存后第一次访问,所以是没有击中缓存的
查看下redis,发现有记录了
整个css的内容都进来了
再刷新页面
发现命中了缓存
后续:
如果在redis的缓存没过期前修改了css内容,会发现页面缓存没变,浏览器刷新也还是看到旧的
通过数据摘要、非覆盖式发布来完成
下面来简单演示: