Nginx作为web缓存服务器应用

        Nginx支持类似Squid的缓存功能。Nginx的web缓存服务主要由proxy_cache相关命令集和fastcgi_cache相关命令集构成,前者用于反向代理时对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。此外,如果不想使用Nginx自带的缓存功能,也可以使用第三方模块ngx_slowfs_cache来实现缓存服务器配置。

1.在Nginx下安装缓存服务器:

        这里使用Nginx自带的缓存模块,通过proxy_cache命令来实现数据的缓存。

        下载ngx_cache_purge模块,下载地址:http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz   

       安装:

                wget http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz

             tar zxvf ngx_cache_purge-2.1.tar.gz -C /app 

                tar zxvf  nginx-1.4.7.tar.gz  

                cd nginx-1.4.7

                 ./configure --user=www --group=www --prefix=/usr/local/nginx/ --add-module=/app/ngx_cache_purge-2.1/ --with-http_stub_status_module --with-http_ssl_module

                make

                make install

2.配置Nginx缓存服务器:

        配置:               

                user  www www;

                worker_processes  4;

                error_log  logs/error.log  notice;

                pid        logs/nginx.pid;

                worker_rlimit_nofile 65535;

                

                events {

                    use epoll;

                    worker_connections  65535;

                }

                

                

                http {

                    include       mime.types;

                    default_type  application/octet-stream;

                

                    charset utf-8;

                

                    server_names_hash_bucket_size 128;

                    client_max_body_size     300m;

                    client_header_buffer_size    32k;

                    large_client_header_buffers 4 32k;

                

                    sendfile        on;

                    tcp_nopush     on;

                

                    #keepalive_timeout  0;

                    keepalive_timeout  60;

                    

                    client_body_buffer_size 512k;

                    proxy_connect_timeout  5;

                    proxy_read_timeout 60;

                    proxy_send_timeout 5;

                    proxy_buffer_size  16K;

                    proxy_buffers  4  64k;

                    proxy_busy_buffers_size 128k;

                    proxy_temp_file_write_size 128k;

                

                    gzip  on;

                    gzip_min_length 1k;

                    gzip_buffers    4  16k;

                    gzip_http_version  1.1;

                    gzip_comp_level      2;

                    gzip_types  text/plain application/x-javascript text/css application/xml;

                    gzip_vary on;

                

                    proxy_cache_path /backup/proxy_cache_dir levels=1:2 keys_zone=cache_one:1024m inactive=1d ma

                x_size=3g;  

                    参数说明:

                            ☆ proxy_cache_path :  用于设置缓存的目录,后面跟缓存路径。最好将缓存目录放在一个独立的硬盘上。

                            ★ levels=1:2  :   levels用来设置目录深度,这里是两层目录深度,第一层是一个字符,第二层是两个字符。

                            ☆ keys_zone  :   用来设置web缓存区名称,这里是cache_one,后面的“4096m”表示内存缓存空间大小为4GB。

                            ★ inactive  :  表示自动清除缓存文件的时间,这里的“1d"表示1天没有被访问的内容自动清除,还可以使用分钟或小时计时,例如“5m"表示5分钟后自动清除,“5h”表示5小时后自动清除。

                            ☆ max_size  : 表硬盘缓存空间可使用的最大值,默认情况下经访问的文件常将被放到内存中进行缓存,而在内存缓存空间不足时,Nginx会将不经常访问的数据从内存写到磁盘。

                    proxy_temp_path /backup/proxy_temp_dir;

                    参数说明:

                           ★ proxy_temp_path : 用于指定临时缓存文件的存储路径,这里需要注意的是,proxy_temp_path和proxy_cache_path指定的路径必须在同一磁盘分区。

                    

                    server {

                        listen       80;

                        server_name  yan.blog.com m.blog.com;

                        charset utf-8;

                        #access_log  logs/host.access.log  main;

                        location / {

                            proxy_cache  cache_one;

                            参数说明:

                                    反向代理缓存设置命令,语法为“proxy_cache   zone|off",默认值为off,需要将proxy_cache命令放到location字段,这样匹配此location的url才能被缓存。

                            proxy_cache_valid  200 304 12h;

                            参数说明:

                                    对不同的HTTP状态码设置不同的缓存时间。

                            proxy_cache_key $host$uri$is_args$args;

                            参数说明:

                                    这个命令是设置以什么样的参数得到缓存的文件名,默认为“#$scheme$proxy_host$request_uri",表示以协议、主机名、请求uri(包含参数)作MD5得出缓存的文件名。这里是以域名、URI、参数组合成web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内。

                            proxy_set_header Host  $host;

                            proxy_set_header X-Forwarded-For  $remote_addr;

                            proxy_pass http://127.0.0.1:8080;

                            expires   1d;

                        }

                        #下面这段用于配置手动清除缓存策略,清除的方法为:如果一个URL为http://yan.blog.com/bbs/index.html,那么通过访问http://yan.blog.com/purge/bbs/index.html即可清除该URL的缓存。

                

                        location ~ /purge(/.*) {

                            #allow   127.0.0.1;

                            参数说明:

                                    表示只允许指定的IP或IP段才可以清除URL缓存。

                            #allow   17.100.0.0/24;

                            #deny   all;

                            proxy_cache_purge    cache_one   $host$1$is_args$args;

                        }

                        #设置不做缓存的内容,这里设置扩展名以.jsp、.php、.jspx结尾的动态应用程序不缓存。

                        location ~ .*\.(jsp|php|jspx)?$  {

                            proxy_set_header Host $host;                            

                            proxy_set_header Host $host;

                            proxy_set_header X-Forwarded-For  $remote_addr;

                            proxy_pass http://127.0.0.1:8080;

                        }

                        access_log off;

                

                    }

                    server {

                        listen       8080;

                        server_name  127.0.0.1;

                

                        #charset koi8-r;

                

                        #access_log  logs/host.access.log  main;

                

                        location / {

                            root   /var/www/html/;

                            index  index.html index.htm;

                        }

                

                        #error_page  404              /404.html;

                

                        # redirect server error pages to the static page /50x.html

                        #

                        error_page   500 502 503 504  /50x.html;

                        location = /50x.html {

                            root   html;

                        }

                    }

                }

3.测试proxy_cache实现的缓存功能:

            启动Nginx后,查看Nginx的进程:                  

            [root@nginx01 ~]# ps -ef | grep nginx

            root      23641      1  0 10:37 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx

            www       23749  23641  0 10:45 ?        00:00:01 nginx: worker process      

            www       23750  23641  0 10:45 ?        00:00:01 nginx: worker process      

            www       23751  23641  0 10:45 ?        00:00:00 nginx: worker process      

            www       23752  23641  0 10:45 ?        00:00:01 nginx: worker process      

            www       23753  23641  0 10:45 ?        00:00:00 nginx: cache manager process

            从输出可知,Ngin进程多了一个“cache manager”进程,这个进程就是用来管理缓存服务和文件的。

4.如何清除指定的URL缓存:

            有时候修改网页内容,如果不想等到缓存文件过期后自动清理,还可以通过手动方式清理缓存文件,清理方式在上面介绍Nginx配置文件时已经做过说明,只需在清除缓存网页的URL地址前面增加purge即可。

            例如:

                    要清除http://yan.blog.com/index.html这个页面的缓存文件,只需在浏览器重输入http://yan.blog.com/purge/index.html地址即可。