Hexo 博客部署到 Ubuntu 服务器

本文主要参考了 EasyHexo 网站 上的《部署到 CentOS Servers》,结合 Ubuntu 的实际,对《部署到 CentOS Servers》 作了修改和补充。文中使用的服务器是一台运行 Ubuntu 的 VPS。

一台运行 Ubuntu 的 VPS

远程连接到服务器并配置环境

用 SSH 远程连接到服务器。此处假定已经配置好服务器的 SSH 免密登录,假定用户名为 kukmoon,服务器的 IP 为 999.999.999.999

1
$ ssh kukmoon@999.999.999.999

在服务器上安装 Git,如果已有 Git,可以跳过。

1
$ sudo apt install git

在服务器上新建名为 git 的用户:

1
$ sudo useradd -m git

在服务器上设置 git 用户的密码:

1
$ sudo passwd git

配置 SSH 免密登录

在本地电脑上生成一对公钥和私钥。如果已经生成,可以跳过。输入 ssh-keygen 后一路回车,结束后会在 C:\Users\<用户名>\.ssh 目录下生成一对公钥(id_rsa.pub)和私钥(id_rsa)。

1
PS C:\Users\Kukmoon> ssh-keygen

接下来要把公钥复制到服务器上。在服务器上新建 /home/git/.ssh 目录,并修改其属性:

1
2
$ sudo mkdir /home/git/.ssh
$ sudo chmod 700 /home/git/.ssh

在服务器上临时修改 /home/git/.ssh 目录及所有文件与子目录的所有权为当前用户,此处当前用户名是 kukmoon

1
$ sudo chown -R kukmoon:kukmoon /home/git/.ssh

在本地电脑上操作,将公钥添加到服务器上的 authorized_keys 文件中,并修改其属性。

1
cat ~/.ssh/id_rsa.pub | ssh kukmoon@999.999.999.999 'cat >> /home/git/.ssh/authorized_keys;chmod 700 /home/git/.ssh;chmod 600 /home/git/.ssh/authorized_keys'

在服务器上把 /home/git/.ssh 及其全部内容的所有权归还给 git 用户:

1
$ sudo chown -R git:git /home/git/.ssh

测试免密登录

在本地测试一下能否能用 git 用户免密登录服务器,假设 999.999.999.999 是服务器的 IP 地址:

1
PS C:\Users\Kukmoon>ssh -i ~/.ssh/hexo-deploy-key git@999.999.999.999

如果不能免密登录,就需要在服务器上进行以下检查。

  1. 检查 /etc/ssh/ 目录下的 sshd_config 文件,确认以下关键选项是否正常:
1
2
3
4
5
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
  1. 若还是不能正常工作,则检查用户权限和组权限
1
2
3
$ sudo chmod 0755 /home/git
$ sudo chmod 700 /home/git/.ssh
$ sudo chmod 600 /home/git/.ssh/authorized_keys

如果能免密登录,就需要剥夺 git 用户的 Shell 登录权限。用 sudo vi /etc/passwd 打开 passwd 文件,将git:x:1001:1001:,,,:/home/git:/bin/bash 最后的 /bin/bash 改成 /usr/bin/git-shell。出于安全考虑,git 用户登录后将不得接触 Linux 的 shell,但不影响它执行 git 命令。

配置 Git 仓库

如果能免密登录,下一步工作就是配置 Git 仓库。

创建并初始化 Git 仓库。在服务器上执行以下命令:

1
2
3
4
$ sudo mkdir -p /var/repo
$ cd /var/repo
$ sudo git init --bare blog.git
$ sudo chown -R git:git blog.git

配置 Git Hooks

在服务器上创建 post-receive 文件

1
$ sudo vi /var/repo/blog.git/hooks/post-receive

并且在上述 post-receive 文件中写入以下内容:

1
2
#!/bin/sh
git --work-tree=/var/www/hexo --git-dir=/var/repo/blog.git checkout -f

提升上述 post-receive 的可执行权限。

1
$ sudo chmod +x /var/repo/blog.git/hooks/post-receive

在服务器上创建静态页面目录。

