源起
这部分对主题关联不大,可跳过。
搭建一个博客的想法其实很早就有了,也早就确定了要用 hexo,好像也没有特别的理由,最开始是被主题吸引住的(喂喂喂,关注点不对啊),后面也确实花了很多时间换这换那主题的,等到了24年真正决定要上线的时候,才顿悟过来,光顾着美观没有内容岂不是本末倒置,徒有其表了。所以基本也就不折腾了,选了一个好看的主题,慢慢开始充实内容。
Hexo 简介
博客框架很多,老实说,我都建好了好几个其他框架的目录,比如 WorldPress,solo 等,只是太懒了目前的想法还是先专心搞好 hexo,内容有了,换个框架也只是顺手的事。
选择 hexo 的理由如上面提到的:
- 丰富的主题:这才是入坑理由!
- markdown 渲染:何人不爱md
- 轻量:纯静态页面,或许是缺点,也或许是优点
只需要在本地编辑好 Markdown 文档,就可以一步生成部署,非常方便。
Hexo 本地部署
-
安装
nodejs,如果有多版本使用需求其实更建议安装nvm,我这里就直接安装了 lts 版了; -
安装
hexo框架包npm install hexo-cli -g -
初始化博客目录
进入想要放置博客文件的目录,比如:C:\Projects\hexo,右键打开git bash或cmd# 初始化博客目录,指定博客目录名称,比如 hexo_blog hexo init <HEXO_DIR_NAME> cd <HEXO_DIR_NAME> # 安装依赖包 npm install -
查看默认页面
完成以上安装后,执行hexo server打开
http://localhost:4000就可以看到默认的页面了,剩下的工作就是找一个好看的主题创建自己的内容进行丰富了。 -
【补充】常用命令
简要列举几个使用频率很高的命令,基本可以覆盖95%(统计数据来自本人)以上场景,其他使用不多的完整命令可以参考 官网说明 。# 新建文章 hexo new <TITLE> # 清理缓存和生成的静态文件,每次部署前都要执行 hexo clean # 生成静态文件 hexo generate # 启动本地服务器,部署前的预览检查 hexo server # 部署到配置的服务器,比如 github pages 或 云服务器 hexo deploy
Hexo 部署到 Gitee Pages(不推荐)
添加公钥
注册登录 Gitee,在【安全设置】-【SSH公钥】添加即可。
如果没有的话,生成一个就行,参考 [如何配置密钥免密](#SSH 免密登录)
创建仓库
新建一个空仓库,名称随意,比如 hexo_blog
修改项目部署配置
修改 hexo 本身的配置 _config.yml 配置文件,不是主题配置哦!
找到 deploy 部分,参考:
deploy:
# 阿里云部署
- type: git
repo: git@hexo:/home/git/hexo
branch: master
# Gitee 部署
- type: git
repo: https://gitee.com/<USERNAME>/hexo_blog.git
branch: main
修改 repo 为创建的仓库地址,分支指定为 main 。
远程部署
配置好之后,执行:
hexo d
如果公钥、配置一切正常,执行后会要求输入 Gitee 登录凭据:
啊!忘了截屏!!(无论使用 vscode 还是 git bash 都会要求输入)

显示部署成功后刷新仓库就可以看到部署的静态资源了。
开启 Gitee Pages

Hexo 部署到 Github
基本操作同上:
- 在设置添加本地 ssh 私钥;
- 创建一个空仓库,将博客根目录下
config.yaml中 deploy 部分地址修改为仓库地址; - 执行部署
Hexo 部署到服务器
首先在本地完成部署验证,也就是 hexo 三连 (hexo clean/generate/deploy) 是正常的,如果遇到了 hexo g/generate 报错,多看看报错日志,看不懂就拿去喂AI看看。
服务器配置
- 安装 Git:
yum install -y git,如果安装了就可以跳过 - 创建 git 用户用于站点文件同步:
useradd git,可以不设置密码; - 初始化 git 仓库:
# 切换到 git 用户
su git
# 初始化仓库: 创建一个名称为 hexo.git 的裸仓库,如果看不习惯可以自己修改, --bare 选项用于创建一个裸仓库
git init --bare ~/hexo.git
# 创建钩子函数:执行仓库接收更新后执行的自动操作,用于同步之后将站点文件 copy 一份到站点目录
cd ~/hexo.git/hooks/
vim post-receive
git --work-tree=/path/to/webroot --git-dir=/home/git/hexo.git checkout -f
# 赋权
chmod +x post-receive
# 下面是我的配置,仅供参考
git --work-tree=/data/blog --git-dir=/home/git/hexo checkout -f
📝 这里要提前把涉及到的目录创建好哦!
🗒 编辑好之后最好切换到
git用户手动执行一遍看看是否有报错!!
添加公钥
配置 git 用户的 [SSH 免密登录](#SSH 免密登录)。
修改部署配置
修改 hexo 站点配置文件 _config.yml:
deploy:
- type: git
repo: git@hexo:/home/git/hexo
branch: master
远程部署
然后就可以部署到服务器了:
hexo deploy
终端会显示部署信息,如果失败了,注意看终端中的报错信息,挨个挨个解决,毕竟不能保证每个人都会遇到同样的问题,如果要提问,务必提供部署日志。
Nginx 配置
修改 nginx 站点目录为以上设置的目录: /data/blog
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name <DOMAIN_NAME>;
root /data/blog;
# SSL
ssl_certificate /data/nginx/ssl/fullchain.pem;
ssl_certificate_key /data/nginx/ssl/key.pem;
# security
include nginxconfig.io/security.conf;
# logging
access_log /usr/local/openresty/nginx/logs/access_main.log combined buffer=512k flush=1m;
error_log /usr/local/openresty/nginx/logs/error_main.log info;
# additional config
include nginxconfig.io/general.conf;
}
关于 SSL 证书的申请后面再补充。
SSH 免密登录
为什么要配置SSH免密,自然是比密码更好的安全性+便捷性。
本地创建密钥对
-
安装
Git工具; -
打开
Git bash:ssh-keygen -t ed25519 -f "ed25519_git" -C "<MAIL>"-
-t指定密钥类型,rsa|ed25519,ed25519是一种更新、相比rsa更安全的算法,目前新版本ssh-keygen命令默认就是这个类型-
-f指定密钥文件名,默认为id_rsa-
-c添加注释说明,一般用邮箱中间会询问是否输入密码加密,可以选择,但请务必不要忘记!一般直接回车不用密码。
拷贝公钥到服务器
自动拷贝公钥到服务器
ssh-copy-id -i ~/.ssh/ed25519_git.pub <USERNAME>@<HOST>
但是我使用这种方式没有生效,所以选择了手动拷贝。
手动拷贝公钥到服务器
-
查看公钥内容
cat ~/.ssh/ed25519_git.pub -
登录到服务器
-
创建密钥文件
mkdir ·/.ssh vim ~/.ssh/authorized_keys将复制的公钥粘贴进来。
-
设置权限:必须设置正确的权限才会生效
chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh
配置 ssh 配置文件
如果在创建密钥对的时指定了文件名,即不是默认的 id_rsa ,则需要修改本地 .ssh/config 文件指定使用的私钥文件:
vim ~/.ssh/config
config 文件帮忙管理每个会话使用的用户、端口和私钥文件。
说明:
- 配置文件中不区分大小写,
Host和host是一样的 - 通过
tab进行缩进区分配置块 - 所有参数都支持通配符设置,比如将
Host设置为*表示全局配置。 - 没有必须配置的项,根据需要配置即可。
添加内容基本如下:
Host sftp_user
Hostname <IP>
User sftp_user
Port 22
IdentityFile ~/.ssh/ed25519_alicloud
Host配置块,名称自定义,用于之后连接使用,比如这里是sftp_user,之后我要使用这个用户连接服务器就可以直接用ssh sftp_user即可,会自动使用配置的用户、端口和私钥。Hostname服务器地址,IP或域名User登录用户PortSSH 登录端口,默认 22。Identityfile使用的本地私钥文件
还有一些参数并不常用这里不介绍,感兴趣自行搜索:“ssh config配置”。
验证
就ssh看看还需要密码不。
SSL 证书申请
如果不差钱恰巧财力雄厚,可以购买付费证书,可以享受专业的技术服务和支持。
也可以选择和我一样使用免费证书,~~具体申请步骤在站内另一篇文章《Nginx建站指北》有提及,不赘叙了。~~比如使用率最高的免费证书 Let's Encrypt
官方文档就已经提供了详细的申请操作,这里以我使用的 GitHub - acmesh-official/acme.sh: A pure Unix shell script implementing ACME client protocol 为例进行简单说明。
安装
curl https://get.acme.sh | sh -s email=my@example.com
会安装在用户家目录 .acms.sh 下。
自动申请
使用 acme.sh 的最大优势在于自动申请更新证书,因此手动申请方式暂不做说明,有需要可以自行查阅 Wiki。
参照 获取 DNS API 文档根据自己用的 DNS 提供商获取认证 token,已 Cloudflare 为例,需要获取 token 和账户 ID。
-
获取 token 和账户 ID
# For a single domain or multiple domains within the same Cloudflare account export CF_Token="zfNp-Xm0VhSaCNun7dkLzwnw0UN7FNjaMurUZ8vf" export CF_Account_ID="763eac4f1bcebd8b5c95e9fc50d010b4" ./acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'如果顺利,等几分钟之后就会申请成功证书,会显示证书保存位置和证书名。
-
安装证书
以 Nginx为例:acme.sh --install-cert -d *.example.com \ --key-file /path/to/keyfile/in/nginx/key.pem \ --fullchain-file /path/to/fullchain/nginx/cert.pem \ --reloadcmd "/usr/local/openresty/nginx/sbin/nginx -s reload"关于
reloadcmd重载命令,如果没有配置systemd服务或环境变量,可以像上面一样直接绝对路径即可。正常来说 acme 会创建定时任务每天检查证书,快过期的时候会自动续订更新,无需手动介入,但保险起见,建议还是通过
uptime kuma等工具进行监控。
至此基本就完成了从撰写到部署的全部流程,如果后续有补充内容就再说吧。

