2014-03-24 14:35 12085人閱讀 評論(3) 收藏 舉報 php
分類: html
Nginx(5) php(27)
linux(38)
linux
版權聲明:本文爲博主原創文章,未經博主容許不得轉載。nginx
這幾天要用到nginx的緩存,折騰了兩天,終於搞定了,後端
把方法寫下來以示備忘或給後來者一個參考:緩存
首先用的緩存是proxy_cache.服務器
在http段里加入下列幾句:jsp
[plain] view plaincopyurl
proxy_connect_timeout 5; spa
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;
proxy_temp_path /home/temp_dir;
proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:50m inactive=20m max_size=30g;
上面的各行的參數我再時不解釋,網上有不少。
接下來在要緩存的service里加入:
[plain] view plaincopy
location /gou/detail-id-116 {
##緩存
index index.html index.htm index.php;
proxy_cache cache_one;
proxy_cache_valid 200 302 1h;
proxy_cache_key $host$uri$is_args$args;
proxy_pass http://contactpool;
proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie";#不處理後端服務器返回的指定響應頭
expires 30d;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
固然能夠用正則緩存更多的頁面如:~.*\.(php|jsp|cgi)?$
上面的我只解釋一下地方:
[plain] view plaincopy
proxy_ignore_headers
這個表示不處理後端服務器返回的指定響應頭,做用就是可以緩存動態頁面,好比.php的頁面,若是不加這一行就只能緩存靜態的頁面內容了。
如今:nginx -s reload 後緩存就有了,
接下來如何在須要的時候清理緩存呢,
網上一位大牛分析了nginx是如何存的緩存文件:
計算方法:
1) nginx先把請求地址/1.png用md5進行哈希,獲得e0bd86606797639426a92306b1b98ad9
md5的參數就是上面的配置中:
[plain] view plaincopy
proxy_cache_key
值,如md5("www.xxx.com/gou/detail-id-116");
2) level=1:2就是把最後一位數9拿出來建一個目錄,而後再把9前面的2位建一個目錄,最後把剛纔獲得的這個緩存文件放到9/ad目錄中。
一樣的方法推理,若是level=1:1,那麼緩存文件的路徑就是/usr/local/nginx/cache/9/d/e0bd86606797639426a92306b1b98ad9
那麼咱們就能夠寫一個腳原本清理特定的緩存了:
[plain] view plaincopy
#!/usr/bin/env php
<?php
$cache_dir = '/usr/local/nginx/cache/';
$request_uri = $argv[1];
$url_hash = md5($request_uri);
$dir1 = substr($url_hash,-1,1) . '/';
$dir2 = substr($url_hash,-3,2) . '/';
$cached_file = $cache_dir . $dir1 . $dir2 . $url_hash;
if (is_file($cached_file)) {
if (unlink($cache_dir . $dir1 . $dir2 . $url_hash)) {
echo $request_uri . " 緩存清除成功\n";
} else {
echo $request_uri . " 緩存清除失敗\n";
}
} else {
echo $request_uri . " 未被緩存\n";
}