一、Web缓存是什么
Web缓存,顾名思义,是一种缓存服务,当用户第一次访问一个URL的时候,Web缓存服务器会发送请求给后端服务器,获取数据,然后Web缓存服务器将数据保存起来,再将数据返回给客户端,由浏览器进行输出显示内容。当用户第二次访问同一个URL的时候,Web缓存服务器就会直接将之前保存的内容返回给客户端。如此一来,减少了后端服务器和数据库服务器的负载,也降低了网络时延。Web缓存服务器,就是是位于服务端和客户端之间的中间层。其中最为出名的Web缓存服务器就是Squid。
Web缓存服务器应用广泛,DNS系统、网站服务等都或多或少的使用者Web缓存服务器。如今,Nginx也开始支持Web缓存服务。
二、Nginx的Web缓存服务
Nginx从0.7.48版本开始,也提供了Web缓存服务。我们先来介绍一下Nginx如果开启了Web缓存服务后的处理流程:
1)、用户访问一个URL;
2)、后端服务器接受请求,由Web Service软件Nginx开始处理。
3)、Nginx根据请求交由PHP/Python/Java等动态语言处理。
4)、Nginx获得动态语言的处理结果;
5)、Nginx对结果进行缓存;
6)、将结果返回给客户端,由客户端的浏览器输出显示内容。
了解了流程,我们再来看看第五步,Nginx是如何缓存的:
1)、Nginx将请求访问的URL进行MD5哈希后,将这个值作为key
2)、根据1)中得到的key,在缓存目录中生成缓存文件,并且将后端服务器的PHP等动态语言处理结果保存在缓存文件中。
Nginx的Web缓存服务器主要由proxy_cache指令集和fastcgi指令集实现。其中proxy_cache指令集用来实现反向代理的同时,也对后端返回的内容进行缓存。而fastcgi指令集用来实现对FastCGI程序缓存。
三、设置Nginx的proxy_cache系列缓存
1、安装ngx_cache_purge模块
proxy_cache是ngxin的模块ngx_cache_purge。在使用之前,需要重新编译安装nginx,并将ngx_cache_purge模块一同编入。
1)、下载ngx_cache_purge:
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar –zxvf ngx_cache_purge-2.3.tar.gz
2)、下载nginx:
wget http://nginx.org/download/nginx-1.9.11.tar.gz
tar –zxvf nginx-1.9.11.tar.gz
cd nginx-1.9.11
./configure –add-module=../ngx_cache_purge-2.3
make
sudo make install
2、proxy_cache指令:
用来设置哪个缓存区将被使用,并定义缓存区的名称。
格式:proxy_cache name;
示例:proxy_cache blog_article_cache
3、proxy_cache_path指令:
用来设置缓存文件的路径
格式:proxy_cache_path path levels keys_zone inactive max_size;
示例:proxy_cache_path /var/www/nginx/proxy/cache levels=1:2 keys_zone=blog_article_cache:100m inactive=1d max_size=30g
示例的意思是,缓存目录有两层,是levels指定的,其中第一层是第一个字母,第二层是第二个字母。这个缓存区的名字叫做blog_article_cache,缓存区空间为100M(内存),过期时间为1天以后,缓存空间为30G(硬盘)
4、proxy_cache_valid指令:
用来设置对不同HTTP状态码的不同缓存时间。如果不指定状态码,则200、301、302才有效果。要对所有状态码设置一个统一时间的话,使用any代替状态码。
格式:proxy_cache_valid 200 301 302 5m;
5、proxy_cache_min_uses指令:
用来设置缓存最小使用次数,默认为1
格式:proxy_cache_min_uses 1;
6、proxy_cache_key指令
设置Web缓存的key,真实的存储key是根据我们设置的key然后求md5。通常我们设置为域名+URI+参数。
格式:proxy_cache_key value
7、proxy_cache_methods指令:
用来设置HTTP哪些方法会被缓存,默认为GET和HEAD。可以设置POST、PUT、DELETE等。
格式:proxy_cache_methods methods;
示例:proxy_cache_methods GET POST PUT DELETE HEAD;
8、最佳实践:
首先,我们先设置两个缓存目录,用来存放缓存文件。目录的路径赋值给proxy_temp_path和proxy_cache_path。
mkdir /var/www/nginx/proxy/temp
mkdir /var/www/nginx/proxy/cache
我们直接在Nginx的主配置文件中进行演示,conf/nginx.conf。演示如下:
user www www;
worker_processes 4;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
}
http
{
include mime.types;
default_type application/octet-stream;
charset UTF-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
#proxy_temp_path和proxy_cache_path所指定的路径必须是在同一个磁盘分区
proxy_temp_path /var/www/nginx/proxy/temp
#设置缓存路径,缓存区名,缓存区内存空间大小,缓存区数据过期时间,缓存区硬盘空间大小
proxy_cache_path /var/www/nginx/proxy/cache levels=1:2 keys_zone=blog_article_cache:500m inactive=1d max_size=30g
#设置反向代理的集群IP,权重,错误重试次数,错误超时时间
upstream www_server_pool
{
server 192.168.1.100:80 weight=1 max_fails=3 fail_timeout=30s
server 192.168.1.101:80 weight=1 max_fails=3 fail_timeout=30s
server 192.168.1.102:80 weight=2 max_fails=3 fail_timeout=30s
}
server
{
listen 80;
server_name www.lanecn.com;
root /var/www/blog;
access_log /usr/local/nginx/logs/www.lanecn.com_access.log;
location /
{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://www_server_pool;
}
#对常见的图片和js,css进行设置
location ~ .*\.(gif|png|jpg|jpeg|bmp|js|css)$
{
#使用设置的缓存区blog_article_cache,blog_article_cache是缓存区名称,由proxy_cache_path设置
proxy_cache blog_article_cache;
#设置不同的HTTP状态码享有不同的缓存时间
proxy_cache_valid 200 301 302 1m;
proxy_cache_valid 404 1d;
#proxy_cache_valid any 1h;
#设置Web缓存的key,真是的存储key是根据我们设置的key然后求md5.我们设置为域名+URI+参数
proxy_cache_key $host$url$is_args$args;
#反向代理
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://www_server_pool;
}
#清除缓存
#访问www.lanecn.com/purge_nginx_cache/logo.gif即可清除www.lanecn.com/logo.gif在Nginx的缓存
location ~ /purge_nginx_cache(/.*)
{
#设置IP白名单.清除缓存只能由指定IP进行,防止恶意清除,增加服务器负载.
allow 127.0.0.1;
allow 192.168.1.1/254;
proxy_cache_purge blog_article_cache $host$1$is_args$args;
}
}
}
四、设置Nginx的fastcgi_cache系列缓存
1、fastcgi_cache指令:
用来设置哪个缓存区将被使用,并定义缓存区的名称。
格式:proxy_cache name;
示例:proxy_cache blog_article_cache
2、fastcgi_cache_path指令:
用来设置缓存文件的路径
格式:fastcgi_cache_path path levels keys_zone inactive max_size;
示例:fastcgi_cache_path /var/www/nginx/fastcgi/cache levels=1:2 keys_zone=blog_article_cache:100m inactive=1d max_size=30g
示例的意思是,缓存目录有两层,是levels指定的,其中第一层是第一个字母,第二层是第二个字母。这个缓存区的名字叫做blog_article_cache,缓存区空间为100M(内存),过期时间为1天以后,缓存空间为30G(硬盘)
3、fasgcgi_cache_valid指令:
用来设置对不同HTTP状态码的不同缓存时间。如果不指定状态码,则200、301、302才有效果。要对所有状态码设置一个统一时间的话,使用any代替状态码。
格式:fasgcgi_cache_valid 200 301 302 5m;
4、fasgcgi_cache_min_uses指令:
用来设置缓存最小使用次数,默认为1
格式:fasgcgi_cache_min_uses 1;
5、fasgcgi_cache_methods指令:
用来设置HTTP哪些方法会被缓存,默认为GET和HEAD。可以设置POST、PUT、DELETE等。
格式:fasgcgi_cache_methods methods;
示例:fasgcgi_cache_methods GET POST PUT DELETE HEAD;
6、fastcgi_cache_key指令
设置Web缓存的key,真实的存储key是根据我们设置的key然后求md5。通常我们设置为域名+URI+参数。
格式:fastcgi_cache_key value
7、最佳实践
首先,我们先设置两个缓存目录,用来存放缓存文件。目录的路径赋值给fastcgi_temp_path和fastcgi_cache_path。
mkdir /var/www/nginx/fastcgi/temp
mkdir /var/www/nginx/fastcgi/cache
我们直接在Nginx的主配置文件中进行演示,conf/nginx.conf。演示如下:
user www www;
worker_processes 4;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
}
http
{
include mime.types;
default_type application/octet-stream;
charset UTF-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
#fastcgi_temp_path和fastcgi_cache_path所指定的路径必须是在同一个磁盘分区
fastcgi_temp_path /var/www/nginx/fastcgi/temp
#设置缓存路径,缓存区名,缓存区内存空间大小,缓存区数据过期时间,缓存区硬盘空间大小
fastcgi_cache_path /var/www/nginx/fastcgi/cache levels=1:2 keys_zone=blog_article_cache:500m inactive=1d max_size=30g
#设置反向代理的集群IP,权重,错误重试次数,错误超时时间
upstream www_server_pool
{
server 192.168.1.100:80 weight=1 max_fails=3 fail_timeout=30s
server 192.168.1.101:80 weight=1 max_fails=3 fail_timeout=30s
server 192.168.1.102:80 weight=2 max_fails=3 fail_timeout=30s
}
server
{
listen 80;
server_name www.lanecn.com;
root /var/www/blog;
access_log /usr/local/nginx/logs/www.lanecn.com_access.log;
location ~ .*\.(php|php5)$
{
#使用设置的缓存区blog_article_cache,blog_article_cache是缓存区名称,由fastcgi_cache_path设置
fastcgi_cache blog_article_cache;
#设置不同的HTTP状态码享有不同的缓存时间
fastcgi_cache_valid 200 301 302 1m;
fastcgi_cache_valid 404 1d;
#fastcgi_cache_valid any 1h;
#设置Web缓存的key,真是的存储key是根据我们设置的key然后求md5.我们设置为域名+URI+参数
fastcgi_cache_key $host$url$is_args$args;
#FastCGI
fastcgi_pass http://www_server_pool;
fastcgi_index index.php;
include fastcgi.conf
}
}
}