WoadZS's Blog

若是你因错失太阳而流泪,你也会错失繁星。

WoadZS's avatar WoadZS

FTP 部署 Hexo 博客到虚拟主机

自从博客在 Github 和 Coding 建站完成后,发现这两并不能部署自定义 SSL, 因此准备另谋出路。很快决定了国外的解决方案是 Netlify. 国内的速度本来试过 魔门云, 但依旧发现其免费套餐解析节点在台湾和日本,国内的访问速度并不乐观。而其付费起步就是每月一百软妹币以上,不是很划算。Coding.net又不支持自定义 SSL 证书,导致多地部署不能很方便地同时实现 HTTPS 访问。

终于,我想起了我的老朋友 主机壳(链接带推广,介意可自行搜索)

为什么选择主机壳?

要回答这个问题,我们可以先回答:

为什么选择虚拟主机而不是 VPS 或者是 CDN?

首先,要明确的是选购服务的主要目的为加快中国大陆访问速度。

  • 仅网页服务器而言,VPS 略显杀鸡用牛刀,且价格昂贵,访问速度最快的香港可用区就更贵了
  • 不需要用香港 VPS 来搞些不和谐的事情
  • 几乎不存在价廉物美的香港 CDN, 各种标榜免费服务的 CDN 并不会真正给你部署成本高昂的香港节点。
  • 国内免费 CDN 需要备案,然而我懒得搞……
  • 虚拟主机维护不用费心

总之,从建站角度来说,虚拟主机价廉物美易于管理,位于香港的虚拟主机速度更是可以比拼国内。

为什么是主机壳而不是其他虚拟主机

其实还是之前跟主机壳有过py交易,比较熟悉。他们家有几项是很多别的主机商所没有的:

  • 直接部署在 CDN 上,支持将图片等文件放在内地节点,其他诸如 HTML 等可以直接访问香港节点
  • 支持 ECC 证书,ECC 证书有助于减少 SSL 的握手时间, SSL证书可以自己上传
  • 最低配价格并不是那么贵,对于还没几个访问量的我来说显得不太会浪费
  • 自带一定程度的抗 DDoS
  • 因为直接部署在 CDN 上,不用担心主机 IP 暴露或者是被其他邻居误伤

是不是说其他虚拟主机就不好呢,也不一定,至少在测试的时候,主机公园的香港空间(大流量)测试站就给我留下了深刻印象。然而他家是在价格对于菜鸡博主来说是在有些高,但对于访问量不是特别小的用户来说,倒也是可以尝试。

部署 Hexo 到虚拟主机

服务端设置

如何购买下单什么的就不说了,我的主机都用了两年了,以前用的是 WordPress, 然而现在转全静态过后,一般虚拟主机的 PHP 和数据库都基本上用不到了。

因此,在服务端需要设置的是:

  • 删除数据库
  • 进入 FTP 并清空网页根目录所有文件(每个服务商目录不一样,主机壳直接在 FTP 根目录全清除就好)
  • 上传 SSL 证书并做将域名的国内线路访问解析过来

到这里服务端要做的就结束了。

Hexo 设置

安装并使用 FTPSync 部署工具

安装 hexo-deployer-ftpsync

npm install hexo-deployer-ftpsync --save

然后在站点 _config.yml 文件中添加并修改一下配置,具体操作可以参考官方文档

这里讲一下多种部署方式如何写,比如我现在用的 Git 与 FTP 同时部署 Hexo:

deploy: 
- type: ftpsync 
  host: ftp.example.com 
  user: username
  pass: password
  #remote: [remote]
  port: 21
  #我在主机上设置了.htaccess 来实现 HTTPS 强制访问,此处可确保每次同步不会删除虚拟主机上的 .htaccess
  ignore: ['/.htaccess']
  #connections: [connections]
  #verbose: [true|false]
- type: git
  repo: 
    Github: git@github.com:woadzs/woadzs.github.io.git,master
    Conding: git@git.coding.net:WoadZS/woadzs.git,master

注意每个 - 后面有一个空格,来区分不同的部署方式。并且建议将 FTP 方式放在 Git 之前,因为 FTP 部署插件有个小 Bug, 部署完后,会在命令行界面卡在 INFO Deploy done: ftpsync 没反应,把 FTP 前置可以一定程度上解决这个问题。

解决完后就可以使用 hexo d 来正常部署静态博客了。

通过.htaccess 实现强制 HTTPS 访问

由于很多虚拟空间都是使用 Apache 来做的网页呈现,因此可以很方便的使用 .htaccess 来实现强制 HTTPS 访问。

如果你跟我一样使用的是主机壳的服务,这里有一个坑,在主机壳控制面板 HTTPS 证书管理 页面,你能看到这么一句提示:

如需.htaccess判断HTTPS请求,请判断用户请求header头的KERSSL值是否为on。Apache不使用443端口,只能使用判断规则RewriteCond %{HTTP:KERSSL} !on

因此,我在 .htaccess 只能这么写

RewriteEngine On
RewriteCond %{HTTP:KERSSL} !on
RewriteRule ^(.*)$ https://woadzs.me/$1 [R=301,L]

请把上面我的域名改成你的就能用了。

如果其他运营商没有这个坑,可以试试常规的写法,注意最好在最后面的 [L,R] 改成 [L,R=301] 强制启用 301 跳转,这样比默认的 302 跳转更有利于搜索引擎收录。具体原理可以参阅这篇文章

如果你想更骚气一些,可以这么写(其实这是官方推荐做法),但不保证在老版本的 Apache 上有用:

Redirect 301 / http://www.newdomain.com/

一行就搞定,简洁明了。

效果

没有对比就没有伤害,下图 BigKfish 是我朋友的静态站,测试时刚布置没多久,什么都没有。国内直接访问部署在 Netlify 的东京 Amazon 节点。

凌晨对比

测试时间是北京时间凌晨三点左右,国际线路并不拥堵,因此 BigKfish 还呈现了不少绿色,然而白天则会祖国山河一片红。

正午对比

上面这张图就是正午时分的对比效果(湖北节点是崩了,所以都是红的),日本节点的 BigKfish 访问效果下降得更厉害。夜间就不测试了,差别只会跟悬殊。