Nginx proxy_cache 使用示例

本文介绍如何使用 Nginx 的 proxy_cache 功能进行动态网页缓存,包括安装配置过程及关键参数说明,例如 proxy_cache_valid 控制缓存时间。

原文出处:http://blog.chenlb.com/2010/04/nginx-proxy-cache.html

<!-- google_ad_section_start -->

动态网站使用缓存是很有必要的。前段时间使用了 nginx proxy_stroe 来保存静态页面,以达到缓存的目的。当然 proxy stroe 用来做缓存是不够好的方案。

缓存这一块当然还有 squid 之类的独立缓存服务器。如果使用 nginx 为 web 服务器,还要加个 squid 来缓存,是觉得多了一个 http 请求层。幸好 nginx 0.7 有了 proxy_cache 来做这个缓存的事。

之前来有个 ncache 是新浪员工开发的 nginx 模块(好像只能在 nginx 0.6 中编译无运行)。已经停止维护了,已经被加到 nginx 标准库里了。昨天还不知道 proxy_cache 就是 ncache 的功能时,还在努力匹配 ncahce,浪费了N多时间,最终没看到可以缓存。后来尝试 proxy_cache 才解决,且使用简单。

安装 Nginx 请看:安装 Nginx 配置负载均衡,如果没有 pcre 库,可以到http://sourceforge.net/projects/pcre/files/ 下载(我用的是 8.02)。

nginx 0.7.65 默认安装就可以了。

安装好后开始匹配 proxy_cache,先准备后台服务器的文件,如是 time.jsp,内容:

  1. <%=newjava.util.Date()%>
<%=new java.util.Date() %>

conf/nginx.conf:

  1. usernobody;
  2. worker_processes1;
  3. error_loglogs/error.log;
  4. pidlogs/nginx.pid;
  5. events{
  6. worker_connections1024;
  7. useepoll;
  8. }
  9. http{
  10. includemime.types;
  11. default_typeapplication/octet-stream;
  12. log_formatmain'$remote_addr-$remote_user[$time_local]"$request"'
  13. '$status$body_bytes_sent"$http_referer""$request_body"'
  14. '"$http_user_agent""$http_x_forwarded_for""$request_time"';
  15. sendfileon;
  16. keepalive_timeout60;
  17. proxy_cache_path/var/cache0levels=1:2keys_zone=pnc:100minactive=2hmax_size=10g;
  18. upstreambackend{
  19. server192.168.1.2:8080weight=6;
  20. #server192.168.1.3:8080weight=4;
  21. }
  22. server{
  23. listen80;
  24. server_namelocalhost;
  25. access_loglogs/access.80.logmain;
  26. location/{
  27. proxy_cachepnc;
  28. proxy_temp_path/var/nginx_temp;
  29. #proxy_cache_key"$request_uri$request_body";
  30. #proxy_cache_methodsGETPOST;
  31. proxy_cache_valid2003041m;
  32. proxy_passhttp://backend;
  33. }
  34. error_page500502503504/50x.html;
  35. location=/50x.html{
  36. roothtml;
  37. }
  38. }
  39. }
user  nobody;
worker_processes  1;
error_log  logs/error.log;
pid        logs/nginx.pid;

events {
    worker_connections  1024;
    use epoll;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" "$request_body" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$request_time"';

    sendfile        on;
    keepalive_timeout  60;

    proxy_cache_path /var/cache0 levels=1:2 keys_zone=pnc:100m inactive=2h max_size=10g;
    upstream backend {
        server 192.168.1.2:8080  weight=6;
        #server 192.168.1.3:8080  weight=4;
    }

    server {
        listen       80;
        server_name  localhost;

        access_log  logs/access.80.log  main;

        location / {
            proxy_cache pnc;
            proxy_temp_path /var/nginx_temp;
            #proxy_cache_key "$request_uri$request_body";
            #proxy_cache_methods GET POST;
            proxy_cache_valid 200 304 1m;
            proxy_pass http://backend;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

启动 nginx 后,打开浏览器,可以狂刷 Ctrl + F5,可以看到一样的页面。一分钟后再会一个新的页面。

是 proxy_cache_valid 200 304 1m; 告诉 nginx 后台返回的结果是 200 或 304 的响应,用 1m(分钟)的缓存。

proxy_cache_key 默认是 "$scheme$host$request_uri"。

proxy_cache_methods 默认是 GET HEAD。

当要缓存 post 请求后,要用 proxy_cache_methods POST 来打开。并且 proxy_cache_key 要对,post 的请求 query string 是在请求体内,所以加 $request_body 作为 key 的一部分。要用 post ,上面匹配去了注释就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值