之前不懂优化,觉得wordpress已经很好用了,但是新建的网站时不时就报错“数据库连接失败”这类错误,请教了朋友说需要优化,但是自己对于优化都是一脸懵逼的,完全不懂。在经过一个多月的折腾,在大鸟博客学到了很多。
看到有很多博主的服务器放在海外,访问速度也是杠杠滴,而我自己的网站选择放在国内,感觉还没他们快。折腾了一圈,知道是需要开启缓存加速,觉得最让我收益的就是Nginx缓存,所以今天就来说一说Nginx fastcgi_cache缓存,直接使用Nginx为页面生成缓存,用户访问不用每次都去数据库读取了。效率比使用PHP缓存插件要高得多,也比较适合低配置的VPS。
一、安装Nginx ngx_cache_purge模块
基于宝塔面板来,宝塔面板很贴心的给我们编译好了这个模块,如果你不放心,可以用命令来查看一下。
#查看ngx_cache_purge是否安装,没有数据表示未安装 nginx -V 2>&1 | grep -o ngx_cache_purge
输入命令之后,会返回如下结果
我们也可以用 nginx -V
(此处是大写”V”) 来查看是否已经编译了这个模块。可以看到宝塔已经编译好了,我已经用红框标记出来了。
二、站点配置Nginx fastcgi_cache缓存
既然配置好了这个缓存模块,那么无需再编译安装了,直接拿来用即可,到指定的站点修改配置文件
比如我这里需要设置开启www.sansways.com站点的Nginx缓存
2.1 nginx fastcgi_cache缓存设置代码
#下面2行的中的chengcs_cache 和 temp路径请自行提前创建,否则可能会路径不存在而无法启动nginx,max_size请根据分区大小自行设置 #keys_zone 参数值后面又两处会用到 fastcgi_cache_path /tmp/sanswayscom_cache levels=1:2 keys_zone=sansways.com:256m inactive=1d max_size=1G; fastcgi_temp_path /tmp/sanswayscom_cache/temp; fastcgi_cache_key "$scheme$request_method$host$request_uri"; fastcgi_cache_use_stale error timeout invalid_header http_500; #忽略一切nocache申明,避免不缓存伪静态等 fastcgi_ignore_headers Cache-Control Expires Set-Cookie; #Ps:如果是多个站点,以上内容不要重复添加,否则会冲突,可以考虑将以上内容添加到nginx.conf里面,避免加了多次。 server { listen 80; listen 443 ssl http2; server_name www.sansways.com sansways.com; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/www.sansways.com; set $skip_cache 0; #post访问不缓存 if ($request_method = POST) { set $skip_cache 1; } #动态查询不缓存 if ($query_string != "") { set $skip_cache 1; } #后台等特定页面不缓存(其他需求请自行添加即可) if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|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; } #这里请参考你网站之前的配置,特别是sock的路径,弄错了就502了! location ~ [^/]\.php(/|$) { try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi-72.sock; fastcgi_index index.php; include fastcgi.conf; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; #新增的缓存规则 fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; add_header X-Cache "$upstream_cache_status From $host"; #fastcgi_cache 后面为keys_zone值 fastcgi_cache sansways.com; add_header Cache-Control max-age=0; add_header Nginx-Cache "$upstream_cache_status"; add_header Last-Modified $date_gmt; add_header X-Frame-Options SAMEORIGIN; # 只允许本站用 frame 来嵌套 add_header X-Content-Type-Options nosniff; # 禁止嗅探文件类型 add_header X-XSS-Protection "1; mode=block"; # XSS 保护 etag on; fastcgi_cache_valid 200 301 302 1d; } #缓存清理配置(可选模块,请细看下文说明) location ~ /purge(/.*) { allow 127.0.0.1; allow "服务器IP地址"; deny all; #fastcgi_cache_purge 后面为keys_zone值 fastcgi_cache_purge sansways.com "$scheme$request_method$host$1"; } ****此处省略下面部分原配置文件 ****
注意:我这里只粘贴了部分配置文件代码,主要是为了体现nginx fastcgi_cache缓存代码
关于sock,宝塔面板的在/www/server/php/72/etc/php-fpm.conf中有配置路径宝塔面板的sock,如果不清楚,可以自己打开看下,然后复制到需要修改的地方就可以了。
问题:缓存是放在本地还是内存里?
在 fastcgi_cache_path
和 fastcgi_temp_path
中,有人会建议将它设置为内存路径,例如:/dev/shm/nginx-cache levels=1:2 keys_zone=sansways.com:100m inactive=60m;
,如果你的磁盘IO很慢的话建议采用此方式,毕竟内存的读写速度非常快。
add_header Cache-Control
如果是动态内容要实时更新的话,可以设置为0,否则可以设置时间大一些。
以上参数更加自己需求定义,部分代码需要根据自己实际情况修改,比如IP地址。
三、安装Nginx Helper插件
配置好fastcgi_cache缓存之后,我们需要安装插件。
fastcgi_cache 有一个量身定做的 WordPress 缓存清理插件:Nginx Helper。这个插件不定时更新,而且更新的很频繁。安装这个插件 ,非常简单,直接进入 WordPress 后台插件安装界面搜索 Nginx Helper 关键词在线安装。
安装后,从后台【设置】==>【Nginx Helper】打开插件设置界面如下所示:
3个箭头所指,首先是 激活Purge -> 选择使用 nginx Fastcgi cache 缓存方式 -> 选择Delete local server files(删除本地缓存文件)
对于Purge Method,我们也可以选择第一个,但是一般推荐用Delete local server cache files,因为每个服务器的环境都不一样,缓存路径也会不尽相同就会导致插件无法找到缓存文件并删除!
插件还提供了其它一些设置,功能非常丰富,例如发表新文章、新评论时是否更新Nginx缓存等
#清理更新首页缓存
Purge Homepage:
when a post (or page/custom post) is modified or added. #当更新页面或者文章时,清理更新首页缓存
when a published post (or page/custom post) is trashed.#当发布页面或者文章时,清理更新首页缓存
#清理更新文章/页面/评论 页面
Purge Post/Page/Custom Post Type:
when a post/page/custom post is published.#发表文章/页面时,清理对应文章/页面缓存
when a comment is approved/published. #文章/页面 有评论发表且审核通过时,清理对应文章/页面缓存
when a comment is unapproved/deleted. #文章/页面 有评论发表且被驳回时,清理对应文章/页面缓存
如下的大家可以自己页面翻译后查看中文意思。
3.1 Purge Method清理模式选择
purge 模式: Using a GET request to PURGE/url (Default option) Uses the ngx_cache_purge module.
这个模式需要保留上文 Nginx 配置中的 purge 清理路径,清理的时候会产生一个请求。
出于安全考虑,一般 purge 都不会完全开放!只有特定的 IP 可以访问,所以,如果用了 CDN 的朋友,再使用模式一,则需要在服务器上的 /etc/hosts 中将网站域名解析为服务器真实 IP,以便插件直接请求 purge 路径,而不用走 CDN 节点,避免请求被拒绝。还是没搞懂的话就放弃这个模式吧!
文件模式: Delete local server cache files
模式二是直接清理对应的缓存文件,不需要请求 purge 这个清理路径,所以使用模式二,不需要配置上文 Nginx 的 purge 规则(我个人推荐使用这个模式)。
由于插件作者定义的缓存路径是 /var/run/nginx-cache ,而我们可能会根据服务器实际情况来自定义缓存路径,这样一来,缓存路径的不同就会导致插件无法找到缓存文件并删除!
解决办法:
很简单,在 WordPress 根目录下的 wp-config.php 中新增如下代码即可:
//根据实际情况定义缓存的存放路径 define( 'RT_WP_NGINX_HELPER_CACHE_PATH','/tmp/sanswayscom_cache');
添加后建议重载一下 php,确保变量生效(主要针对开启了 PHP 缓存的网站)。
全部保存后请分别重载PHP、Nginx配置,然后都分别重启。
四、效果预览
可以看到缓存已经命中。
对于已经设置了不缓存的页面,Nginx fastcgi_cache会直接显示BYPASS,如果是登录状态那是不显示缓存的。请不要担心。
我们可以到缓存目录去看下是否已经生成了缓存文件
如果你发现你的评论过的用户依然用的是缓存,那应该是WP没有记住cookie,把以下代码加入到 functions.php
中即可。
add_action('set_comment_cookies','coffin_set_cookies',10,3); function coffin_set_cookies( $comment, $user, $cookies_consent){ $cookies_consent = true; wp_set_comment_cookies($comment, $user, $cookies_consent); }
设置开启了nginx缓存后,如果命中网站访问速度一下子就飞快了!而且也节约了服务器资源。
五、细节调整
启用fastcgi_cache缓存时,发现在Nginx配置文件中添加了Cache-Control信息,但是总是不生效。HTTP头部信息会总会包含以下信息:
Cache-Control: no-store,no-cache,must-revalidate,post-check=0,pre-check=0 和 Pragma: no-cache,
经过排查,问题出在了宝塔面板中的 session.cache_limiter
的PHP.ini设置部分, 默认值是 nocache
,我们需要将它设置为 none
即可。
X-Powered-By
我们用宝塔面板会默认的出现X-Powered-By 7.2.12 出现php的版本信息,从安全角度来说还是很不友好的。X-Powered-By是网站响应头信息其中的一个,出于安全的考虑,一般会修改或删除掉这个信息。
宝塔面板里我们如何修改呢:PHP.ini设置 expose_php = off
设置好之后,我们重载PHP服务,然后再重启PHP。
到这里,nginx fastcgi cache缓存就全部折腾完毕了。如果服务器上放了多个站点,可以参考:同一服务器多站点设置nginx fastcgi_cache缓存。
[…] BT(宝塔面板)-WordPress开启Nginx fastcgi_cache缓存加速。 […]