听闻Serverless很久了,前几天还用它玩过下Hexo《语雀文章用Serverless自动部署到Hexo博客》。

因此也早有想法把WordPress和Typecho这样的博客程序运行在serverless上。而这一次的搭建都是来源于https://github.com/awesome-fc/fc-wordpress提供的教程和安装包。

昨夜摸索了三个小时终于得以成功,现在简单介绍下自己的配置过程。

根据前面提到的教程安装好nodejsfuncraf两工具,然后下载它的fc-wordpress,也可以网页下载好后解压到某个目录。

funcraf我是用的二进制文件,下载好后是一个exe文件,在系统环境变量中指定这个文件名所在的具体位置即可,比如我的是 D:\fc\fun.exe ,然后把下载好的文件也放入此处,这时候文件和文件夹结构如下:

  • fc-web-mysql文件夹
  • fc-web-sqlite文件夹
  • png文件夹可以没有
  • fun.exe
  • .gitignore
  • README.md

配置阿里云

第一步,开通阿里的函数计算,我都忘记我什么时候开通了。需要注意下地区,我的目前是上海区,这个区域是要写到.env配置中的。

第二步,开通文件存储,选择按量付费即可。

关于备案问题,如果你的域名在阿里云有备案,则无用担心此问题。如果在腾讯云备案,但没有在阿里云接入备案,具体咨询阿里云客服了解。我目前(2020年8月)咨询的结果是,不但要在阿里云接入备案,而且函数计算还不能申请备案服务号,得购买ESC产品(或者能取得备案服务号的产品)才可以。什么是备案服务号,可以参见《个人网站ICP备案常见问题》。

如果没有备案想体验的话,那就不要选择大陆区域,或者用阿里云系统提供的域名。

目前(2020年8月)腾讯云也要接入备案的,但腾讯云提供函数计算的备案服务号,折算下来需要110元人民币这样,而这些购买的资源有效时常为5年。

Serverless 备案要求:备案本身不收取任何费用,但通过 Serverless 方式备案需购买云函数5000万次调用次数包与40万GBs资源用量包

关于百度云和华为云,肯定也是要接入备案了,我没去了解。因为这是工信部的规定,而不是云服务商能决定的,差别主要在于备案服务号如何取得的问题。

配置.env文件

我采用Mysql数据库,所以我进入到fc-web-mysql文件夹中的.env去配置它。复制一份.env_example 改名为 .env ,如果Windows上无法直接这样改名,可通过7z压缩后修改文件名再解压。

记事本打开它,配置有如下

DEFAULT_REGION=云函数所在区域cn-shanghai,我这里是上海
ACCOUNT_ID=阿里云账户ID
ENDPOINT=云函数的地址https://阿里云账户ID.cn-shanghai.fc.aliyuncs.com
ACCESS_KEY_ID=云函数的ACCESS_KEY_ID
ACCESS_KEY_SECRET=云函数的ACCESS_KEY_SECRET

函数计算

这些需要填写的都在函数计算的页面可查看到,其中自定义的域名用CANME解析到图中的 公网 Endpoint: ,比如我用打算用fc.tangruiping.com来做网站,现在就把此域名CANME解析到图中的 公网 Endpoint: 即可。

配置index.php

主要修改此处 $host = "fc.tangruiping.com";

配置template.yml

主要修改三个地方,第一个是LogConfig:下的Project:,这一个你要重新命名,要跟别人都不同,具体看下图。
配置template.yml

最后一处就是DomainNameindex.php修改的域名一样,都为fc.tangruiping.com

部署

如此配置好这三项,如需添加Typecho或着WordPress的主题,可在\fc-web-mysql\.fun\nas\auto-default\fc-wp-mysql\wordpress中添加好,改写好,为了避免出现其他情况,第一次我建议你啥都别动,直接部署即可。

如果你想部署typecho,就把Wordpress文件夹下的文件删除,把Typecho的文件放进来即可。但WordPress文件夹名字不要随意改动。

在命令行中进入fc-web-mysql文件夹中,执行如下三条命令即可搞定。

fun nas init 初始化 NAS,

