本篇文章实现WordPress全站纯静态,实现全部为html/cs/jss/图片文件、无php文件、无数据库、无wpadmin后台,可将生成的网站存放于静态网页托管,适合企业网站等需求。缺点是由于没有数据库和php交互,评论、搜索功能无法使用。另外也介绍了静态化搭配CDN的配置方法。
为什么要开启WordPress静态
使用静态主要目的有两个。
一个是为了减缓服务器压力。当访客请求网页浏览时,静态资源(HTML/JS/CSS/图片)不需要服务器运算,直接将静态资源原样发给访客即可。而动态资源(PHP/数据库内容)需要服务器经过运算解析后把生成的结果发给访客。很明显动态资源相比静态资源要耗费更多的服务器资源。不需要专业的测试工具,打开WordPress伪静态文章一定比纯静态文章要耗费更多的时间。
另一个是为了提高SEO效果。搜索引擎会对静态html结尾的URL优先索引。
WordPress现有的几种静态解决方案
目前基本上有三种静态解决方案。分别为伪静态、缓存静态、全站纯静态。本文详细介绍全站纯静态。其他两种静态方法较简单,网上有大篇文章介绍。
伪静态
利用WEB软件(IIS/APACHE/NAINX等)的url rewrite功能实现WordPress伪静态。
对于访客来说,访问类似https://wkings.blog/archives/1096或者https://wkings.blog/1096.html这种网址,在服务器WEB软件里通过url rewrite功能把链接转化实际地址。
访客看似访问的网页是静态资源,实际上对于WEB服务器来说仍然是动态资源,因此对减缓服务器压力没有任何效果,只有SEO效果。
设置方法很简单,在WordPress后台-设置-固定链接里,选择你想要的URL格式,再到WEB软件里添加对应的rewrite规则即可(规则网上搜索一下就有,宝塔面板自带)。
缓存静态
缓存静态是安装WordPress的WP Super Cache插件,实现自动生成html静态资源,达到提高网站速度减少服务器压力的效果。
缓存静态的原理是当访客请求一个文章时,WP缓存静态插件会先判断这个文章是否有已经生成的html网页,如果有,则直接读取已生成的html网页给访客;如果没有,则先将文章生成html网页再发送给访客,之后其他的访客就可使用生成的html网页。当已生成html网页时,跳过了解析php和读取数据库步骤,可大幅提高网站速度和减缓服务器压力。
缓存静态的缺点是整套WordPress系统仍然运行于服务器,由于WordPress漏洞或设置不安全,仍然会有被黑客入侵的危险。
设置方法也很简单,安装WP Super Cache插件,开启插件的“启用缓存”和“预缓存”功能即可。详细配置可参考官方文档和网上文章。“启用缓存”功能是插件只生成被访问的html网页,并在设定时间后删除缓存的html文件。“预缓存”功能是定时自动生成全部html网页。
全站纯静态
全站纯静态通过WP插件生成WordPress全站静态资源,再配合资源优化插件以及CDN,就可以把全站静态资源放到云计算的对象存储、CDN源站、免费静态网页托管等web服务商,实现数量级的提升网站速度,并拥有无懈可击的安全性。
甚至可以在本地搭建一个WordPress平台,设计好主题、写好文章后,将生成的静态资源上传到对象存储和CDN来搭建网站。访客访问时感觉不到这不是一个真实存在于WEB服务器的WordPress。
需要的WordPress插件
Simply Static插件(https://cn.wordpress.org/plugins/simply-static),用于生成全站静态化。
Autoptimize插件(https://cn.wordpress.org/plugins/autoptimize),用于整合优化资源文件。
Simply Static插件
这个插件用于生成全站静态化。在本地搭建WordPress平台,安装好插件,设置页面主要如下图
Local Directory选项
这个选项设置静态资源生成保存目录。我这里设置的是D:/soft/xampp/htdocs/public/
。网站根目录是D:/soft/xampp/htdocs
。
Destination URLs选项
Use absolute URLs是使用绝对URL路径。不建议选这个,由于本地环境和云端的URL不一样,不好调试。
Use relative URLs是使用相对URL路径。如果设置为/abc/,假设域名是www.abc.com,则URL是www.abc.com/abc/;设置为/
,则URL是www.abc.com/。建议设置为/
,配合Local Directory选项,可实现生成的文件生成到public目录,而public目录就是生成的网站根目录。将public目录内的文件上传到云存储根目录,即可实现全站静态化。
Save for offline use是转化为离线路径。用于web服务器的网站转化为本地环境使用。
Delivery Method选项
这个选项让你选择生成的是文件目录还是压缩包。
Autoptimize插件
Autoptimize插件也可在缓存静态方案中使用,效果一样。
Autoptimize插件用来合并压缩js/css文件、压缩html文件。
如果不优化,访客打开一篇WordPress文章时,会请求很多个js/css文件,而每个请求都需要单独建立http(s)连接,消耗服务器资源。如果压缩为一个js和css文件,则只需要请求一次,可减轻服务器压力。压缩html文件可以减少传输的html流量,对于CDN来说流量就是成本。
这是优化前和优化后的截图
Autoptimize插件打钩开启以下设置
- JavaScript 选项
- 启用 JavaScript 优化
- 合并JS文件
- CSS选项
- 启用 CSS 优化
- 合并CSS文件
- 合并内联 CSS
- HTML 选项
- 优化 HTML 代码吗?
- Also minify inline JS/ CSS?
其他设置可以不勾选,或按你需要自己勾选。
WordPress静态化和CDN的设置方法
目前国内云厂商提供的CDN服务,CDN源站都可以设置为第三方域名或者该厂商的对象存储。并且由于监管要求,不能用CDN自带的默认域名,需要有一个备案的域名供CDN访问。
第三方域名一般用于伪静态和缓存静态方案的WordPress,以及不备案但也想用国内CDN厂商的海外网站。
对于海外网站,比如网站的域名是www.abc.com,CDN的域名是www.cdn.com(cdn.com已备案),则可以实现访问www.abc.com时,所有www.abc.com的静态资源全部由www.cdn.com提供。
对于海外CDN云厂商,CloudFlare的话,只要把域名的NS服务器指向CloudFlare的NS服务器,再去CloudFlare网站注册一下,就可全自动开启CDN功能。但是国内网络是打不开CloudFlare CDN网络的。
伪静态和缓存静态的CDN
由于这两种静态方案的WordPress实际上还是运行于web服务器,因此可以CDN的静态资源(js/css/jpg)是随时更新的,只能用CDN源站的第三方域名方案。
CDN设置
需要一个备案好的域名供CDN使用。比如我的CDN域名是cdn.blog.wkings.net,网站域名是wkings.blog。
将源站类型设置为域名,源站地址设置为网站域名。
还要在HTTP 响应头的设置里,添加一个响应头。这个设置解决跨域名访问时的请求权限问题。
1 2 | 响应头:Access-Control-Allow-Origin 内容:* |
WP Super Cache插件设置
WP Super Cache插件选项-CDN里,打钩开启CDN支持,站点地址是网站域名,Off-site URL是CDN域名,包括目录是包含静态资源的目录。剩余默认即可。
这样设置以后,在WP Super Cache插件选项-内容里,点删除缓存,再到网站前台看一下,所有静态资源的URL就变成CDN的URL了,实现了自动CDN。
全站纯静态的CDN
全站纯静态方案的WordPress和发布网站一般不在同一个web服务器上,比如我的使用情景是WordPress在本地搭建,将网站发布到海外web服务器,同时将媒体目录(图片/附件)上传到对象存储以便CDN回源。
因此发布网站的流程是:WordPress里用Simply Static插件生成静态网站→静态网站上传到云厂商对象存储或静态网页托管。
CDN设置
需要一个对象存储和备案好的域名供CDN使用。比如我的CDN域名是cdn.blog.wkings.net,网站域名是wkings.blog。
对象存储存放上传的静态网站,CDN回源到对象存储。
upload_url_path设置
打开WordPress后台隐藏设置页你的域名/wp-admin/options.php
,搜索upload_url_path
,填入CDN域名的WordPress上传附件路径。比如我的CDN域名是cdn.blog.wkings.net,上传的附件目录是wp-content/uploads,那么这么就填https://cdn.blog.wkings.net/wp-content/uploads。
Simply Static插件设置
这个插件没有CDN选项需要设置。
Autoptimize插件设置
Autoptimize 设置-JS, CSS 和 HTML-CDN选项,填入CDN域名,比如https://cdn.blog.wkings.net
自动化
每次生成静态网站后,都需要手动上传到web服务器和对象存储,显然太麻烦,我写了一个批处理实现自动上传。
我web服务器使用rsync软件进行同步,云存储和CDN使用七牛云,本地使用xampp软件搭建环境,htdocs文件夹是web目录。如果你用其他同步软件和云,需要相应修改。
一共三个文件,放到htdocs文件夹的上一层目录。
- _rsync_htdocs.bat(自动同步批处理)
- _qiniu_config.txt(七牛云配置文件,使用前需要先配置好七牛云的帐号)
- _rsync_password.txt(rsync保存密码文件)
1 2 3 4 5 6 7 8 9 10 11 12 13 | @REM 复制favicon.ico图标 copy .\htdocs\favicon.ico .\htdocs\public\ /y @REM 复制媒体目录 xcopy /S /Q /Y .\htdocs\wp-content\uploads\ .\htdocs\public\wp-content\uploads\ @REM 同步到web服务器 E:\网络\cwrsync\bin\rsync.exe -avzh --del --password-file=_rsync_password.txt ./htdocs/public/ root@123.123.123.123::root @REM 上传到七牛对象存储 qshell qupload -c 10 _qiniu_config.txt pause |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | { "src_dir" : ".\\htdocs\\public", "bucket" : "这个是对象存储的容器名字", "ignore_dir" : false, "overwrite" : true, "check_exists" : false, "check_hash" : false, "check_size" : false, "rescan_local" : true, "log_level" : "info", "log_rotate" : 1, "log_stdout" : false, "file_type" : 0, "resumable_api_v2" : false, "resumable_api_v2_part_size" : 4194304 } |
1 | 123456abcdefg |
文章评论
请教个问题。全静态了以后,是不是就表示那些表单提交啊、评论啊啥的都不能用了?
@黑黑胖哥哥 是的,不能用了。不过第三方评论系统只是插入一段js代码就可以使用(理论上可以,我没实验)。表单我不知道你网站有什么表单,对WordPress前台来说,应该是只有搜索表单?你也可以使用百度、谷歌的站内搜索来间接实现。所以你可以用这个方案:纯静态WordPress+第三方评论系统+搜索引擎站内搜索
谢谢回复。
评论我可以考虑关掉。
表单是指我会用wpform做一些比如活动报名表啊之类的让用户填写。这个不能用的话可能有点麻烦。。。
@黑黑胖哥哥 我猜你考虑全静态的话,那应该没有前台会员系统?那么表单也可以使用第三方表单系统(比如我用过腾讯问卷挺不错https://wj.qq.com/)。如果你有会员系统,或者表单系统不能分离的话,那就没法全静态了,可以考虑用缓存静态方案,效果也挺不错的。比如我博客就是缓存静态,动态资源在VPS,静态资源在CDN。