Nginx Web缓存

2019-08-28 03:00:27   NGINX

 

一、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

    }

}

}