Hexo + Nginx 个人博客部署简易教程

前言

建站不难,但作为新手,将 Hexo 部署到 Nginx 的过程中花了我一下午时间,尤其是配置环节。网上的中文教程比较分散,所以我决定整理这篇简单的教程,希望能帮你节省时间。

开始之前的提醒:记得检查网络

如果你通过 SSH 连接远程服务器时,配置明明正确却始终连接失败,可以尝试为 SSH 指定一个新的端口。某些网络环境(如作者的校园网)会劫持 22 端口(SSH 默认端口)。修改 SSH 端口即可解决这个问题。


一、安装 Hexo 环境

1.1 安装 Node.js

访问 Node.js 官网 下载对应系统版本并安装。

验证安装

1
npm -v

如果提示”命令未找到”,需要手动将 Node.js 添加到系统环境变量中。

1.2 安装 Git

访问 Git 官网 下载对应的安装包,安装过程一直下一步即可。

验证安装

1
git --version

1.3 安装 Hexo CLI

在命令行中执行:

1
npm install -g hexo-cli

验证安装

1
hexo -v

二、创建你的静态博客

命令参考 Hexo 官方文档

2.1 初始化项目

1
2
3
hexo init 你的博客文件夹名称
cd 你的博客文件夹名称
npm install

这会自动下载依赖并初始化你的项目,默认主题是 landscape,可更换。

2.2 配置站点信息

项目根目录下的 _config.yml 是站点配置文件。

配置说明查看 Hexo 配置文档

2.3 创建文章

1
hexo new [布局(可省略)] "文章标题"

布局类型

  • post:正式文章(默认)
  • page:独立页面
  • draft:草稿

若省略布局,则按_config.yml中的default_layout配置。
示例

1
hexo new "我的第一篇博客"

2.4 编辑文章

生成的post位于 source/_posts/ 目录下,自行编辑即可。

草稿在 source/_drafts/ 目录,默认不会在博客网站中显示。

你现在可以自行编辑你的文章。

发布草稿

1
hexo publish "草稿标题"

发布草稿,会将draft转换为post,同时按照_config.yml的设置,自动重命名。

2.5 生成静态文件

1
2
hexo clean   # 清理旧文件
hexo generate # 生成静态网站(可简写:hexo g)

生成的静态文件在主目录下的 public/ 目录,这就是你的可部署的博客网站文件。

2.6 本地预览

1
hexo server   # 简写:hexo s

在浏览器中访问 http://localhost:4000 即可预览你的博客。


三、部署到 Nginx 服务器

部署流程概览

  1. 安装 Nginx
  2. 上传静态网站文件
  3. 配置 SSL 证书(可选,用于 HTTPS)
  4. 修改 Nginx 配置文件
  5. 配置防火墙规则
  6. 重启 Nginx 服务

以下以 Ubuntu 24.04 LTS 系统为例。


3.1 安装 Nginx

1
2
sudo apt update
sudo apt install nginx -y

安装完成后:

  • Nginx 配置文件位于 /etc/nginx/
  • 默认的示例网站位于 /var/www/html/

3.2 上传静态文件

将 Hexo 生成的 public/ 目录下的所有文件上传到服务器(可自定义位置,建议放在 /var/www/ 下),上传后记得检查文件权限,至少要让www-data(nginx的默认用户)能够访问。

自动化部署脚本(Windows .bat):

如果觉得每次更新都要手动打指令麻烦,可以用我的脚本,将脚本保存为.bat格式,放在 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
@echo off
chcp 65001 >nul

:: 可更改参数(在此处修改你的配置)
set PORT=你的端口
set USER=你的用户(建议root)
set IP=你的服务器IP
set DIR=你的网站上传目录(建议在/var/www/下)

