proxy_cache方式跟memcached內存級別的緩存還是不能比擬,但nginx目前還不能做memcached的write動作,所以簡單配置proxy_cache也能抵擋不少鴨梨。
沒有配置好proxy_cache
但在網絡上搜索幾篇文章以後,發現大家寫的很模糊,很多文章都是抄襲復制品。所以按照網絡上的教程,我一開始是這麼配置的:
在http段增加:
代碼如下proxy_cache_path /tmp/qttc_cache levels=1:2 keys_zone=qttc:200m inactive=1d max_size=10g;
然後在server中找到你要緩存的location,增加:
代碼如下proxy_cache qttc;
意思表示開啟這個location的緩存,但是我重啟nginx以後,重新訪問站點發現在緩存目錄下並沒有生成緩存文件。於是,我首先這麼做:
一、會不會是浏覽器有緩存,於是我清空浏覽器,甚至使用其它浏覽器訪問站點,並且按狂刷。結果還是沒有生成靜態文件。
二、會不會是nginx自動判斷我的內容,太少就不會緩存。於是我賦值了一大堆字符串到一個文件中,然後使用浏覽器狂訪問那個文件,結果還是沒有生成靜態文件。
於是到網上搜索,結果也沒有搜索到有用的信息。難道我安裝的nginx有問題?重新從官網下載編譯安裝,還是沒有解決問題。
原來是這樣工作的
後來不斷的摸索,仔細研究。發現還要添加以下兩條才能讓proxy_cache工作,
proxy_cache_valid 200 304 302 24h;
指定各個狀態碼下緩存的時間,200是很重要的,如果有其它的要緩存可以在後邊加上
代碼如下proxy_pass http://www.45it.net;
指定獲取靜態內容的地址,其實proxy_cache的原理就是從一個你指定的地址獲取內容,然後緩存。當下次你訪問時,nginx會自動判斷有沒有緩存文件?如果有的話緩存文件是不是已經過期(緩存文件的有效期就是第一條設置的)?如果前面兩條任何一條成立就會從proxy_pass的地址重新獲取頁面信息。
於是經過配置以後,終於能生成緩存文件了:
代碼如下
[root@lee qttc_cache]# ll
總用量 24
drwx------ 3 www www 4096 7月 19 08:55 4
drwx------ 5 www www 4096 7月 19 08:55 8
drwx------ 3 www www 4096 7月 19 08:55 a
drwx------ 3 www www 4096 7月 19 08:55 c
drwx------ 3 www www 4096 7月 19 08:55 d
drwx------ 3 www www 4096 7月 19 08:55 e
可惜,如果你要清空緩存,可以在後台加一個功能使用後端語言刪除,或者使用一個Purge插件通過IP加端口訪問的方式來清楚緩存文件。
PS.
如果你要清楚某一個url的緩存文件,就比較悲催了。但也不是不能做到。因為nginx生成url文件的時候,存放的目錄以及生成的哈希文件名都是固定的,你也可以使用proxy_cache_key來指定生成的key的字段內容。
如果你掌握它的生成規則,你就可以寫一個管理器來快速清空單個url緩存。最爛的方法也可以把緩存目錄清空,接著訪問你要需要單獨清空的url,然後再到緩存目錄裡看看生成的緩存目錄與文件名,再你需要單獨清空這個url的緩存時直接把文件干掉就好。
因為proxy_cache需要proxy_pass配置才能生成緩存內容,而目前一般的站點配置中,比如PHP站點都是把php頁面proxy_pass到後台PHP程序處理,所以你可以在處理php的location裡加上proxy_cache把php動態語言生成的內容結果緩存。對於那些靜態文件其實也不需要什麼proxy_cache來緩存,因為靜態文件跟proxy_cache最終生成的緩存文件一樣都是在磁盤上的一個文件。
因此正確的描述是:它是一個重定向,反向代理的緩存功能,不是根據url生成緩存靜態文件的功能
下面我把我的全部配置代碼拿出來
proxy_cache是nginx自帶的內置緩存模塊,配置一下就可以用了,看下面的配置
vi /usr/local/nginx/conf/nginx.conf
代碼如下
user zhangy users;
worker_processes 10;
error_log /var/vlogs/nginx_error.log crit;
pid /var/vlogs/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
include mime.types;
default_type application/octet-stream;
#charset gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
//============
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;
proxy_temp_path /usr/local/nginx/proxy_temp;
/*levels設置目錄層次
keys_zone設置緩存名字和共享內存大小
inactive在指定時間內沒人訪問則被刪除在這裡是1天
max_size最大緩存空間*/
proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=content:20m inactive=1d max_size=100m;
//============等號中間要加的,關鍵只要加上proxy_cache_path
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
upstream myselfxtajmd {
server 127.0.0.1:10002;
server 127.0.0.1:10001 weight=5;
}
server
{
listen 10000;
server_name localhost;
index index.html index.htm index.php;
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /var/log/test.log access;
location /
{
proxy_cache content; //根keys_zone後的內容對應
proxy_cache_valid 200 304 301 302 10d; //哪些狀態緩存多長時間
proxy_cache_valid any 1d; //其他的緩存多長時間
proxy_cache_key $host$uri$is_args$args; //通過key來hash,定義KEY的值
proxy_pass http://myselfxtajmd;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
//動態的放過
location ~ .*.(php|jsp|cgi)?$
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://www.45it.net;
}
}
}
設置proxy_cache緩存與取消緩存
在配置文件的server{}內,添加這麼一句即可:
在nginx.conf裡的http塊加入以下代碼
#proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區
proxy_temp_path /tmp/proxy_temp_dir;
#設置名稱為nginx_cache,內存緩存空間大小為500MB,30天沒有被訪問的內容自動清除,硬盤緩存空間大小為30GB。
在server加入以下代碼
代碼如下
location / {
proxy_cache nginx_cache;
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
expires 30d;
}
重啟Ngnix
代碼如下 /usr/local/nginx/sbin/nginx -s reload