Nginx 配置 fastcgi cache
在嘗試 Ghost (https://tlanyan.me/ghost-experience/)中提到過託管部落格的 VPS 由於記憶體不足導致服務當機。今天意識到可以通過 Nginx 快取避免請求落到 PHP 和 MySQL 端,提升整體效能。此外部落格釋出後很少改動,讀多寫少,是使用快取(或靜態化)的好場景。
快取機制
Nginx 提供了基於代理 (proxy) 和基於 fastcgi 的兩種快取方式,兩者指令集十分相似,使用上差別不大。由於本站部落格採用 Nginx+PHP-FPM 架構,故而使用基於 fastcgi 的快取,即 fastcgi cache。
配置
fastcgi cache 的機制是將後端 CGI 服務返回的頁面快取起來,後續請求到來時直接返回頁面,省去與後端服務通訊及生成頁面的消耗。fastcgi cache 與squid、varnish、CDN 等原理類似,由於減少了後端請求,原則上效能會比WordPress 的各種快取外掛高出許多。
fastcgi cache 隸屬於 fastcgi 模組,而 fastcgi 模組又歸屬於 http 模組,所以與快取相關的配置應當都出現在這兩個及下屬配置塊中(主要是 http, server 和 location)。
根據官方文件,部落格站點採用的快取配置如下:
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;
}
}
}
上述配置做了以下工作:
設定快取池資訊 (fastcgi_cache_path);
設定快取 key(fastcgi_cache_key);
過期檔案處理 (fastcgi_cache_use_stale)
快取策略(fastcgi_cache_bypass/fastcgi_no_cache)
後端請求成功時快取時間(fastcgi_cache_valid)
增加了除錯資訊頭 (add_header)
重啟 Nginx,然後訪問頁面,檢視頁面的 header 狀態和響應時間。可以看到,請求一次過後(次數可通過 fastcgi_cache_min_uses 設定),後續請求都從快取請求(X-Cache 值為 HIT),速度提升非常明顯。對於管理後臺頁面,x-cache 的值為 BYPASS,正是我們需要的。
其他
開源版的 Nginx 不能自動清除快取,當文章變動或者有新評論時不能立即更新頁面。要達到此目的,可使用商業版 Nginx 或者通過開源外掛解決,詳情檢視此文(https://www.mf8.biz/wordpress-fastcgi-cache/)。
參考
公告通知
第20期 Python零基礎入門班
51Reboot 第20期 Python 零基礎運維自動化【入門班】正在火熱招生中
相關文章
- Nginx配置fastcgi cacheNginxAST
- Nginx模組fastcgi_cache的幾個注意點NginxAST
- Linux上配置Nginx+PHP5(FastCGI)LinuxNginxPHPAST
- nginx結合fastcgiNginxAST
- fastcgi配置AST
- nginx proxy cache的配置實現Nginx
- 實戰Nginx與PHP(FastCGI)的安裝、配置與最佳化NginxPHPAST
- Nginx、fastCGI、php-fpm關係梳理NginxASTPHP
- Nginx的ngx_http_fastcgi_module模組NginxHTTPAST
- 檢視nginx傳輸FASTCGI格式資料NginxAST
- 方案一、Nginx+mono+ fastcgi-mono-serverNginxMonoASTServer
- FastCGI 程式管理器(FPM)-配置AST
- PHP-FPM,Nginx,FastCGI 之間的關係PHPNginxAST
- nginx+fastcgi搭建高負載伺服器NginxAST負載伺服器
- Windows下Nginx+Web.py+FastCGI服務搭建WindowsNginxWebAST
- nginx fastcgi 超時問題解決記錄NginxAST
- Ubuntu下的apache2 + fastcgi配置UbuntuApacheAST
- php5.3 fastcgi方式 安裝以及和nginx整合PHPASTNginx
- 解釋nginx.conf.default 中關於fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;NginxAST
- Nginx和fastcgi分離的實現以及注意問題NginxAST
- nginx FastCGI錯誤Primary script unknown解決辦法NginxAST
- Apache+Fastcgi模組+APC經典配置薦ApacheAST
- nginx proxy cache的實現原理Nginx
- 記錄一個 Nginx-FastCGI-"Primary script unknown" 錯誤NginxAST
- 配置nginxNginx
- Nginx 配置Nginx
- nginx配置Nginx
- Nginx之(三)Nginx配置Nginx
- Nginx系列教程:ngx_cache_purge模組Nginx
- 如何解決 Nginx 與 FastCGI 通訊錯誤 "Primary script unknown"?NginxAST
- nginx之 nginx限流配置Nginx
- Nginx篇--解讀nginx配置Nginx
- nginx之proxy、cache、upstream模組學習Nginx
- Docker配置nginxDockerNginx
- nginx常用配置Nginx
- nginx代理配置Nginx
- Nginx Location 配置Nginx
- NGINX基本配置Nginx