Rocket-Nginx 是 WordPress 快取外掛中 WP Rocket 的 Nginx 的配置,主要能使 Nginx 服務器能夠直接提供快取快取的文件,而無經過 WordPress 或 PHP 產生快取,它還添加標頭來緩存 CSS、JS 和圖片,以便通過減少對 Web 服務器的請求來利用瀏覽器的快取;
這個 Rocket-Nginx 快取配置文件,是由 Maxime Jobin (@maximejobin) 創建及維護,可以參考我之前「EasyEngine 上安裝 WP Rocket 快取外掛」這一篇文章。
@maximejobin
https://www.maximejobin.com/
EasyEngine 上安裝 WP Rocket 快取外掛
Webinoly 與 EasyEngine 相同性很高,但還是有一點不同,Rocket-Nginx 配置需要修改來配合 Webinoly 系統。
停用 WordPress 計畫任務
Rocket-Nginx 配置後,會直接提供快取文件而無需從 WordPress 執行任何 PHP 程序,這可能會導致您的 WordPress 計畫任務會沒有作用。
最好的方法是禁用 WordPress cron 作業,改用後端的主機來執行。
在 wp-config.php 文件裡加入禁用代碼:
define('DISABLE_WP_CRON', true);
後端主機 crontab 裡加入每 15 分鐘就執行一次 php wp-cron.php 任務:
*/15 * * * * cd /home/user/public_html; php wp-cron.php &>/dev/null
安裝 Rocket-Nginx 腳本
注意:Webinoly 的網站配置是要基本的 sudo site domain.com -wp 網站才行,如果帶有 -cache 的 Nginx FastCgi Cache 是不可以的。
在 Nginx 配置目錄中創建 rocket-nginx 文件資料夾:
cd /etc/nginx git clone https://github.com/maximejobin/rocket-nginx.git
rocket-nginx 2.0 版本之後,必須使用 rocket-nginx 腳本生成配置文件,要生成默認配置,您必須重命名已禁用的 ini 文件並運行配置生成器。
cd rocket-nginx cp rocket-nginx.ini.disabled rocket-nginx.ini php rocket-parser.php
新生成的 rocket-nginx 配置文件會在 /etc/nginx/rocket-nginx 資料夾裡,檔名為 default.conf。
將 default.conf 下載下來,用 Notepad++ 來修改,例如:HTTPS、CSS、JS、圖片快取部分要禁用,避免與 Webinoly 配置衝突,修改後的配置如下:
# Version 2.1.1 # ################################################################################################### # Add debug information into header set $rocket_debug 0; ################################################################################################### # Do not alter theses values # set $rocket_bypass 1; # Should NGINX bypass WordPress and call cache file directly ? set $rocket_encryption ""; # Is GZIP accepted by client ? set $rocket_file ""; # Filename to use set $rocket_is_bypassed "No"; # Header text added to check if the bypass worked or not. Header: X-Rocket-Nginx-Serving-Static set $rocket_reason ""; # Reason why cache file was not used. If cache file is used, what file was used set $rocket_https_prefix ""; # HTTPS prefix to use when cached files are using HTTPS set $rocket_hsts 0; # Is HSTS is off (0) by default. Will be turned on (1) if request is HTTPS ################################################################################################### # PAGE CACHE # if ($http_accept_encoding ~ gzip) { set $rocket_encryption "_gzip"; } # Is Brotli accepted by client ? if ($http_accept_encoding ~ br) { set $rocket_encryption ""; } # Is SSL request ? if ($https = "on") { set $rocket_https_prefix "-https"; set $rocket_hsts 1; } # If HSTS is disabled, unset HSTS set for Rocket-Nginx configuration if ($rocket_hsts = "0") { set $rocket_hsts_value ""; } # File/URL to return IF we must bypass WordPress # Desktop: index.html or index-https.html # Mobile: index-mobile.html or index-mobile-https.html set $rocket_end "/cache/wp-rocket/$http_host/$request_uri/index$rocket_https_prefix.html$rocket_encryption"; set $rocket_url "https://yungkeme.b-cdn.net/wp-content$rocket_end"; set $rocket_file "$document_root/wp-content$rocket_end"; set $rocket_mobile_detection "$document_root/wp-content/cache/wp-rocket/$http_host/$request_uri/.mobile-active"; # Do not bypass if it's a POST request if ($request_method = POST) { set $rocket_bypass 0; set $rocket_reason "POST request"; } # Do not bypass if arguments are found (e.g. ?page=2) if ($is_args) { set $rocket_bypass 0; set $rocket_reason "Arguments found"; } # Do not bypass if the site is in maintenance mode if (-f "$document_root/.maintenance") { set $rocket_bypass 0; set $rocket_reason "Maintenance mode"; } # Do not bypass if one of those cookie if found # wordpress_logged_in_[hash] : When a user is logged in, this cookie is created (we'd rather let WP-Rocket handle that) # wp-postpass_[hash] : When a protected post requires a password, this cookie is created. if ($http_cookie ~* "(wordpress_logged_in_|wp\-postpass_|woocommerce_items_in_cart|woocommerce_cart_hash|wptouch_switch_toogle|comment_author_|comment_author_email_)") { set $rocket_bypass 0; set $rocket_reason "Cookie"; } if (-f "$rocket_mobile_detection") { set $rocket_bypass 0; set $rocket_reason "Specific mobile cache activated"; } # Do not bypass if the cached file does not exist if (!-f "$rocket_file") { set $rocket_bypass 0; set $rocket_reason "File not cached"; } # If the bypass token is still on, let's bypass WordPress with the cached URL if ($rocket_bypass = 1) { set $rocket_is_bypassed "Yes"; set $rocket_reason "$rocket_url"; } # Clear variables if debug is not needed if ($rocket_debug = 0) { set $rocket_reason ""; set $rocket_file ""; } # If the bypass token is still on, rewrite according to the file linked to the request if ($rocket_bypass = 1) { rewrite .* "$rocket_url" last; } # Add header to HTML cached files location ~ /wp-content/cache/wp-rocket/.*html$ { etag on; add_header Vary "Accept-Encoding, Cookie"; add_header Cache-Control "no-cache, no-store, must-revalidate"; add_header X-Rocket-Nginx-Serving-Static $rocket_is_bypassed; add_header X-Rocket-Nginx-Reason $rocket_reason; add_header X-Rocket-Nginx-File $rocket_file; add_header Strict-Transport-Security "$rocket_hsts_value"; } # Do not gzip cached files that are already gzipped location ~ /wp-content/cache/wp-rocket/.*_gzip$ { etag on; gzip off; types {} default_type text/html; add_header Content-Encoding gzip; add_header Vary "Accept-Encoding, Cookie"; add_header Cache-Control "no-cache, no-store, must-revalidate"; add_header X-Rocket-Nginx-Serving-Static $rocket_is_bypassed; add_header X-Rocket-Nginx-Reason $rocket_reason; add_header X-Rocket-Nginx-File $rocket_file; add_header Strict-Transport-Security "$rocket_hsts_value"; } # Debug header (when file is not cached) add_header X-Rocket-Nginx-Serving-Static $rocket_is_bypassed; add_header X-Rocket-Nginx-Reason $rocket_reason; add_header X-Rocket-Nginx-File $rocket_file;
修改好之後,另存新檔名為 wprocket-nginx.conf,然後用 SFTP 上傳到域名資料夾下,如圖:
修改 Webinoly 原本的 domain.conf 的配置
打開 /etc/nginx/sites-available/domain.conf 文件,註釋掉 headers-http.conf 和 headers-html.conf,如下:
#include common/headers-http.conf; include common/headers-https.conf; #include common/headers-html.conf;
重啟 Nginx,讓 wprocket-nginx.conf 配置生效。
nginx -t && service nginx restart
檢查 Rocket-Nginx 狀態
正常一般的網站執行 WP Rocket 快取外掛,也會執行 PHP 程序,就如:
Nginx >> PHP-FPM >> PHP >> 靜態文件
經過 Rocket-Nginx 配置過,快取過程會是:
Nginx >> 靜態文件
也就是說,我們直接從 Nginx 提供靜態文件給客戶端,而不是在提供靜態文件之前將請求傳遞給 FPM 然後再傳遞給 PHP。
先將 wprocket-nginx.conf 打開,把 debug 打開 (0 改為 1),修改如下:
set $rocket_debug 1;
保存文件,再重啟一次 Nginx
利用 Chrome F12 查看配置是否正確繞過 PHP
x-rocket-nginx-serving-static: No 表示未繞過 PHP
x-rocket-nginx-file 表示讀取靜態文件的路徑
結語
在測試過程中,如果 WP Rocket 控制台,將「針對行動裝置建立獨立的快取檔案」這一項目打勾的話,就會無法繞過 WordPress 或 PHP 產生快取。
檢視都沒問題的話,記得將 debug 改為 0,重啟 Nginx,沒必較將快取路徑顯示出來。
Featured Photo by Nik on Unsplash