LaneBlog

蝼蚁虽小,也有梦想

PHP Socket服务 | PHP微信开发框架 | 开源博客

Nginx系列三:Web缓存

Clicks: 5501 Date: 2016-02-25 10:11:31 Power By 李轩Lane

    

一、Web缓存是什么

 

Web缓存,顾名思义,是一种缓存服务,当用户第一次访问一个URL的时候,Web缓存服务器会发送请求给后端服务器,获取数据,然后Web缓存服务器将数据保存起来,再将数据返回给客户端,由浏览器进行输出显示内容。当用户第二次访问同一个URL的时候,Web缓存服务器就会直接将之前保存的内容返回给客户端。如此一来,减少了后端服务器和数据库服务器的负载,也降低了网络时延。Web缓存服务器,就是是位于服务端和客户端之间的中间层。其中最为出名的Web缓存服务器就是Squid

Web缓存服务器应用广泛,DNS系统、网站服务等都或多或少的使用者Web缓存服务器。如今,Nginx也开始支持Web缓存服务。

 

 

二、NginxWeb缓存服务

 

       Nginx0.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等动态语言处理结果保存在缓存文件中。

       NginxWeb缓存服务器主要由proxy_cache指令集和fastcgi指令集实现。其中proxy_cache指令集用来实现反向代理的同时,也对后端返回的内容进行缓存。而fastcgi指令集用来实现对FastCGI程序缓存。

 

 

三、设置Nginxproxy_cache系列缓存

 

       1、安装ngx_cache_purge模块

proxy_cachengxin的模块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

 

       2proxy_cache指令:

用来设置哪个缓存区将被使用,并定义缓存区的名称。

格式:proxy_cache name;

示例:proxy_cache blog_article_cache

      

3proxy_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(硬盘)

 

4proxy_cache_valid指令:

用来设置对不同HTTP状态码的不同缓存时间。如果不指定状态码,则200301302才有效果。要对所有状态码设置一个统一时间的话,使用any代替状态码。

       格式:proxy_cache_valid 200 301 302 5m;

 

5proxy_cache_min_uses指令:

       用来设置缓存最小使用次数,默认为1

       格式:proxy_cache_min_uses 1;

 

6proxy_cache_key指令

              设置Web缓存的key,真实的存储key是根据我们设置的key然后求md5。通常我们设置为域名+URI+参数。

              格式:proxy_cache_key value

 

7proxy_cache_methods指令:

用来设置HTTP哪些方法会被缓存,默认为GETHEAD。可以设置POSTPUTDELETE等。

       格式:proxy_cache_methods methods;

示例:proxy_cache_methods GET POST PUT DELETE HEAD;

 

8、最佳实践:

首先,我们先设置两个缓存目录,用来存放缓存文件。目录的路径赋值给proxy_temp_pathproxy_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_pathproxy_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.gifNginx的缓存

        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;

        }

    }

}

 

 

四、设置Nginxfastcgi_cache系列缓存

 

1fastcgi_cache指令:

用来设置哪个缓存区将被使用,并定义缓存区的名称。

格式:proxy_cache name;

示例:proxy_cache blog_article_cache

      

2fastcgi_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(硬盘)

 

3fasgcgi_cache_valid指令:

用来设置对不同HTTP状态码的不同缓存时间。如果不指定状态码,则200301302才有效果。要对所有状态码设置一个统一时间的话,使用any代替状态码。

       格式:fasgcgi_cache_valid 200 301 302 5m;

 

4fasgcgi_cache_min_uses指令:

       用来设置缓存最小使用次数,默认为1

       格式:fasgcgi_cache_min_uses 1;

 

5fasgcgi_cache_methods指令:

用来设置HTTP哪些方法会被缓存,默认为GETHEAD。可以设置POSTPUTDELETE等。

       格式:fasgcgi_cache_methods methods;

示例:fasgcgi_cache_methods GET POST PUT DELETE HEAD;

 

       6fastcgi_cache_key指令

              设置Web缓存的key,真实的存储key是根据我们设置的key然后求md5。通常我们设置为域名+URI+参数。

              格式:fastcgi_cache_key value

 

       7、最佳实践

首先,我们先设置两个缓存目录,用来存放缓存文件。目录的路径赋值给fastcgi_temp_pathfastcgi_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_pathfastcgi_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

        }

    }

}

     

©2014 www.lanecn.com , All rights reserved. Power By Li Xuan.  京ICP备14005030号