一、准备工作 ⚓︎
- 已经完成的本地 Hexo 项目文件,具体见:Hexo 教程(一)、Hexo 教程(二)、Hexo 教程(三)等等。
- 已经购买的云服务器,如腾讯云、阿里云等等。
- 服务器系统:CentOS 或 Ubuntu 等等。
- 服务器已开放端口:22(SSH)、80(HTTP)、443(HTTPS,可选)。
- 已获取服务器 公网IP、root 账号密码 / 密钥。
- 已购买域名且备案(不备案无法访问)(可选)。
- 购买 SSL 证书(可通过 HTTPS 访问)(可选)。
二、部署到云服务器 ⚓︎
1、登录云服务器(本地终端执行)(可选) ⚓︎
1 | ssh root@服务器 IP |
执行后会提示输入服务器 root 密码,输入即可登录。
2、更新系统软件包 ⚓︎
1 | # CentOS 系统 |
3、安装 Git ⚓︎
1 | # CentOS 系统 |
4、安装 Nginx(用于托管 Hexo 静态文件) ⚓︎
1 | # CentOS 系统 |
同时安装(可选) ⚓︎
1 | # CentOS 系统 |
5、启动 Nginx ⚓︎
1 | # 启动 Nginx |
6、创建网站根目录(存放 Hexo 静态文件) ⚓︎
1 | sudo mkdir -p /blog/hexo |
- 修改权限:[1]
1 | sudo chown -R $USER:$USER /blog/hexo |
7、配置 Nginx ⚓︎
1、创建 Nginx 配置文件:
1 | sudo vim /etc/nginx/conf.d/hexo.conf |
在打开的 vim 编辑器中,输入以下配置(按 i 进入编辑模式):
1 | server { |
编辑完成后,按 Esc,输入 :wq 保存并退出 vim。
1 | # 验证配置 |
2、Ubuntu / Debian 系统(可选)
创建 Nginx 配置文件并输入配置(配置和上面一样):
1 | sudo vim /etc/nginx/sites-available/hexo |
然后启用配置:
1 | # 创建软链接(启用配置) |
8、创建 Git 裸仓库目录 ⚓︎
1 | sudo mkdir -p /blog/hexo.git |
- 修改权限:[2]
1 | sudo chown -R $USER:$USER /blog/hexo.git |
初始化裸仓库:
1 | cd /blog/hexo.git |
9、创建 Git 钩子(hooks) ⚓︎
1 | sudo vim /blog/hexo.git/hooks/post-receive |
输入以下内容:
1 | #!/bin/bash |
- 修改执行权限:[3]
1 | sudo chown -R $USER:$USER /blog/hexo.git/hooks/post-receive |
10、修改 Hexo 配置文件并部署 ⚓︎
repo 格式:{管理员用户名}@{服务器IP}:{Git裸仓库地址}
1 | deploy: |
最后执行:
1 | hexo clean && hexo g && hexo s |
执行后会提示输入服务器 root 密码,输入即可完成部署。
三、常见问题 ⚓︎
1、404 Not Found ⚓︎
Nginx 配置错误:root 路径指向了错误的目录,location 规则配置不当,或者域名解析错误。
2、403 Forbidden ⚓︎
在配置完 Nginx 后,访问网站如果出现 403 Forbidden,则说明 Nginx 配置没有问题。在部署完之后,如果出现 403 Forbidden,则有以下可能:
(1)文件/目录权限不足 ⚓︎
请确保上面步骤中有关权限的命令(chown 和 chmod)都已执行。
(2)SELinux / AppArmor 限制 ⚓︎
解决方法如下:
(1)判断当前系统的安全模块
1 | # 检查 SELinux |
- 如果
sestatus输出SELinux status: enabled,说明是SELinux。 - 如果
apparmor服务处于active状态,说明是AppArmor。
(2)关闭 SELinux
1 | # 临时关闭 SELinux(用于测试) |
- 修改后需要重启服务器才能生效。
(3)关闭 AppArmor
1 | # 临时关闭 AppArmor |
(3)Git 钩子同步问题 ⚓︎
检查网站根目录是否有 Hexo 静态文件,如果有,则是 Nginx 配置错误的问题;如果没有,先检查钩子文件是否有问题。
1 | # 进入钩子目录 |
如果提示 目录不存在 或者 权限不足,请按上面步骤 创建目录 和 修改权限;如果文件同步过去了,则说明钩子文件没有问题,可能是环境变量差异的问题,请将钩子文件修改为以下内容:
1 | #!/bin/bash |
(4)关于文件所有者/所属组 ⚓︎
一些云服务器的默认主机名可能不是 root,如腾讯云里面的 Ubuntu 系统的主机名就为 ubuntu,而当以 root 用户名登录后,Linux 终端的提示符就会变成 root@VM-0-9-ubuntu,比较乱,下面介绍一个最简单的方法来解决所有关于文件所有者的问题。(@ 为分隔符,@ 前面为用户名,后面为主机名。)
- 首先,确定你的云服务器的用户名,一般在云服务器的控制台上找;
- 然后,在 Hexo 配置文件中,将
“{管理员用户名}@{服务器IP}:{Git裸仓库地址}”这里的管理员用户名改为你的云服务器的用户名; - 最后,将前面创建的
hexo、hexo.git和post-receive文件的所有者/所属组改为你的云服务器的用户名。
例如,我的云服务器用户名为 ubuntu,那么配置文件就写 repo: ubuntu@IP:/blog/hexo.git,然后用 sudo chown -R ubuntu:ubuntu {文件路径} 命令修改 hexo、hexo.git 和 post-receive 文件的所有者/所属组。
注意,前面的 $USER 是指向当前登录用户,如果我以 root 用户名登录,使用上面的命令就会把所有者/所属组改为 root 而不是 ubuntu,就有可能出现问题。
四、创建 Git 用户(避免使用 root 部署)(可选) ⚓︎
- 除了下面的步骤,其他步骤均与上面相同。
1、创建 Git 用户 ⚓︎
1 | # 创建 Git 用户并自动生成 /home/git 主目录 |
执行 passwd git 后,输入两次密码。
2、给 Git 用户添加 sudo 权限 ⚓︎
1 | # 编辑 sudoers 文件 |
3、通过 SSH 登录(本地) ⚓︎
1 | ssh git@服务器 IP |
4、修改权限 ⚓︎
使用 sudo chown -R git:git {文件路径} 修改 hexo、hexo.git 和 post-receive 文件的所有者/所属组。
5、修改 Hexo 配置文件 ⚓︎
1 | repo: git@IP:/blog/hexo.git |
五、SSH 免密登录 ⚓︎
- 私钥(id_rsa):保存在客户端(本地)
- 公钥(id_rsa.pub):上传到服务端(服务器)
- 登录时,服务器用公钥验证客户端的私钥,匹配成功则免密登录。
下面三种方法三选一即可,推荐第三种,最简单,但需要腾讯云服务器。
1、本地 → 服务器 ⚓︎
(1)本地生成 SSH 密钥
1 | # 生成 SSH 密钥对(-t 指定加密类型为 rsa,-C 添加备注,一般填邮箱) |
执行后会提示:
Enter file in which to save the key (C:\Users\用户名/.ssh/id_rsa): 直接回车(使用默认路径)
Enter passphrase (empty for no passphrase): 回车(设置空密码,免密登录)
Enter same passphrase again: 再次回车
最终会在 ~/.ssh/ 目录下生成 id_rsa(私钥)和 id_rsa.pub(公钥)。
(2)上传公钥到服务器
A:命令上传(请在 Git Bash 中进行,或者安装 OpenSSH)
1 | ssh-copy-id root@服务器 IP |
B:手动上传
1 | # 本地查看公钥内容并复制(本地进行) |
2、服务器 → 本地 ⚓︎
(1)服务器生成 SSH 密钥
1 | ssh-keygen -t rsa -C "server_key" |
(2)下载服务器私钥到本地
A:命令下载
1 | scp -P 22 root@192.168.1.100:~/.ssh/id_rsa ~/.ssh/server_id_rsa |
B:手动下载
1 | # 服务器查看私钥内容并复制(服务端进行) |
3、腾讯云 SSH 密钥 ⚓︎
登录 腾讯云控制台 → 进入 云服务器 或 轻量应用服务器 → 左侧导航栏找到 SSH 密钥。
(1)创建新密钥 → 本地
创建密钥 → 选择地域 → 设置密钥名称 → 选择创建新密钥 → 确定,浏览器会自动下载私钥文件(.pem 格式),务必保存好,这是唯一的下载机会。将下载的私钥文件(.pem 格式)移动到 C:\Users\用户名\.ssh\ 并将文件名改为 id_rsa。
(2)本地 → 使用已有公钥(可选)
1 | # 本地执行 |
创建密钥 → 选择地域 → 设置密钥名称 → 选择使用已有公钥 → 粘贴本地公钥 → 确定。
(3)绑定 SSH 密钥在腾讯云控制台的 SSH 密钥 页面下,点击 绑定实例,选择绑定自己的云服务器即可;或者在 云服务器 页面下,点击 SSH密钥,点击 绑定密钥,选择刚刚创建的密钥即可。










