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,增加:
意思表示開啟這個location的緩存,但是我重啟nginx以后,重新訪問站點發現在緩存目錄下并沒有生成緩存文件。于是,我首先這么做:
一、會不會是瀏覽器有緩存,于是我清空瀏覽器,甚至使用其它瀏覽器訪問站點,并且按狂刷。結果還是沒有生成靜態文件。
二、會不會是nginx自動判斷我的內容,太少就不會緩存。于是我賦值了一大堆字符串到一個文件中,然后使用瀏覽器狂訪問那個文件,結果還是沒有生成靜態文件。
于是到網上搜索,結果也沒有搜索到有用的信息。難道我安裝的nginx有問題?重新從官網下載編譯安裝,還是沒有解決問題。
原來是這樣工作的
后來不斷的摸索,仔細研究。發現還要添加以下兩條才能讓proxy_cache工作,
proxy_cache_valid 200 304 302 24h;
指定各個狀態碼下緩存的時間,200是很重要的,如果有其它的要緩存可以在后邊加上
代碼如下 | |
proxy_pass http://www.49028c.com; |
指定獲取靜態內容的地址,其實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.49028c.com; } } } |
設置proxy_cache緩存與取消緩存
在配置文件的server{}內,添加這么一句即可:
代碼如下 | |
location ~ .*/.(css|js)$ { add_header Cache-Control 'no-store'; } |
在nginx.conf里的http塊加入以下代碼
#proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區
proxy_temp_path /tmp/proxy_temp_dir;
#設置名稱為nginx_cache,內存緩存空間大小為500MB,30天沒有被訪問的內容自動清除,硬盤緩存空間大小為30GB。
代碼如下 | |
proxy_cache_path /tmp/proxy_cache_dir levels=1:2 keys_zone=nginx_cache:200m inactive=3d max_size=30g; |
在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 |