xylz,imxylz

          關(guān)注后端架構(gòu)、中間件、分布式和并發(fā)編程

             :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            111 隨筆 :: 10 文章 :: 2680 評(píng)論 :: 0 Trackbacks

          使用Nginx的proxyCache緩存功能

          Nginx從0.7.48版本開(kāi)始,支持了類似Squid的緩存功能。這個(gè)緩存是把URL及相關(guān)組合當(dāng)作Key,用md5編碼哈希后保存在硬盤上,所以它可以支持任意URL鏈接,同時(shí)也支持404/301/302這樣的非200狀態(tài)碼。雖然目前官方的Nginx Web緩存服務(wù)只能為指定URL或狀態(tài)碼設(shè)置過(guò)期時(shí)間,不支持類似Squid的PURGE指令,手動(dòng)清除指定緩存頁(yè)面,但是,通過(guò)一個(gè)第三方的Nginx 模塊,可以清除指定URL的緩存。

          Nginx的Web緩存服務(wù)主要由proxy_cache相關(guān)指令集和fastcgi_cache 相關(guān)指令集構(gòu)成,前者用于反向代理時(shí),對(duì)后端內(nèi)容源服務(wù)器進(jìn)行緩存,后者主要用于對(duì)FastCGI的動(dòng)態(tài)程序進(jìn)行緩存。兩者的功能基本上一樣。

          最新的Nginx 0.8.31版本,proxy_cache和fastcgi_cache已經(jīng)比較完善,加上第三方的ngx_cache_purge模塊(用于清除指定 URL的緩存),已經(jīng)可以完全取代Squid。我們已經(jīng)在生產(chǎn)環(huán)境使用了 Nginx 的 proxy_cache 緩存功能超過(guò)兩個(gè)月,十分穩(wěn)定,速度不遜于 Squid。

          在功能上,Nginx已經(jīng)具備Squid所擁有的Web緩存加速功能、清除指定URL緩存的功能。而在性能上,Nginx對(duì)多核CPU的利用,勝過(guò)Squid不少。另外,在反向代理、負(fù)載均衡、健康檢查、后端服務(wù)器故障轉(zhuǎn)移、 Rewrite重寫、易用性上,Nginx也比Squid強(qiáng)大得多。這使得一臺(tái)Nginx可以同時(shí)作為“負(fù)載均衡服務(wù)器”與“Web緩存服務(wù)器”來(lái)使用。

          Nginx的基礎(chǔ)依賴等這里就不再安裝了,我們直接從Nginx開(kāi)始。

          wget http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz
          tar xvzf ngx_cache_purge
          -1.0.tar.gz
          wget http
          ://nginx.org/download/nginx-0.8.31.tar.gz
          tar zxvf nginx
          -0.8.31.tar.gz
           cd nginx
          -0.8.31/
          ./configure --user=nginx --group=nginx --add-module=../ngx_cache_purge-1.0 --prefix=/home/nginx \
              
          --with-http_stub_status_module
          make 
          & make install

          以上就安裝成功了,下面就是設(shè)置/home/nginx/conf/nginx.conf文件了。
          下面的命令實(shí)在http模塊里面,但是又在server模塊之上。

          proxy_cache_path  /tmp/nginx_cache  levels=1:2   keys_zone=cache_one:200m inactive=10m max_size=5m


          levels指定該緩存空間有兩層hash目錄,第一層目錄是1個(gè)字母,第二層為2個(gè)字母,保存的文件名就會(huì)類似/tmp/nginx_cache/0/da/9cebc9546cefbf52275a01317d96cda0 ;keys_zone為這個(gè)空間起個(gè)名字,比如上面的cache_one,200m指空間大小為200MB;inactive的10m指緩存默認(rèn)時(shí)長(zhǎng)10分鐘;max_size的5m是指單個(gè)文件超過(guò)5m的就不緩存;clean_time指定一分鐘清理一次緩存。

          接下來(lái)就是在server模塊里面配置cache了。

          proxy_cache_valid  200 304 1h;
          proxy_cache_valid  
          301 302 1h;
          proxy_cache cache_one;
          proxy_cache_valid any 1m;
          # 其它文件保存1分鐘
          # hash key

          proxy_cache_key $host$uri$is_args$args;

          上面的例子是說(shuō)HTTP CODE為200,304,301,302的都緩存一個(gè)小時(shí),使用的緩存名稱是cache_one,就是在http里面定義的緩存名稱。其它類型的緩存時(shí)間是1分鐘。緩存的文件名是主機(jī)名+地址+參數(shù)。比如說(shuō)我們進(jìn)去看看我們的緩存文件,在目錄/tmp/nginx_cache中:

          [root@xylz nginx_cache]# ll /tmp/nginx_cache/
          總用量 56K
          drwx
          ------ 3 nginx nginx 4.0K  1月 28 21:48 0
          drwx
          ------ 3 nginx nginx 4.0K  1月 28 21:50 1
          drwx
          ------ 3 nginx nginx 4.0K  1月 28 22:04 4
          drwx
          ------ 3 nginx nginx 4.0K  1月 28 22:09 5
          drwx
          ------ 3 nginx nginx 4.0K  1月 28 21:49 6
          drwx
          ------ 5 nginx nginx 4.0K  1月 28 21:49 7
          drwx
          ------ 3 nginx nginx 4.0K  1月 28 21:49 8
          drwx
          ------ 4 nginx nginx 4.0K  1月 28 22:09 9
          drwx
          ------ 3 nginx nginx 4.0K  1月 28 21:49 a
          drwx
          ------ 5 nginx nginx 4.0K  1月 28 21:52 b
          drwx
          ------ 3 nginx nginx 4.0K  1月 28 21:50 c
          drwx
          ------ 5 nginx nginx 4.0K  1月 28 21:48 d
          drwx
          ------ 4 nginx nginx 4.0K  1月 28 21:52 e
          drwx
          ------ 4 nginx nginx 4.0K  1月 28 21:49 f
          [root
          @xylz nginx_cache]# ll /tmp/nginx_cache/f/
          總用量 8.0K
          drwx
          ------ 2 nginx nginx 4.0K  1月 28 22:09 2a
          drwx
          ------ 2 nginx nginx 4.0K  1月 28 22:02 8b
          [root
          @xylz nginx_cache]# ll /tmp/nginx_cache/f/2a/
          總用量 4.0K
          -rw------- 1 nginx nginx 2.2K  1月 28 22:09 aaf88d70a381d91b298d3a05f06572af

          最后我們使用ngx_purge_module來(lái)開(kāi)放一個(gè)地址出來(lái)允許手動(dòng)清除緩存。

                  location ~ /purge(/.*) {
                      proxy_cache_purge    cache_one   
          $host$1$is_args$args;
                      }


          在上面中$1就表示我們要清除的地址(uri,如果有參數(shù),需要參數(shù))。

          好了我們來(lái)看一個(gè)效果。

          www.imxylz.info GET /p/227.html HTTP/1.0 200 9951 0.252 0.252
          www
          .imxylz.info GET /p/227.html HTTP/1.0 200 9951 0.000 -
          www
          .imxylz.info GET /p/227.html HTTP/1.0 200 9951 0.000 -

          可以看到除了第一次使用了252毫秒以外,第二次第三次都沒(méi)有花費(fèi)后端apache服務(wù)器的時(shí)間,而且每次發(fā)送的字節(jié)內(nèi)容是固定的。實(shí)際上這里/p/227.html是wordpress動(dòng)態(tài)生成的內(nèi)容,默認(rèn)地址應(yīng)該是?id=227,只不過(guò)我將URL重寫了,便于搜索引擎爬去而已。

          然后我們使用地址/purge/p/227.html來(lái)清除緩存。

          Successful purge
                      Key 
          : www.imxylz.info/p/227.html
                      Path
          : /tmp/nginx_cache/9/66/dfea2886862c4eec9ef855215c563


          然后再訪問(wèn)就可以看到?jīng)]有緩存了。

          www.imxylz.info GET /p/227.html HTTP/1.0 200 9951 0.262 0.262


          當(dāng)然了,如果想php/jsp等不使用緩存,那么就配一個(gè)location,同時(shí)不配置proxy_cache即可。location的條件可以如下:

              location ~ .*\.(php|jsp|cgi)?$
                      {
                      proxy_set_header Host  
          $host;
                      proxy_set_header X
          -Forwarded-For  $remote_addr;
                      proxy_pass http
          ://backend_server;
                      }




          ©2009-2014 IMXYLZ |求賢若渴
          posted on 2010-01-29 16:09 imxylz 閱讀(24144) 評(píng)論(2)  編輯  收藏 所屬分類: nginx

          評(píng)論

          # re: 使用Nginx的proxyCache緩存功能 2015-05-15 14:00 wd
          nginx支持302這種非200狀態(tài)碼,但是當(dāng)有302經(jīng)過(guò)nginx,它緩存的是什么?是源文件還是鏈接?我從瀏覽器輸入的時(shí)候還是會(huì)收到302啊。  回復(fù)  更多評(píng)論
            

          # re: 使用Nginx的proxyCache緩存功能 2015-05-15 14:30 wd

          瀏覽器收到302之后,就直接去源鏈接下載了,消息都不經(jīng)過(guò)nginx了,然后怎么緩存呢?  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          ©2009-2014 IMXYLZ
          主站蜘蛛池模板: 武定县| 香港| 宜丰县| 芷江| 枣强县| 平泉县| 垫江县| 左权县| 竹溪县| 台中市| 资源县| 德阳市| 尖扎县| 凌源市| 韶山市| 梁山县| 汝城县| 南溪县| 襄城县| 磴口县| 茌平县| 包头市| 罗平县| 琼海市| 安远县| 陆丰市| 海阳市| 晋江市| 营口市| 平谷区| 天水市| 澄江县| 鸡东县| 台南县| 雅安市| 河北省| 德安县| 吉水县| 栾川县| 富平县| 马公市|