Nginx配置fastcgi cache

tlanyan發表於2019-01-19

轉載請註明文章出處:https://tlanyan.me/nginx-conf…

嘗試Ghost中提到過託管部落格的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;
    }
  }
}

上述配置做了以下工作:

  1. 設定快取池資訊(fastcgi_cache_path);
  2. 設定快取key(fastcgi_cache_key);
  3. 過期檔案處理(fastcgi_cache_use_stale)
  4. 快取策略(fastcgi_cache_bypass/fastcgi_no_cache)
  5. 後端請求成功時快取時間(fastcgi_cache_valid)
  6. 增加了除錯資訊頭(add_header)

重啟Nginx,然後訪問頁面,檢視頁面的header狀態和響應時間。可以看到,請求一次過後(次數可通過fastcgi_cache_min_uses設定),後續請求都從快取請求(X-Cache值為HIT),速度提升非常明顯。對於管理後臺頁面,x-cache的值為BYPASS,正是我們需要的。

其他

開源版的Nginx不能自動清除快取,當文章變動或者有新評論時不能立即更新頁面。要達到此目的,可使用商業版Nginx或者通過開源外掛解決,詳情檢視此文

參考

  1. http://nginx.org/en/docs/http…
  2. https://www.mf8.biz/wordpress…

相關文章