fun nas sync 上传文件到 NAS

fun deploy 部署

完成后,访问fc.tangruiping.com即可看到安装界面,而这就跟其他传统的LNMP或LAMP环境中安装WordPress和Typecho是一样的。

开启全程HTTPS

首先进入你的阿里云函数计算页面,注意下你左上方的区域,不要选错了区域,不然找不到你的域名。找到自定义域名这个选项,开启HTTPS,自己申请证书填写好。

然后在WordPress主题functions.php追加如下代码:复制代码如有不便请来此处https://gitee.com/ct2/web/blob/master/serverless-wordpress-typecho.md

//http转https
add_filter('get_header', 'fanly_ssl');
function fanly_ssl(){
   if( is_ssl() ){
       function fanly_ssl_main ($content){
           $siteurl = get_option('siteurl');
           $upload_dir = wp_upload_dir();
           $content = str_replace( 'http:'.strstr($siteurl, '//'), 'https:'.strstr($siteurl, '//'), $content);
           $content = str_replace( 'http:'.strstr($upload_dir['baseurl'], '//'), 'https:'.strstr($upload_dir['baseurl'], '//'), $content);
           return $content;
       }
       ob_start("fanly_ssl_main");
   }
}

在wp-config.php追加如下代码

$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

然后再次同步到NAS,再次部署即可更新,每次部署,函数计算中的域名都会默认变为HTTP,自行手动改回去。

最后在WordPress设置中也修改一下,但以HTTPS的方式进行访问就走HTTPS协议,如果以HTTP方式访问就走HTTP协议。还是没办法让HTTP重定向到HTTPS,这点没能解决。

可用really-simple-ssl插件解决此问题,所以上面代码应该不需要配置就能解决,如果不行那就用上代码+插件。

Typecho开启HTTPS方法,站点根目录下的config.inc.php文件中加入下面代码,但依旧没办法支持HTTP重定向到HTTPS,WordPress用插件可以解决,但Typecho就没有这样的插件了,需要在函数层面解决。

 /** 开启HTTPS */
define('__TYPECHO_SECURE__',true);

采用Serverless的问题

网站没办法伪静态,如果是老网站迁移,则可能无法对应上原有地址,导致SEO排名问题,若是新站,则可以考虑。

热启动后加载时间稍慢,”第一页”通常需要1.5~2.5s的等待时间,注意不是冷启动。

这里的第一页指的是第一个加载的资源文件,而不是网站的主页。

而伪静态,反正按照常规在后台设置是行不通的。而Serverless也没办法像Apache,Nginx之类的自行配置,不知道有没有其他的办法。

至于加载时间,我是反复多次在普通压测的情况下,打开网站的时间如下图所示,为Typecho程序。

网页各个页面加载时间情况

压测结束后,我再次打开这些页面,发生时间还更慢了,好几次加载的第一页都超过了3s。不过,这一切的前提,都是在我用的其他区域的数据库所测试的结果。

我的阿里函数计算是上海区域,我的数据库是在北京区域,同时上面还部署有其他站点,这或多或少也会影响点,再看上面教程给了demo的速度也是在1.5s左右。已经验证出结果了,确实我的跨区域数据库影响甚大,采用下面的SQLite时间还短些。没具体测试,看浏览器的热启动时间有时候可以不到1s了。

另外,还可以去函数计算的日志中看调用的情况。日志默认开通,但需配置日志仓库和工程,并且授权函数计算写日志的权限。最好了解下日志服务,虽然有免费额度,但是不多,超出部分则收取费用。

为了缩小误差,我又特意安装了使用了SQLite3的数据库安装Typecho,结果出乎我意料,冷启动时间不到6秒,而WordPress默认设置是12秒以上,甚至是15秒,热启动的时间基本在200~400毫秒左右,其余都一样,只有数据库不一样。

而后又把WordPress安装到Serverless上,用的是MySQL数据库,发现结果并没有比Typecho用MySQL数据库慢,甚至还要快一丢丢,这超出了我的能力范围,我无法解释,只能称之为玄学。

SQLite3数据库安装

