Hexo博客部署到VPS
几个月前换域名的时候顺便开通了腾讯云的一个服务器,将博客部署到服务器是看了这个教程。非常棒非常详细。
本教程已更新:https://blog.zhheo.com/p/49b7a68d.html
网上大部分教程都是将 Hexo 部署到 GitHub Pages 上面,本文主要介绍如何部署到 VPS。
VPS 环境:Ubuntu 16.04。
准备工作
网上流传的武功秘籍分为两种:
- 将 Hexo 项目上传到 VPS 上面后执行
hexo server
,之后配置Nginx
反向代理,让域名指向http://localhost:4000
。 - 将 Hexo 在本地通过
hexo generate
生成静态文件,在通过hexo deploy
部署到 VPS 上面,使用 Nginx 直接做 Web 服务器。 - 相比第二种方式,第一种每次写博客与更新博客时候的操作会很繁琐。所以我们使用第二种方式进行部署,这样既可以将静态文件 deploy 到 VPS 上,也可以上传到 Github 上用作备份,操作性和安全性上都要胜于前者。
而对于第二种方式而言,常用的又有 git hook
和 rsync
两种自动部署解决方案。
本文主要介绍 git hook
部署过程。
Git Hooks 自动部署
部署原理
我们在本地编辑文本,然后使用 Git 远程部署到 VPS 的 Git 仓库。hexo d
命令实际上只 deploy 了本地的 public 文件夹,Git Hooks 实际上就是当 Git 仓库收到最新的 push 时,将 Git 仓库接受到的内容复制到 VPS 上的网站目录内。相当于完成了手动将 public 文件夹复制到 VPS 的网站根目录里。
安装配置 Git
安装 Git
通过 SSH 连接 VPS,执行:apt-get install git
,完成后通过 git --version
查看 Git 版本,若显示版本信息则说明安装成功。
创建 git 用户
执行:adduser git
,根据提示设置密码。
赋予 git 用户 sudo 权限
执行:
1 | chmod 740 /etc/sudoers |
找到以下内容:
1 | ## User privilege specification |
在 root ALL=(ALL:ALL) ALL
这一行下面添加 git ALL=(ALL:ALL) ALL
保存退出后,修改回文件权限:
1 | chmod 440 /etc/sudoers |
关闭 git 用户 shell 权限
我们也可以通过:
1 | ssh git@VPS IP |
ssh 连接服务器,登录到服务器上,对服务器进行各种操作,这通常很不安全,也不合适,我们只需要能对仓库操作就可以了,不需要更大的权限。
因此我们关闭 git 用户 shell 权限,执行:
1 | vim /etc/passwd |
将最后一行的 git:x:1001:1001:,,,:/home/git:/bin/bash
修改为 git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git 用户可以正常通过 ssh 使用 git,但无法登录 shell,因为我们为 git 用户指定的 git-shell 每次一登录就自动退出。
初始化 git 仓库
1 | cd /home/git //切换到git用户目录 |
注意:裸仓库没有工作区,因为服务器上的 Git 仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的 Git 仓库通常都以.git 结尾。
创建网站目录
1 | cd /var/www/ //切换目录 |
配置 SSH
1 | cd /home/git //切换到git用户目录 |
然后将本地的公钥复制到 authorized_keys
文件里 (公钥即本地执行 cat ~/.ssh/id_rsa.pub
查看的内容)。
注意:收集所有需要登录的用户的公钥,就是他们自己的 id_rsa.pub
文件,把所有公钥导入到 /home/git/.ssh/authorized_keys
文件里,一行一个。
用户组管理
1 | ll /home/git/ |
确保 blog.git
、.ssh、blog
目录的用户组权限为 git:git
,若不是,执行下列命令:
修改用户权限的命令:
1 chown -R 用户名.组名 /目录
1 | chown -R git.git /home/git/blog.git/ |
安装配置 nginx
安装 nginx
执行:apt-get install nginx
,若输入 nginx -V
可以看到 nginx 版本信息,则安装成功。
配置 nginx
执行:
1 | cd /etc/nginx/sites-available //切换目录 |
参考配置文件内容:
1 | server { |
保存退出后,启动 nginx:
1 | systemctl start nginx |
设置开机自动启动:
1 | systemctl enable nginx |
查看运行状态:
1 | systemctl status nginx |
显示 running 表示成功运行。
配置 Git Hooks
创建 post-receive 文件
git 用户下执行(这里我用 root 用户执行上述命令,然后更改了文件所有者为 git.git
):
1 | cd /home/git/blog.git/hooks //切换到hooks目录下 |
复制下面的内容到 post-receive
文件中:
1 | #!/bin/bash |
为什么不直接将裸仓库克隆到 Web 根目录下呢?我之前也一直被这个问题困扰,感觉先克隆到 tmp 目录再拷贝到 Web 根目录是多此一举。后来我觉得可能是出于项目安全的考虑,在执行 cp 命令的时候,
.git
作为隐藏目录不会被拷贝到 Web 根目录下,也就避免了将整个仓库历史暴露在 Web 服务中。
赋予可执行权限:
1 | chmod +x post-receive |
本地操作
尝试连接
在本地打开 Git Bash:
1 | ssh git@VPS的ip |
若默认端口不是 22,则需要在后面加上 -p 端口号
:
1 | ssh git@VPS的ip -p 2022 |
或者在.ssh
文件夹下创建一个 config
文件,内容如下:
1 | Host 服务器IP |
这里可能会出现以下错误:
1 | IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! |
原因分析:
It is also possible that a host key has just been changed.
我之前对 ssh 服务器重装了系统,导致所有与原系统建立过 ssh 连接的系统都无法再建立连接,因为在于原系统建立首次连接时,双方相互记录了对方的公钥(ssh 基于非对称密钥技术),在 ssh 服务主机重装系统后,公钥改变了,任以旧版本公钥的主机自然是无法与新系统连接的。
网上还有分析为 ssh 主机被人黑了,并在消除入侵记录时对 known_hosts 文件做了改动。
解决方案:
删除 ~/.ssh/known_hosts
文件,或者如果你可以判断出 known_hosts
中原 ssh 服务器的公钥,删去那部分,
然后再次建立新的连接,即可获得新的公钥。
配置 Hexo
打开本地博客根目录下的_config.yml
文件,找到最后的 deploy
配置,修改为:
1 | ## Deployment |
到此,Hexo 建站就全部配置部署完毕了。
参考
该作者其他文章推荐
- 感谢你赐予我前进的力量