本地环境

本地Hexo环境搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装 Node.js(版本需≥14)
# 官网下载:https://nodejs.org (选LTS版本)

# 安装 git

# 安装 Hexo
npm install -g hexo-cli

# 创建博客文件夹并初始化
hexo init my-blog

# 进入文件夹 安装 npm
cd my-blog
npm install # 安装依赖包

测试

1
2
3
# 测试本地预览(访问 http://localhost:4000)
hexo g # 生成静态文件(public文件夹)
hexo server

服务器环境

准备服务器环境(Ubuntu)

1
2
3
4
5
6
7
8
9
10
# 登录你的服务器(通过SSH)
ssh root@你的服务器IP

# 安装必要软件,git 和 nginx
sudo apt update
sudo apt install git nginx -y

# 创建网站目录并设置权限
sudo mkdir -p /var/www/hexo
sudo chown -R $USER:$USER /var/www/hexo

配置Git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 在服务器创建 Git 仓库,让git仓库和网站目录分开
mkdir -p /var/repo/

# 创建裸仓库
git init --bare hexo.git

# 创建和修该钩子文件,目的是为了让仓库指向网站目录,推送资源
vim /var/repo/hexo.git/hooks/post-receive

# 在 post-receive 文件中粘贴以下内容:
#!/bin/bash
git --work-tree=/var/www/hexo --git-dir=/var/repo/{自定义仓库名name}.git checkout -f

# 保存后赋予执行权限
chmod +x hexo.git/hooks/post-receive

修改本地Hexo配置

1
2
3
4
5
6
7
8
9
10
11
12
13
#打开本地 Hexo 博客根目录(初始化时创建的 my-blog文件夹)
#找到 _config.yml文件(注意是根目录的,不是 themes下的)
#用文本编辑器(VSCode/记事本++)打开,滚动到最底部
#在 deploy:部分添加以下配置(注意缩进!)
deploy:
type: git
repo: root@你的服务器IP:/var/repo/hexo.git
branch: master

#注意:
#缩进必须用空格!不能使用 Tab 键(YAML语法要求)
#repo:后面的路径必须和服务器创建的裸仓库路径完全一致
#如果服务器SSH端口不是默认22(如2222),需写成:repo: root@IP:2222:/var/repo/hexo.git

安装部署插件 + 测试推送

1
2
3
4
5
6
7
8
9
10
#1.在本地博客目录打开命令行(终端/PowerShell)

#2.安装 Git 部署插件(hexo的上传插件deploy-git):
npm install hexo-deployer-git --save

#3.生成静态文件并推送
hexo clean # 清除缓存
hexo g # 生成静态文件(public文件夹)
hexo d # 部署到服务器
#首次执行会要求输入服务器 root 密码

配置Nginx指向站点

1
2
3
4
5
# 登录服务器(通过 SSH):
ssh root@你的服务器IP

# 修改 Nginx 默认配置:
sudo vim /etc/nginx/sites-available/default

启用配置并重启 Nginx

1
2
3
4
5
6
7
8
9
10
11
12
# 创建符号链接
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default

# 测试配置
sudo nginx -t

# 重启服务
sudo systemctl restart nginx

#访问测试
#浏览器打开 http://你的服务器IP
#看到 Hexo 默认页面即成功

专属配置配置(根据需求修改,需要先申请证书)

1
2
3
4
5
# 创建专属的配置,删除默认配置
sudo vim /etc/nginx/sites-available/hexo

# 创建符号链接
sudo ln -s /etc/nginx/sites-available/hexo /etc/nginx/sites-enabled/hexo
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# Default server configuration - 处理所有未定义域名的请求
server {
listen 80 default_server;
listen [::]:80 default_server;

# 返回 444 状态码(无响应)
return 444;
}

# 主域名重定向配置
server {
listen 80;
server_name yourdomain.me;

# 永久重定向到带 www 的 HTTPS 版本
return 301 https://www.yourdomain.me$request_uri;
}

# www 域名 HTTP 配置
server {
listen 80;
server_name www.yourdomain.me;

# 重定向到 HTTPS
return 301 https://www.yourdomain.me$request_uri;
}

# HTTPS 主配置
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;

server_name www.yourdomain.me;

# SSL 证书配置 - 使用正确的路径
ssl_certificate /etc/letsencrypt/live/yourdomain.me/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.me/privkey.pem;

# SSL 优化设置
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;

# 安全头
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";

# 站点根目录
root /var/www/hexo;

# 添加 index.php 到列表(如果使用 PHP)
index index.html index.htm index.nginx-debian.html;

location / {
# 首先尝试作为文件提供请求,然后
# 作为目录,最后回退到显示 404
try_files $uri $uri/ =404;
}

# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public";
}

# 禁止访问隐藏文件
location ~ /\.(?!well-known).* {
deny all;
access_log off;
log_not_found off;
}

# 自定义错误页面
error_page 404 /404.html;
location = /404.html {
internal;
}
}

# 处理不带 www 的 HTTPS 请求
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;

server_name yourdomain.me;

# 使用相同的 SSL 证书
ssl_certificate /etc/letsencrypt/live/yourdomain.me/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.me/privkey.pem;

# 重定向到带 www 的版本
return 301 https://www.yourdomain.me$request_uri;
}

添加域名

域名解析配置(关键步骤)

阿里云操作流程:

登录 阿里云控制台

进入「云解析 DNS」→ 选择你的域名

点击「添加记录」:

1
2
3
4
记录类型: A
主机记录: @ // 主域名解析(如 yourdomain.com)
记录值: 你的服务器IP
TTL: 10分钟 // 快速生效

再添加一条 WWW 解析:

1
2
3
记录类型: A
主机记录: www // www.yourdomain.com
记录值: 你的服务器IP

解析生效时间:通常 5-30 分钟(全球最长不超过 48 小时)

验证解析是否生效

1
2
3
# 在本地终端执行
dig yourdomain.com +short
# 应返回你的服务器IP

申请免费 SSL 证书(启用 HTTPS)

使用 Certbot 自动获取 Let’s Encrypt 证书:

1
2
3
4
5
6
7
# 在服务器上
# 安装 Certbot
sudo apt update
sudo apt install certbot python3-certbot-nginx -y

# 自动获取证书并配置 Nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

按提示操作:

  1. 输入邮箱(接收证书更新提醒)
  2. 同意服务条款
  3. 选择 2: Redirect(强制所有流量跳转 HTTPS)

证书将自动续期(无需手动管理)

Hexo 配置更新

修改 Hexo 站点配置

编辑 _config.yml

1
2
3
4
# 修改URL配置
url: https://yourdomain.com # ← 重要!包含协议
root: /
permalink: :year/:month/:title/

重建博客并部署

1
2
3
4
5
6
7
8
# 清除旧缓存
hexo clean

# 生成新文件(URL会更新)
hexo generate

# 重新部署(关键步骤!)
hexo deploy

其他配置

用 SSH 密钥免密登录,实现部署免密

本地生成密钥对

1
ssh-keygen -t rsa   # 一路回车,默认存储路径

上传公钥到服务器

1
ssh-copy-id root@你的服务器IP  # 输入一次密码后永久生效

测试免密登录

1
ssh root@IP  # 应直接登录,无需密码

重新部署

1
hexo clean && hexo g -d  # 现在 hexo d 不会要求输密码了

自动化优化:一键部署脚本

在本地博客目录创建deploy.sh,每次只需要在博客的根目录执行./deploy.sh

在 Hexo 博客根目录执行:

1
2
3
4
# 创建并编辑脚本文件(推荐用 VS Code)
touch deploy.sh //创建
chmod +x deploy.sh //添加执行权限
vim deploy.sh //编辑

粘贴以下完整脚本(macos)

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
49
50
51
52
53
#!/bin/bash
# ===== Hexo 博客一键部署脚本 for macOS =====
clear
echo
echo "██████ 开始部署博客进程 ██████"
echo

# ------ 自定义区域 ------
BLOG_URL="https://你的IP或域名" # 修改为你的访问地址
# -----------------------

# 清理缓存
echo
echo "[1/3] 🧹 清理生成缓存..."
hexo clean --silent || {
echo "❌ 清理失败!"
exit 1
}

# 生成静态文件
echo
echo "[2/3] 🏗️ 生成静态页面..."
hexo generate --silent || {
echo "❌ 生成静态文件失败!"
open -a "TextEdit" ./debug.log # 自动打开错误日志
exit 1
}

# 部署到服务器
echo
echo "[3/3] 🚀 部署到服务器..."
hexo deploy --silent || {
echo "❌ 部署失败!尝试修复权限..."
git config --global --add safe.directory $(pwd)
hexo deploy --silent || exit 1
}

# 显示成功信息
TIME_USED=$((SECONDS)) # 计算总耗时
echo
echo "██████████████████████████████"
echo "✅ 部署成功!耗时: ${TIME_USED}秒"
echo "博客地址: $BLOG_URL"
echo "██████████████████████████████"

# 自动打开浏览器
echo
read -p "是否打开浏览器?[y/N] " -n 1 REPLY
if [[ $REPLY =~ ^[Yy]$ ]]; then
open $BLOG_URL
fi

exit 0