echo.
echo ========================================
echo 部署 Hexo 博客(SCP + %PORT% + %USER%)
echo ========================================
echo.
cd /d %~dp0
echo 1. 正在清理并生成静态文件...
call hexo clean
call hexo generate
echo.
echo 2. 正在上传到服务器(端口 %PORT%,自动信任主机)...
scp -P %PORT% -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -r ./public/* %USER%@%IP%:%DIR%
if %errorlevel% equ 0 (
echo.
echo 3. 正在设置文件权限...
ssh -p %PORT% -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL %USER%@%IP% "chown -R www-data:www-data %DIR% && chmod -R 755 %DIR%"
echo.
echo 部署成功!自动打开浏览器
timeout /t 1 >nul
start http://%IP%
) else (
echo.
echo 上传失败!请检查密码或网络
)
echo.
pause

3.3 上传 SSL 证书(可选)

如果需要配置 HTTPS,需要上传证书文件,你也可以自行修改证书存放的位置:

1
2
3
4
5
# 上传 .crt 证书文件
scp -P 端口号 你的证书.crt 用户名@服务器IP:/etc/ssl/certs/

# 上传 .key 私钥文件
scp -P 端口号 你的证书.key 用户名@服务器IP:/etc/ssl/private/

Windows 批处理脚本上传SSL.bat):

1
2
3
4
5
6
7
8
9
@echo off
chcp 65001 > nul
echo 正在上传 SSL 证书文件...

scp -P 端口号 证书路径/你的域名_bundle.crt 用户名@服务器IP:/etc/ssl/certs/
scp -P 端口号 证书路径/你的域名.key 用户名@服务器IP:/etc/ssl/private/

echo 上传完成!
pause

3.4 配置 Nginx

nginx的主配置位于 /etc/nginx/nginx.conf ,这里存放了全局配置。
为了让主配置文件易读,可以include指定目录,用于向主配置中导入子配置目录,子配置目录下的各个子配置单独维护自己的配置信息,以拆分整体配置的复杂度。
主配置文件默认include了 /etc/nginx/sites-enabled/*/etc/nginx/conf.d/*.conf

现在开始配置
在有效的配置目录下,创建新的配置文件(例如创建 /etc/nginx/sites-enabled/hexo),或直接编辑 /etc/nginx/sites-enabled/default

配置一:HTTP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
server_name example.com www.example.com; # 替换为你的域名或服务器 IP,用空格分隔

root 你的网站目录; # 网站文件路径
index index.html index.htm;

location / {
try_files $uri $uri/ =404;
}

# 可选:启用 Gzip 压缩 ,不启用的话将下面两行删除即可
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
}

配置二:HTTPS

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
# HTTP 自动跳转 HTTPS
server {
listen 80;
server_name example.com www.example.com; # 替换为你的域名,空格分隔
return 301 https://$server_name$request_uri;
}

# HTTPS 配置
server {
listen 443 ssl http2;
server_name example.com www.example.com; # 替换为你的域名,空格分隔

# SSL 证书配置
ssl_certificate /etc/ssl/certs/你的证书.crt; #修改为你的证书实际存放位置
ssl_certificate_key /etc/ssl/private/你的私钥.key; #修改为key实际存放位置

# SSL 安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

root /var/www/你的网站目录;
index index.html index.htm;

location / {
try_files $uri $uri/ =404;
}

# 启用 Gzip 压缩,不启用的话将下面两行删除即可
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
}

3.5 配置防火墙

开放 HTTP(默认80) 和 HTTPS (默认443)端口:

1
2
3
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload

如果你使用云服务器,记得检查云服务的防火墙设置。


3.6 启动 Nginx

检查配置文件语法

1
sudo nginx -t

重启 Nginx 服务

1
sudo systemctl restart nginx

设置开机自启

1
sudo systemctl enable nginx

3.7 访问你的博客

在浏览器中输入你的域名或服务器 IP 地址。


常见问题

404:如果你确定文件正确存在,那么一般是由于上传后,网站文件的所有者为root,www-data无权访问导致的,设置权限即可。