Nginx配置fastcgi cache

轉載請註明文章出處: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;
    }
  }
}
複製代碼

上述配置作了如下工做:架構

  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,正是咱們須要的。wordpress

其餘

開源版的Nginx不能自動清除緩存,當文章變更或者有新評論時不能當即更新頁面。要達到此目的,可以使用商業版Nginx或者經過開源插件解決,詳情查看此文post

參考

  1. nginx.org/en/docs/htt…
  2. www.mf8.biz/wordpress-f…
相關文章
相關標籤/搜索