1
2
$ sudo mkdir -p /var/www/hexo
$ chown -R git:git /var/www/hexo

这样,只要我们在本地电脑上用 hexo d 命令发布博客,本地的 Hexo 就会调用 Git,将博客的静态页面文件上传到服务器的 Git 仓库(/var/repo/blog.git)中,而服务器的 Git 则会将仓库中的所有静态文件都转移到静态页面目录(/var/www/hexo)中,当用户访问我们的博客时,服务器的 Nginx 就会读取并显示静态页面目录中的内容。

安装与配置 Nginx

在服务器上安装 Nginx。

1
$ sudo apt install nginx

在服务器上设置防火墙打开 80 和 443 端口。

1
2
$ sudo ufw allow 80
$ sudo ufw allow 443

在服务器上为站点创建配置文件。

1
$ sudo vi /etc/nginx/sites-availbale/blog.kukmoon.com.conf

在服务器上向 blog.kukmoon.com.conf 写入以下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# blog.kukmoon.com
#
server {
# 设置监听端口
listen 80;
listen [::]:80;

# 设置域名
server_name blog.kukmoon.com;

# 重定向对网站根目录的访问
location / {
root /var/www/hexo;
index index.html index.htm index.nginx-debian.html index.php;
}

# 对用户屏蔽某些文件
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
}

假如你有 SSL、TLS 证书,就可以配置 https 访问和 http 跳转 https,那么需要在上述 blog.kukmoon.com.conf 中写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# blog.kukmoon.com
#
server {
# 设置监听端口
listen 80;
listen [::]:80;

# 设置域名
server_name blog.kukmoon.com;
## SSL 配置

# 设置监听端口
listen 443 ssl http2;

listen [::]:443 ssl http2;

# http 跳转到 https
if ($ssl_protocol = "") { return 301 https://$host$request_uri; }

# 证书配置
ssl_certificate /var/www/kukmoon.com/cert/cert.pem;
ssl_certificate_key /var/www/kukmoon.com/cert/privkey.pem;

# SSL 参数配置
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;

# 关闭 gzip 压缩
gzip off;

# 重定向对网站根目录的访问
location / {
root /var/www/hexo;
index index.html index.htm index.nginx-debian.html index.php;
}


# 对用户屏蔽某些文件
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
}

在服务器上使站点生效。

1
2
$ cd /etc/nginx/sites-enabled
$ sudo ln -s /etc/nginx/sites-availbale/blog.kukmoon.com.conf blog.kukmoon.com.conf

当配置好 DNS 以后,就可以在浏览器中访问 http://blog.kukmoon.comhttps://blog.kukmoon.com ,查看博客主页。

从本地发布博客文章

首先,在本地电脑上安装 Hexo 的部署插件,此处假设博客源文件在 C:\Users\Kukmoon\kukmoon_blog 目录。注意:部署插件只需要安装一次。

1
2
3
PS C:\Users\Kukmoon\>cd kukmoon_blog
PS C:\Users\Kukmoon\kukmoon_blog> npm install hexo-deployer-git -s
PS C:\Users\Kukmoon\kukmoon_blog> npm install hexo-server -s

在本地电脑上修改博客源文件目录下的 _config.yml 中的 deploy 选项。注意:这个步骤也只需要做一次。

1
2
3
4
deploy:
- type: git
repo: ssh://git@999.999.999.999/var/repo/blog.git
branch: master

此处的 999.999.999.999 是服务器的 IP 地址。ssh://git@999.999.999.999/var/repo/blog.git 是之前在服务器上建立的仓库。

在本地电脑上发布博客:

1
hexo d -g

其他问题

如有其他问题,请参见 EasyHexo 网站 上的《部署到 CentOS Servers》

图片版权

题图:https://archive.org/details/ubuntux86x64distros

头图:Image by Michael Pointner from Pixabay


求扫码打赏
“我这么可爱,请给我钱 o(*^ω^*)o”

Hexo 博客部署到 Ubuntu 服务器
https://blog.kukmoon.com/20dafc3ac0e9/
作者
Kukmoon谷月
发布于
2024年11月18日
许可协议