当你成功部署好属于自己的WordPress,使用了一个好看的主题后,就需要考虑如何优化他了,本文会从两个方面,分别是安全和性能,来讲解。

性能优化

我们先来看到性能方面,因为一个好的博客,是有可能会有很多访客同时进行访问的,这个时候,你的服务器的压力会变大,因为它的性能不足以同时处理这么多进程,相比于提升服务器配置带来的高昂费用,在其他方面进行优化是更好的选择。

Opcache

我们知道,WordPress是用php语言编写的,php是一种解释型语言,每一次执行都要经过解释器翻译成字节码,而我们的代码一般在写好后是不会进行修改的,所以opcache的原理就是将解释后的程序缓存到内存中,下次直接从内存中读取,这样速度就会快很多了。

这里给一个对比,主要看耗时和内存占用,可以看到效果是非常明显的

未启用opcache

启用opcache

开启的方法也很简单,这里以宝塔面板为例,首先来到软件商店->对应的php版本,然后点击打开

之后点击opcache后面的安装,等待安装完成后重启php服务即可

Redis

redis是NoSQL,在这里我们用它来作为mysql的辅助,因为每一个用户访问都涉及到大量的sql操作,使用redis后,将一些操作缓存到内存中,大大减少sql查询速度慢的问题,安装方式也很简单,我们同样打开宝塔面板,来到软件商店->php->安装扩展,找到redis安装,安装后和上面一样重启php服务

之后我们来到WordPress的后台,找到插件->安装插件->搜索redis,安装如下插件

之后不需要额外操作,来到插件设置界面,点击启动后显示如下界面说明redis正常工作

CDN

我们的服务器带宽是有限的,如果文件都放在本地服务器,由于带宽的限制,你做的所有努力都是徒劳,应为网络的出口只有那么大,这个时候CDN的作用就体现了出来,使用了CDN之后,你的网站实际上储存在了多个地方,用户访问你的网站时,就不需要从你的服务器上获取资源,而是可以从CDN服务器上获取,这样就大大减少了本地服务器的网络带宽,CDN服务商有很多,一般的云服务器厂商也会提供CDN服务,这里我以腾讯云为例。

腾讯云CDN

登陆后,新用户会送一个六个月的流量包,到期后也可以自行购买,我们点击域名管理->添加域名

加速域名填写你网站的域名,加速类型选择CDN网络小文件,打开IPv6访问,源站配置选择自有源,回源协议选择HTTPS,源站地址填写服务器公网IP地址,回源HOST也填写域名,之后点击确认添加。

添加成功后,选择缓存配置才是关键,来到域名管理,点击刚刚添加的域名,选择缓存配置,参照如下的缓存配置添加

需要注意的是,如果你在开启cdn后发现,在文章的评论中,会出现填写过的用户名,这是因为cdn将填写过的页面错误的缓存了,出现这种情况的一种原因是使用了wordpress原生的评论功能,一般在启用主题后评论功能由js引入,所以不会发生这样的问题,如果出现了评论错误缓存的情况,请将.html后缀的文件设置为不缓存。

之后来到https设置界面,参照如下配置

也可以更具自己的需要开启防盗链或者IP访问频次限制,如果要开启的话,建议将访问频次限制设置为大于40QPS

独立数据库

腾讯云数据库

数据库都位于wordpress的本地服务器上,如果你想要更佳的性能,可以单独购买数据库服务,让wordpress服务器只用处理php,而不用花费额外的资源去处理sql语句,如果你需要独立的数据库服务,建议在你的云主机提供商处购买,因为为了防止网络延迟带来的性能下降,所以将服务器和数据库放在一个内网中是最佳的选择,这里可以看到我的服务器连接到数据库的延迟,几乎可以忽略

不同厂商数据库的配置流程不同,在备份好本地数据库后,将本地数据库导入到云数据库,之后修改位于网站根目录下的wp-config.php文件,将云数据库的用户名,数据库名,密码,以及地址填入即可

同样,对于上文提到的redis,也可以使用独立数据库,在wp-config.php中添加如下代码即可

/** Redis连接的IP与端口 */
define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
/** Redis连接密码,如果Redis设置了密码,请将前面的“//”删除,并用密码替换secret */
// define( 'WP_REDIS_PASSWORD', 'secret' );
/** 失败前尝试初始连接到Redis服务器的时间(单位为秒) */
define( 'WP_REDIS_TIMEOUT', 5 );
/** 失败前尝试从Redis服务器读取的时间 */
define( 'WP_REDIS_READ_TIMEOUT', 5 );
// 更改每个站点的数据库以避免缓存冲突 */
define( 'WP_REDIS_DATABASE', 0 );
// 支持的客户端: `phpredis`, `credis`, `predis` and `hhvm`
// define( 'WP_REDIS_CLIENT', 'phpredis' );
// 7天后自动删除缓存密钥
// define( 'WP_REDIS_MAXTTL', 60 * 60 * 24 * 7 );
// 绕过对象缓存,这对调试很有用
// define( 'WP_REDIS_DISABLED', true );
// 设置所有缓存键的前缀,如果在同一服务器中有多个WordPress站点,可以设置不同前缀避免冲突
// define( 'WP_REDIS_PREFIX, 'WP' );

安全

wordpress的安全问题也非常值得重视,wordpress本身并没有非常严重的漏洞,但是安装的插件可能会导致站点的安全性下降,而wordpress本身也有一些不合理的地方,我们登录后台的用户名应该是被隐藏的,但其他人可以构造如下url来得到你的用户名,你也可以用自己的站点测试一下

https://你的域名/wp-json/wp/v2/users/

或者是这个

https://你的域名//wp-includes/wlwmanifest.xml

如果你的云主机提供了类似url访问限制的功能,请将这两个地址加入黑名单,如果没有类似功能,也可以通过伪静态来保护,在nginx伪静态中添加如下代码

location ~ ^/wp-json/wp/v2/users {
      deny all;
    }
location ~ ^/wp-includes/wlwmanifest.xml {
      deny all;
    }