轉載請註明文章出處:tlanyan.me/nginx-confi…php
在嘗試Ghost中提到過託管博客的VPS因爲內存不足致使服務宕機。今天意識到能夠經過Nginx緩存避免請求落到PHP和MySQL端,提高總體性能。此外博客發佈後不多改動,讀多寫少,是使用緩存(或靜態化)的好場景。html
Nginx提供了基於代理(proxy)和基於fastcgi的兩種緩存方式,二者指令集十分類似,使用上差異不大。因爲本站博客採用Nginx+PHP-FPM架構,故而使用基於fastcgi的緩存,即fastcgi cache。nginx
fastcgi cache的機制是將後端CGI服務返回的頁面緩存起來,後續請求到來時直接返回頁面,省去與後端服務通訊及生成頁面的消耗。fastcgi cache與squid、varnish、CDN等原理相似,因爲減小了後端請求,原則上性能會比WordPress的各類緩存插件高出許多。後端
fastcgi cache隸屬於fastcgi模塊,而fastcgi模塊又歸屬於http模塊,因此與緩存相關的配置應當都出如今這兩個及下屬配置塊中(主要是http, server和location)。緩存
根據官方文檔,博客站點採用的緩存配置以下:cookie
http {
...
fastcgi_connect_timeout 30s;
# 全局設置, fastcgi_cache_path只能出如今http配置塊中
# fastcgi_cache_path設置全局的緩存路徑、文件大小等,可屢次出現設置不一樣的緩存池
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:10m inactive=10m max_size=500m;
fastcgi_cache_key $scheme$request_method$host$request_uri;
# 設置使用過時緩存的情形:後端錯誤、超時等
fastcgi_cache_use_stale error timeout invalid_header http_500 http_503;
...
server {
...
# 緩存策略指示變量
set $skip_cache 0;
# 緩存策略
if ($query_string != "") {
set $skip_cache 1;
}
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|sitemap(_index)?.xml") {
set $skip_cache 1;
}
# 登陸用戶或發表評論者
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
location ~ \.php$ {
...
# 使用的keyzone,這裏使用http中定義的WORDPRESS
fastcgi_cache WORDPRESS;
# 是否跳過緩存
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
# 後端返回成功的狀況下緩存10分鐘
fastcgi_cache_valid 200 10m;
# 添加header字段,指示緩存命中狀態(調試使用)
add_header X-Cache $upstream_cache_status;
}
}
}
複製代碼
上述配置作了如下工做:架構
重啓Nginx,而後訪問頁面,查看頁面的header狀態和響應時間。能夠看到,請求一次事後(次數可經過fastcgi_cache_min_uses
設置),後續請求都從緩存請求(X-Cache值爲HIT),速度提高很是明顯。對於管理後臺頁面,x-cache
的值爲BYPASS
,正是咱們須要的。wordpress
開源版的Nginx不能自動清除緩存,當文章變更或者有新評論時不能當即更新頁面。要達到此目的,可以使用商業版Nginx或者經過開源插件解決,詳情查看此文。post