0%

配置Hexo时遇到的坑

这几天想折腾一下去年双十一买了一直没折腾的服务器,中途配置的过程中遇到不少奇奇怪怪的坑,着实把我折磨得够呛。

服务器RSA私钥认证配置

大体上我是参考这篇文章进行配置的带你跳过各种坑,一次性把 Hexo 博客部署到自己的服务器

在阿里云服务器上创建了git用户后需要将本地的公钥写入git用户文件夹中/home/git/.ssh/authorized_keys的末尾。初始情况下.ssh文件夹是并未创建的,用户需要创建.ssh文件与authorized_keys文件。

一般来讲这里有两种实现方法,第一种方法是在本地执行命令

1
ssh-copy-id -i C:/Users/yourname/.ssh/id_rsa.pub git@server_ip

这种方法要求用户输入口令(当然能用私钥认证也行,但我要首先把我的公钥存到服务器🤦。那么要怎样把公钥存到服务器呢?当然是要先认证!)。但是阿里云的默认设置是禁止口令登录,平时我都是使用putty读取磁盘上的私钥连接到root用户的。

正面的解决办法是在/etc/ssh/sshd_config中将PasswordAuthentication no修改为PasswordAuthentication yes。在修改完成之后执行service sshd reload应用配置文件的更改。这时就可以使用口令登录了。

不过采用这种方法还需要在上传公钥后再关闭口令认证,再次reload,我嫌麻烦。我当时解决方法是将本地的公钥用WinSCP传到远端的硬盘上,之后执行命令

1
cat id_rsa.pub >> authorized_keys

按理来说执行之后就已经可以使用ssh连接git用户进行操作了,不过我尝试之后发现会报错Permission denied (publickey,gssapi-keyex,gssapi-with-mic)。尝试了修改权限

1
2
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

也没用。之后我还尝试修改了sshd的配置,甚至还检验了公私钥对是否匹配(我的天啊)。在痛苦地排查了一下午+一晚上之后,第二天上午我终于发现了问题的关键在于authorized_keys的owner是root而不是git。将owner修改之后终于ok了。

hexo url设置为二级目录

一开始是打算把博客的url设置为二级域名的。但是在阿里免费申请的SSL证书是单域名的,只支持带www的和不带www的,而非多域名证书,我在nginx配置中设置了强制HTTPS之后,访问 https://blog.strawberrytree.top 会报错。因此只能选择利用二级目录的形式。

这里遇到的坑是最开始设置完二级目录之后访问的url应该是https://blog.strawberrytree.top/blog/ 而非是https://blog.strawberrytree.top/blog。原始的设置访问后者会报404 Not Found。后来我稍微修改了一下nginx的设置,二者都可以访问了。

之后我查了一下stackoverflow有没有可以去掉末尾斜杠的办法,一个办法是用在nginx的配置中加上rewrite,不过可能因此影响到get请求,但是也有办法规避。我想了想,面对将来可能会引爆的坑,还是压制住我的强迫症比较好。

下面是最终的配置。

这是hexo根目录下的_config.yml

1
2
url: https://www.strawberrytree.com/blog
root: /blog/

这是nginx配置文件nginx.conf

1
2
3
4
5
6
7
8
9
10
server {
listen 443 ssl;
server_name www.strawberrytree.top;
......
......
location /blog {
alias /home/git/projects/blog/;
index index.html index.htm;
}
}

hexo 无法监视文件变化(?)

在阅读相关资料对hexo进行配置时我了解到hexo会监听文件变化动态地刷新网页。我在尝试修改_config.yml中的title字段时却发现网页并不会刷新。

查了很多资料,都没有说为什么hexo无法监听到文件变化,相反,hexo server还有专门的选项-s选择静态启用本地服务器,不对文件进行监视。

最后我发现在撰写日志时其实是会监听到文件的变化的!

白 查 了。hexo无法监视或者说不去监视配置(或者是部分配置项)的变化。

总结

其实一趟做下来收获还是挺大的。hexo生成的是静态文件,因此服务器端不需要运行客户端。整个架构是这样的:

server端:

  • nginx反向代理。指定静态文件的位置。在这里我们是指定了hexo的静态文件仓库。
  • 实际的项目仓库/home/git/projects/blog。存储hexo静态文件的地方。对应的“远端仓库”是git裸仓库。
  • git裸仓库/home/git/repos/blog.git与hook。git裸仓库是远端仓库。我们在本地也可以指定该仓库作为远端仓库并且也可以从该仓库中clone文件。clone得到的文件和服务器端项目仓库/home/git/projects/blog中的内容一致。post-receive钩子会在收到新推送后触发,强制将项目仓库中的文件更新到与git裸仓库中master的最新推送一致。

本地其实就是单个项目,这里说一下npm脚本的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
......
"scripts": {
......
"deploy": "hexo clean && hexo g -d", #部署,这里会生成相关文件后推送
"start": "hexo clean && hexo g && hexo s" #本地启动服务器
},
......
"dependencies": {
......
"hexo-deployer-git": "^2.1.0", #推送的依赖,配置项中指定的git就会使用这个依赖,部署时会推送到远端仓库
......
}
}

这个过程中还学到了很多杂七杂八的东西。比如HTTPS的相关配置、服务器的SSL选项等配置。

接下来还有比较多要做的,主要就是nexT主题的配置。其余还有一些想在这个博客上写的内容,不过现在还有别的事情做,之后另起一篇吧。