Evergarden
Evergarden

我永远喜欢薇妹

Hexo 建站经验

源起

这部分对主题关联不大,可跳过。

搭建一个博客的想法其实很早就有了,也早就确定了要用 hexo,好像也没有特别的理由,最开始是被主题吸引住的(喂喂喂,关注点不对啊),后面也确实花了很多时间换这换那主题的,等到了24年真正决定要上线的时候,才顿悟过来,光顾着美观没有内容岂不是本末倒置,徒有其表了。所以基本也就不折腾了,选了一个好看的主题,慢慢开始充实内容。

Hexo 简介

博客框架很多,老实说,我都建好了好几个其他框架的目录,比如 WorldPresssolo 等,只是太懒了目前的想法还是先专心搞好 hexo,内容有了,换个框架也只是顺手的事。

选择 hexo 的理由如上面提到的:

  • 丰富的主题:这才是入坑理由!
  • markdown 渲染:何人不爱md
  • 轻量:纯静态页面,或许是缺点,也或许是优点

只需要在本地编辑好 Markdown 文档,就可以一步生成部署,非常方便。

Hexo 本地部署

  1. 安装 nodejs ,如果有多版本使用需求其实更建议安装 nvm,我这里就直接安装了 lts 版了;

  2. 安装 hexo 框架包

    npm install hexo-cli -g
    
  3. 初始化博客目录
    进入想要放置博客文件的目录,比如: C:\Projects\hexo ,右键打开 git bashcmd

    # 初始化博客目录,指定博客目录名称,比如 hexo_blog
    hexo init <HEXO_DIR_NAME>
    cd <HEXO_DIR_NAME>
    # 安装依赖包
    npm install
    
  4. 查看默认页面
    完成以上安装后,执行

    hexo server
    

    打开 http://localhost:4000 就可以看到默认的页面了,剩下的工作就是找一个好看的主题创建自己的内容进行丰富了。

  5. 【补充】常用命令
    简要列举几个使用频率很高的命令,基本可以覆盖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 都会要求输入)

1759387694_759547_288741536c36ea0f_u1

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

开启 Gitee Pages

1759387718_022928_20b8ea20c71f064c_u1

Hexo 部署到 Github

基本操作同上:

  1. 在设置添加本地 ssh 私钥;
  2. 创建一个空仓库,将博客根目录下 config.yaml 中 deploy 部分地址修改为仓库地址;
  3. 执行部署

Hexo 部署到服务器

首先在本地完成部署验证,也就是 hexo 三连 (hexo clean/generate/deploy) 是正常的,如果遇到了 hexo g/generate 报错,多看看报错日志,看不懂就拿去喂AI看看。

服务器配置

  1. 安装 Git: yum install -y git ,如果安装了就可以跳过
  2. 创建 git 用户用于站点文件同步: useradd git ,可以不设置密码;
  3. 初始化 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免密,自然是比密码更好的安全性+便捷性。

本地创建密钥对

  1. 安装 Git 工具;

  2. 打开 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>

但是我使用这种方式没有生效,所以选择了手动拷贝。

手动拷贝公钥到服务器

  1. 查看公钥内容

    cat ~/.ssh/ed25519_git.pub
    
  2. 登录到服务器

  3. 创建密钥文件

    mkdir ·/.ssh
    vim ~/.ssh/authorized_keys
    

    将复制的公钥粘贴进来。

  4. 设置权限:必须设置正确的权限才会生效

    chmod 600 ~/.ssh/authorized_keys
    chmod 700 ~/.ssh
    

配置 ssh 配置文件

如果在创建密钥对的时指定了文件名,即不是默认的 id_rsa ,则需要修改本地 .ssh/config 文件指定使用的私钥文件:

vim ~/.ssh/config

config 文件帮忙管理每个会话使用的用户、端口和私钥文件。

说明:

  • 配置文件中不区分大小写,Hosthost 是一样的
  • 通过 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 登录用户
  • Port SSH 登录端口,默认 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。

  1. 获取 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 &apos;*.example.com&apos;
    

    如果顺利,等几分钟之后就会申请成功证书,会显示证书保存位置和证书名。

  2. 安装证书
    以 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 等工具进行监控。

至此基本就完成了从撰写到部署的全部流程,如果后续有补充内容就再说吧。