NGINX下fastcgi_cache模塊,使其實(shí)現緩存,效果的確不錯,易淘幫參考張戈的文章折騰了一番。
本文分享的 Nginx 緩存需要額外編譯 ngx_cache_purge 模塊。至于下載模塊、重新編譯以及平滑升級前文已經(jīng)分享過(guò)了,本文就不再贅述了。不會(huì )的朋友可以參考下文:
- cd ~/lnmp/src
- wget http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz
- tar xzf ngx_cache_purge-2.1.tar.gz
- cd nginx-1.8.0 #你的nginx解壓目錄,版本號根據你自己的版本號定義。
- make clean
- ./configure --prefix=/usr/local/nginx --user=www --group=www --add-module=../ngx_cache_purge-2.3 \
- --with-http_stub_status_module \
- --with-http_spdy_module \
- --with-http_ssl_module --with-ipv6 \
- --with-http_gzip_static_module \
- --with-http_realip_module \
- --with-http_flv_module \
- --with-ld-opt=-ljemalloc
- make
- mv /usr/local/nginx/sbin/nginx{,$(date +%m%d)}
- cp objs/nginx /usr/local/nginx/sbin
- service nginx resatrt
- mkdir -p /var/nginx/cache/one
- chown -R www.www /var/nginx
為網(wǎng)站開(kāi)啟Nginx緩存加速,支持html偽靜態(tài)頁(yè)面
要用這個(gè)緩存功能,建議重新弄一個(gè) server 模塊(替換之前的),如下代碼是張戈博客目前正在使用的規則(已刪除了我自定義的偽靜態(tài)規則,避免混淆視聽(tīng)):
- ####################################################################################################
- # Nginx開(kāi)啟fastcgi_cache-purge緩存加速,支持html偽靜態(tài)頁(yè)面 By 張戈博客
- # 文章地址:http://zhangge.net/5042.html ?
- # 參 考 ①:http://jybb.me/nginx-wordpress-fastcgi_cache-purge
- # 參 考 ②:https://rtcamp.com/wordpress-nginx/tutorials/single-site/fastcgi-cache-with-purging/
- # 轉載本文請務(wù)必保留以上申明,謝謝合作!
- ####################################################################################################
- #下面各個(gè)參數的含義請自行百度,我就不贅述了
- #下面2行的中的wpcache路徑請自行提前創(chuàng )建,否則可能會(huì )路徑不存在而無(wú)法啟動(dòng)nginx,max_size請根據分區大小自行設置
- fastcgi_cache_path /tmp/cache/wpcache levels=1:2 keys_zone=WORDPRESS:250m inactive=1d max_size=1G;
- fastcgi_temp_path /tmp/cache/wpcache/temp;
- fastcgi_cache_key "$scheme$request_method$host$request_uri";
- fastcgi_cache_use_stale error timeout invalid_header http_500;
- #忽略一切nocache申明,避免不緩存偽靜態(tài)等
- fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
- server
- {
- listen 80;
- #請修改為自己的域名
- server_name zhangge.net;
- index index.html index.htm index.php default.html default.htm default.php;
- #請修改為自己網(wǎng)站的存放路徑
- root /home/wwwroot/zhangge.net;
- set $skip_cache 0;
- #post訪(fǎng)問(wèn)不緩存
- if ($request_method = POST) {
- set $skip_cache 1;
- }
- #動(dòng)態(tài)查詢(xún)不緩存
- if ($query_string != "") {
- set $skip_cache 1;
- }
- #后臺等特定頁(yè)面不緩存(其他需求請自行添加即可)
- if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
- set $skip_cache 1;
- }
- #對登錄用戶(hù)、評論過(guò)的用戶(hù)不展示緩存(這個(gè)規則張戈博客并沒(méi)有使用,所有人看到的都是緩存)
- if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
- set $skip_cache 1;
- }
- #這里請參考你網(wǎng)站之前的配置,特別是sock的路徑,弄錯了就502了!
- location ~ [^/]\.php(/|$)
- {
- try_files $uri =404;
- fastcgi_pass unix:/tmp/php-cgi.sock;
- fastcgi_index index.php;
- include fastcgi.conf;
- #新增的緩存規則
- fastcgi_cache_bypass $skip_cache;
- fastcgi_no_cache $skip_cache;
- add_header X-Cache "$upstream_cache_status From $host";
- fastcgi_cache WORDPRESS;
- fastcgi_cache_valid 200 301 302 1d;
- }
- location / {
- #此處可以添加自定義的偽靜態(tài)規則(之前你新增的偽靜態(tài)規則可以添加到這,沒(méi)有就不用了)
- try_files $uri $uri/ /index.php?$args;
- rewrite /wp-admin$ $scheme://$host$uri/ permanent;
- }
- #緩存清理配置(可選模塊,請細看下文說(shuō)明)
- location ~ /purge(/.*) {
- allow 127.0.0.1;
- allow "此處填寫(xiě)你服務(wù)器的真實(shí)外網(wǎng)IP";
- deny all;
- fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
- }
- location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
- access_log off; log_not_found off; expires max;
- }
- location = /robots.txt { access_log off; log_not_found off; }
- location ~ /\. { deny all; access_log off; log_not_found off; }
- #請注意修改日志路徑
- access_log /home/wwwlogs/zhangge.net.log access;
- }
請仔細閱讀代碼中的所有注釋?zhuān)撔薷牡男薷?,該?chuàng )建的創(chuàng )建,該補充的根據實(shí)際情況補充,否則使用之后又來(lái)找張戈吐槽各種問(wèn)題了!
上文已經(jīng)提到了 fastcgi_cache 有一個(gè)量身定做的WordPress緩存清理插件:Nginx Helper
所以,接下來(lái)我們就去安裝這個(gè)插件 。非常簡(jiǎn)單,直接進(jìn)入WordPress后臺插件安裝界面搜索 Nginx Helper 關(guān)鍵詞在線(xiàn)安裝即可。
安裝后,從后臺【工具】==>【Nginx Helper】打開(kāi)插件設置界面如下所示:
Ps:順帶說(shuō)一下后面2項的含義:
記錄插件日志:勾選這個(gè)選項后,插件設置下面會(huì )顯示日志記錄存放路徑。這個(gè)功能主要用來(lái)測試插件的設置,比如去已緩存的文字發(fā)表一個(gè)新的評論,然后看下日志里面是否出現刪除記錄。
插入緩存信息:勾選這個(gè)選項后,前臺頁(yè)面的源代碼底部將插入頁(yè)面的緩存信息,類(lèi)似如下:
- <!--Cached using Nginx-Helper on 2015-05-30 12:34:22. It took 162 queries executed in 1.922 seconds.-->
- <!--Visit http://wordpress.org/extend/plugins/nginx-helper/faq/ for more details-->
勾上第啟用緩存清理后,將出現如下選項:
該怎么設置,應該看圖就懂了吧?否則張戈苦逼的用中文標注了半天就白費功夫了!
上圖我也標注的比較清楚了,還是詳細解釋一下吧!
①、purge模式
這個(gè)模式需要保留上文 Nginx 配置中的 purge 清理路徑,清理的時(shí)候會(huì )產(chǎn)生一個(gè)請求。
出于安全考慮,一般 purge 都不會(huì )完全開(kāi)放!只有特定的 IP 可以訪(fǎng)問(wèn),所以,如果用了CDN的朋友,再使用模式一,則需要在服務(wù)器上的hosts中強制一個(gè)真實(shí)IP,沒(méi)搞懂的話(huà)就放棄這個(gè)模式吧。
②、文件模式
模式二是直接清理對應的緩存文件,不需要請求 purge這個(gè)清理路徑,所以使用模式二,不需要配置上文 Nginx 的 purge 規則(我個(gè)人推薦使用這個(gè)模式)。
由于插件作者定義的緩存路徑是 /var/run/nginx-cache ,而我們可能會(huì )根據服務(wù)器實(shí)際情況來(lái)自定義緩存路徑,這樣一來(lái),緩存路徑的不同就會(huì )導致插件無(wú)法找到緩存文件并刪除!
很簡(jiǎn)單,在WordPress根目錄下的wp-config.php中新增如下代碼即可:
- //根據實(shí)際情況定義緩存的存放路徑
- define( 'RT_WP_NGINX_HELPER_CACHE_PATH','/tmp/cache/wpcache');
Ps:不知道添加到第幾行的話(huà),可以添加到 define('WPLANG', 'zh_CN'); 的后面即可。添加后建議重載一下php,確保變量生效(主要針對開(kāi)啟了PHP緩存的網(wǎng)站)。
①、緩存效果
替換新的配置,并且重載Nginx之后,訪(fǎng)問(wèn)前臺頁(yè)面,查看header,會(huì )多出一個(gè)X-Cache 標志。
X-Cache 一般會(huì )有3個(gè)狀態(tài):MISS、HIT、BYPASS。
MISS表示未命中
即這個(gè)頁(yè)面還沒(méi)被緩存,新發(fā)布或剛被刪除的頁(yè)面,首次訪(fǎng)問(wèn)將出現這個(gè)狀態(tài)(圖略)。
HIT表示緩存命中
打開(kāi)一個(gè)會(huì )緩存的頁(yè)面,比如文章內容html頁(yè)面,F5刷新幾次即可在F12開(kāi)發(fā)者模式當中的Header頭部信息中看到如圖緩存命中狀態(tài):
BYPASS表示緩存黑名單
即頁(yè)面路徑在Nginx規則中被設置成不緩存(set $skip_cache 1;),比如WP后臺,查看header:
②、清理效果
這個(gè)插件和緩存的搭配非常好用,不管我們是發(fā)布文章,還是有人發(fā)表評論,插件都能根據我們的設置來(lái)清理對應的緩存!比如有人發(fā)表了一個(gè)自動(dòng)審核通過(guò)的評論(或博主審核通過(guò)一條評論),插件將會(huì )自動(dòng)刪除評論相關(guān)的文章緩存,具體看下上圖張戈貼出的標注即可。
如何查看插件是否正常工作呢?很簡(jiǎn)單,勾選開(kāi)啟插件日志,然后去點(diǎn)擊更新一篇舊文章,最后打開(kāi)插件日志即可看到是否刪除記錄。
用Linux的朋友,可以直接使用tailf命令查看該日志,然后去更新文章即可看到效果,如下圖所示:

很明顯,緩存已被成功刪除,首頁(yè)看都不用看,肯定也是這個(gè)狀態(tài)了。
聯(lián)系客服