当前位置: > Linux服务器 > nginx >

nginx + webpy + fastcgi cache 配置详解

时间:2015-06-28 20:26来源:linux.it.net.cn 作者:IT

为了使nginx + webpy + fastcgi 这一组合达到性能最优,决定配置nginx的fastcgi cache,本文将详述配置的步骤和所遇到的问题。

一. 安装nginx最新稳定版本和nginx_ngx_cache_purge模块

我(即OutOfMemory.CN)使用的nginx版本是最新稳定版nginx 1.2.6, 首先需要在Linux安装此nginx版本。

首先需要切换到某个安装目录,执行下面命令下载nginx安装包:

wget http://nginx.org/download/nginx-1.2.6.tar.gz

并解压tar.gz文件:

tar -xvf ./nginx-1.2.6.tar.gz

按照上面步骤下载并解压nginx模块nginx_ngx_cache_purge的最新稳定版本,我用的是ngx_cache_purge-2.0

文件下载解压完毕之后就可以安装了,切换到nginx路径下,执行如下命令:

./configure --prefix=/data0/nginx-1.2.6/ --user=web --group=web --with-http_ssl_module --add-module=../ngx_cache_purge-2.0 --with-http_stub_status_module

这里configure配置了安装的路径,和nginx的用户以及用户组(需要预先创建好),和nginx fastcgi cache最为相关的是加上 --add-module=../ngx_cache_pruge-2.0 指定要添加purge缓存的模块。

然后执行 make 一切顺利,再执行make install

二. 配置nginx fastcgi cache 和purge

首先在http范围内(您也可以根据需要添加到server配置内)添加下面配置:

#fast cgi cache def
fastcgi_cache_path  /data0/nginx-1.2.6/cache levels=1:2 keys_zone=nginx_webpy_cache:1m inactive=1d;

fastcgi_temp_path /data0/nginx-1.2.6/cache/temp;

fastcgi_cache_key "$scheme$request_method$host$request_uri$is_args$args";

这三行配置说明如下:

  • 第一行指定了fastcgi缓存的路径为 /data0/nginx-1.2.6/cache , levels=1:2 表示生成缓存文件路径规则,示例:5/29/f08bc91a7a0ff59aad7121e2c1d79295,keys_zone=nginx_webpy_cache:1m 指定缓存使用共享内存的名称为nginx_webpy_cache共享内存大小为1m,inactive=1d表示缓存在1天之后过期。
  • 第二行指定fastcgi缓存的临时路径的地址
  • 第三行指定缓存键的格式$scheme$request_method$host$request_uri$is_args$args 这样配置的缓存键示例: httpGEToutofmemory.cn/code-snippet/2075/java-ArrayList-yichu-repeat-item

需要特别注意nginx运行用户必须有上面配置的缓存路径和临时路径的读写权限, 否则缓存不了

然后需要在location配置中根据需要添加相应的缓存配置

例如我的配置:

        location ~^ /code-snippet/ {
                fastcgi_param REQUEST_METHOD $request_method;
                fastcgi_param QUERY_STRING $query_string;
                fastcgi_param CONTENT_TYPE $content_type;
                fastcgi_param CONTENT_LENGTH $content_length;
                fastcgi_param GATEWAY_INTERFACE CGI/1.1;
                fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
                fastcgi_param REMOTE_ADDR $remote_addr;
                fastcgi_param REMOTE_PORT $remote_port;
                fastcgi_param SERVER_ADDR $server_addr;
                fastcgi_param SERVER_PORT $server_port;
                fastcgi_param SERVER_NAME $server_name;
                fastcgi_param SERVER_PROTOCOL $server_protocol;
                fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_script_name;

                fastcgi_pass 127.0.0.1:9002;

#fastcgi cache def
                fastcgi_cache   nginx_webpy_cache; #指定使用缓存共享内存的名字,和上面定义相对应
                fastcgi_cache_valid   200 302  1h; #指定200和302要缓存的时长
                fastcgi_cache_valid   301      1d; #指定301要缓存的时间
                fastcgi_cache_valid   any      10m; #指定其他状态号要缓存的时间
                fastcgi_cache_min_uses  1; #指定缓存的最少使用次数
                fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; #指定要忽略fast cgi cache输出的头
                fastcgi_hide_headers "Set-Cookie"; #指定在输出缓存时要忽略的http相应头
                fastcgi_cache_use_stale error  timeout invalid_header http_500; #指定500的处理

                fastcgi_cache_valid  60m; #指定一般性的缓存时间

                add_header X-Cache $upstream_cache_status; #添加表示缓存是否命中的响应头
#end            
       }

这里fastcgi cache相关的配置在注释#fastcgi cache def 和 #end之间,每一行都有对应的注释,这里要特别注意fastcgi_ignore_headers这个不配置会导致缓存的状态一直是MISS。

以上配置完毕后,就可以在浏览器中查看是否成功缓存了,但是只缓存还是不够的,我们还需要在需要的时候能够清除缓存,比如对于OutOfMemory.CN来说在用户编辑了代码之后,必须马上清除对应url的缓存,这样用户才可以马上看到修改后的结果。

如下是purge缓存相关的配置:

   location ~ /purge(/.*) {
            allow              127.0.0.1;
            deny               all;
            fastcgi_cache_purge     nginx_webpy_cache  "$scheme$request_method$host$1$is_args$args";
        }

这个配置使用了nginx_ngx_cache_purge模块,这个配置里面首先要指定purge url的规则为 /purge(/.*) purge后的括号内的正则表达式要在下面使用,在location里面的allow指定允许那些ip访问purge,deny all配置禁止其他所有ip访问此路径;

fastcgi_cache_purge nginx_webpy_cache "$scheme$request_method$host$1$is_args$args"; 指定purge对应的cache名称为nginx_webpy_cache,其缓存键的格式为$scheme$request_method$host$1$is_args$args,这里$1就是在location正则括号内定义的部分,这个键值要和上面缓存的键值一致。

三. 做webpy fastcgi cache 时遇到的问题

我做这个配置很曲折,经过了4天才完全解决问题,我遇到的问题如下:

  1. fastcgi_ignore_headers 这个配置中如果响应中有cookie的话必须要加上Set-Cookie否则缓存状态会一直MISS
  2. 用户权限问题,注意nginx运行使用的用户必须有缓存路径和缓存临时路径两个路径的读写权限,否则缓存一直会MISS
  3. 注意对于webpy 的fastcgi做缓存用的是nginx fastcgi cache 而不是 proxy cache
  4. 注意purge中配置的缓存键是要和上面一致的,$1要替代上面的$request_uri

就是这样子了,webpy + nginx + fastcgi + fastcgi cache 还是非常给力的!!



(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容