如果MySQL数据库的方式你安装成功了,那么SQLite3则还需要PHP环境,而用SQLite3的好处是,不需要你另外花钱购买数据库了,如果你之前没有数据库,而一直都是用着静态网站的话。

Sqlite3数据库是同博客程序安装到NAS文件存储上的,相当于网站和数据库直接是本地通信,能减少访问数据库时间。不过Sqlite没办法做多并发写入,多并发读取倒不是什么问题,因此对于个人博客完全不用担心。

首先你的系统需要PHP环境,到https://windows.php.net/download/下载,选择Thread Safe下的ZIP下载即可。然后解压到某个目录,配置Path项的环境变量,把路径指向为你的PHP所在目录,重新打开命令窗口执行php -v即可看到php的版本号。

在php的文件夹下,复制一份php.ini-development文件重命名为php.ini,记事本打开配置它。

搜索extension_dir,把;extension_dir = "./"改为extension_dir = "./ext"即可,注意;表示注释,得去掉。

搜索extension=pdo_sqlite,去掉注释。

其余参考开头的那篇教程即可,仅适用于WordPress安装,若要用SQLite3安装typecho则需自己改造。

还是简单说一下我的改造过程吧,把Typecho的文件替换掉WordPress的文件,这一步跟前面用MySQL安装Typecho是一样的,修改hosts文件,暂时把自定义域名指向127.0.0.1,然后进到fc-web-sqlite\.fun\nas\auto-default\fc-wp-sqlite\wordpress目录下执行php -S 0.0.0.0:80命令本地安装好typecho和SQLite3数据库的链接,完成后在usr文件夹下看到一个.db的数据库文件,我这里的名字为my0908.db,回到上一级目录打开config.inc.php文件,找到定义数据库参数这一段,可以看到它指向的数据库路径,我这里把它改为 'file' => '../usr/my0908.db',。(为了安全,我建议把文件名弄长一些)

在复制一份config.inc.php文件改名为config.inc-sqlite3.php,打开它,把数据库的指向路径修改为 'file' => './usr/0908.db',,跟前面的相比少了个点号。

在打开index.php文件把config.inc.php替换为config.inc-sqlite3.php即可完成改造。

因为数据库在本地,路径只能是相对的,而相对的位置又不一样,只好通此种办法巧妙解决。或者获取NAS上的绝对路径填写,就不用如此修改。对于SQLite3数据库的管理和查看,推荐这个可视化工具DB Browser for SQLite

Fun工具命令

查看NAS上的文件fun nas ls -a nas://你的服务名/服务中的本地路径,比如fun nas ls -a nas://fc-wp-mysql/mnt/auto/wordpress 可查看WordPress文件夹下的文件,用这个fun nas ls -a nas:///mnt/auto/wordpress也行。

删除NAS上的文件fun nas rm -r nas://你的服务名/服务中的本地路径,比如fun nas rm -r nas://fc-wp-mysql/mnt/auto/wordpress/wp-content/themes/twentynineteen删除WordPress自带的一个主题

复制文件fun nas cp nas:///mnt/auto/wordpress/robots.txt D:\ 复制NAS的文件到本地的D盘,反之fun nas cp D:\robots.txt nas:///mnt/auto/wordpress/则是复制robots.txt文件到NAS的WordPress文件夹下,然后可通过上面的命令查看即可。复制文件夹上传加上参数-r就好。

自动部署WordPress到Serverless

如果觉得上面的还是有难度,那么进入阿里云的函数计算中的应用中心,选择创建应用模板,找到无服务器 WordPress 网站这一项开始创建,为了确保一次性搞定,你得预先把域名CANME解析到函数计算域名上,参见《配置.env文件》这里的域名解析,然后点击部署即可。成功后,浏览器上输入你绑定的域名即可安装WordPress程序。

跟手动相比,没办法用SQLite3数据库,没办法用Typecho博客,不过通过挂载NAS替换相应的文件应该也可以做到这些,但这跟手动相比又有何区别呢?

如果不想用了,删除应用,删除时间长达1小时左右。虽然慢点,但是很安心,会自动删除VPC,NAS,还有ECS下的安全组列。