这几天想折腾一下去年双十一买了一直没折腾的服务器,中途配置的过程中遇到不少奇奇怪怪的坑,着实把我折磨得够呛。
服务器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 | chmod 700 .ssh |
也没用。之后我还尝试修改了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 | url: https://www.strawberrytree.com/blog |
这是nginx配置文件nginx.conf
。
1 | server { |
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 | { |
这个过程中还学到了很多杂七杂八的东西。比如HTTPS的相关配置、服务器的SSL选项等配置。
接下来还有比较多要做的,主要就是nexT主题的配置。其余还有一些想在这个博客上写的内容,不过现在还有别的事情做,之后另起一篇吧。