Nginx FastCGI_Cache 加速 WordPress

因有在使用 WordPress 服務想說拿來測試一下看看是否能讓網站能夠加速連線

環境是使用 Nginx 這個服務來架設的,首先要有 ngx_cache_purge 這個模組來搭配使用,那這個模組需要先用編輯的方式才能運行。

 

下載 ngx_cache_purge 模組


官方下載 :ngx_cache_purge

wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz

解壓
tar -zxvf ngx_cache_purge-2.3.tar.gz
刪除壓縮檔
rm ngx_cache_purge-2.3.tar.gz
修改資料夾
mv ngx_cache_purge-2.3/ ngx_cache_purge/

編譯 nginx 加 ngx_cache_purge 模組


可以參考本網頁的 Nginx 是如何編譯的

auto/configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=../nginx-ct/ --with-openssl=../openssl/ --with-openssl-opt=enable-tls1_3 --add-module=../ngx-pagespeed/ --add-module=../ngx_brotli/ --add-module=../ngx_cache_purge/

編譯完成之後開始設定 nginx 設定檔

nginx 設定檔


建立兩個目前來放存暫存檔用

mkdir /var/cache/nginx/wpcache
mkdir /var/cache/nginx/wpcache/temp
chown -R nginx:nginx /var/cache/nginx/wpcache

nginx 全域設定

#表頭檢測 FastCGI_Cache 是否有正常運行
    add_header rt-Fastcgi-Cache "$upstream_cache_status From $host";

    fastcgi_cache_path /var/cache/nginx/wpcache levels=1:2 keys_zone=GTWANG_CACHE:250m inactive=1d max_size=600m;
    fastcgi_temp_path  /var/cache/nginx/wpcache/temp;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_use_stale error timeout invalid_header http_500;
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

服務設定

# html 檔
#
set $skip_cache 0;

  # POST 請求不用快取
  if ($request_method = POST) {
      set $skip_cache 1;
  }

  # 若有 query 參數的網址不用快取
  if ($query_string != "") {
      set $skip_cache 1;
  }

  # 特殊的網址不用快取
  if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.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;
  }

  # 加入快取資訊表頭(除錯用)
  add_header X-Cache $upstream_cache_status;
#
    location / {
# 使用「瀏覽器」瀏覽根目錄時,未指定檔名時預設使用的檔案
        index index.php index.html index.htm;
        autoindex off;
        try_files $uri $uri/ /index.php?$args;
    }

 location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        try_files $uri =404;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_intercept_errors on;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
#
        fastcgi_cache GTWANG_CACHE;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        fastcgi_cache_valid 200 301 302 1d;

    }

   location ~* \.(?:ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        #
        fastcgi_cache GTWANG_CACHE;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        fastcgi_cache_valid 200 301 302 1d;
        #
        expires 30d;
        log_not_found off;
    }

 

下載 WordPress 套件 Nginx Helper

 

Nginx Proxy 設定


全域設定

	add_header cache-status $upstream_cache_status;    

	proxy_buffering on;
    proxy_buffer_size 16k; 
    proxy_buffers 4 64K;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 512k;
    proxy_connect_timeout 75s;
    proxy_read_timeout 75s;
    proxy_send_timeout 75s;
#想要開啟 nginx 的緩存功能,需要添加此處兩行內容!
#設定 Web 緩存區名稱為 my-cache ,快取緩存空間為 500M ,緩存的資訊超過1天沒有被訪問就自動清除,訪問的緩存資訊,硬碟緩存空間大小為 50G
    proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=my-cache:500m loader_threshold=300 loader_files=200 inactive=1d max_size=10g;
    proxy_temp_path /var/cache/nginx/nginx_temp;

Nginx 針對響應緩存有兩個處理動作

  • 緩存管理器會定時檢查緩存的狀態。如果緩存的內容大小達到指令 proxy_cache_path 的參數 max-size 指定的值,則緩存管理器會根據 LRU 算法刪除緩存的內容。在檢查的間隔時間內,總的緩存內容大小可以臨時超過設定的大小閾值。
  • 緩存載入只在 Nginx 啟動的時候執行一次,將緩存內容的原信息載入到指定的分享快取區內。一次將所有的緩存內容載入到快取中會耗費大量的資源,並且會影響 Nginx 啟動後幾分鍾內的效能。為了避免這種問題可以通過在指令 proxy_cache_path 後添加下面參數:

loader_threshold – 緩存載入緩存內容的最大執行時間(單位是毫性,默認值是200毫性)。

loader_files – 在緩存載入緩存內容的執行時間間隔內,最多能載入多少個緩存條目,默認100。

loader_sleeps – 每次執行的時間間隔,單位是毫秒(默認50毫秒)

服務設定

location / {
        proxy_pass https://IP;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
        proxy_set_header Host $host;
        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
        proxy_pass_header Authorization;
#
        proxy_cache my-cache;
        proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
        proxy_cache_bypass $http_pragma $http_authorization;
        proxy_cache_methods GET HEAD POST;
        proxy_cache_use_stale error  timeout  invalid_header  updating  http_500  http_502  http_503  http_504  http_403  http_404;
        proxy_cache_revalidate on;
        proxy_cache_lock on;
        proxy_cache_lock_age 5s;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 301      1h;
        proxy_cache_valid 404      1m;
        proxy_cache_valid any      10m;
        proxy_cache_background_update on;
        proxy_cache_key $host$uri$is_args$args;
    }

location ~* \.(?:ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        proxy_pass https://ip;
        proxy_cache my-cache;
        proxy_cache_valid 200 10d;
        proxy_cache_valid 304 1d;
        proxy_cache_valid 301 302 1d;
        proxy_cache_valid any 10d;
        proxy_cache_key $host$uri$is_args$args;
        expires 30d;
    }

    location ~ /purge(/.*) {
        allow all;
#指定可以清除缓存的ip,all允许所有ip清除
        proxy_cache_purge my-cache $host$1$is_args$args;
    }

 

 

 

 

 

參考相關網頁: