Ubuntu环境下nginx部署hexo博客

之前我的hexo博客都是部署在github的pages上的,使用域名是touhouxingchen.github.io,但是弊端是这个域名是在国外的,很不方便其他人在国内访问,gitee的pages服务也暂停了(疑似永久暂停),腾讯云的EdgeOne pages用过一段时间,尽管能用,但是非常不成熟,经常无法照常更新,有很多bug。索性用了之前为了玩MC买的一个Ubuntu服务器,直接把博客部署到服务器上

核心思路

  1. Web 服务器托管静态文件:用 Nginx 托管 Hexo 生成的 public 目录。
  2. Git 仓库 + 钩子实现自动化:服务器创建裸仓库(Bare Repo),通过 Git Hook 在收到 push 时自动同步文件到 Nginx 目录。
  3. Hexo 本地一键部署:修改 Hexo 配置,直接 hexo d 将博客推送到服务器。

一、nginx的安装与使用

此步骤在服务器上进行

1. nginx的安装

1
sudo apt install nginx -y

2. nginx运行http服务

/etc/nginx/sites-available下创建一个名为my_site的文件

my_site

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;

server_name touhouxingchen.fun;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;

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

server_name后面填你的域名,没有域名填IP就行

root后面是你网站的根目录,可以自己创建一个

最好赋予网站根目录读写权限

1
sudo chmod 777 /var/www/html

然后在 /etc/nginx/sites-enabled下面创建一个符号链接到刚刚创建的my_site

1
sudo ln -s /etc/nginx/sites-available/my_site /etc/nginx/sites-enabled

完成上述准备后,运行

1
sudo nginx -t

检查配置文件是否可以正常运行:

image-20250314232654532

如果显示successful就可以重启nginx

1
sudo systemctl reload nginx

再访问你的网址(如果是腾讯云买的服务器,别忘了允许80端口通过)

显示的网站应该是

image-20250314233953471

代表nginx成功运行了http服务

3. nginx运行https服务

https需要申请SSL证书,我这里用的腾讯云的免费证书(当然可以有别的方案,例如 Let’s Encrypt等)

下载证书

image-20250314234913926

创建/etc/nginx/ssl,把crt文件和key文件放进里面

1
2
3
cd /etc/nginx
sudo mkdir ssl
sudo chmod 777 ssl

参考腾讯云官网给的教程配置ssl证书https://cloud.tencent.com/document/product/400/35244

更改my_site中的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 80;
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name touhouxingchen.fun;
#请填写证书文件的绝对路径。此路径仅供参考,具体请您按照实际目录操作
ssl_certificate /etc/nginx/ssl/touhouxingchen.fun_bundle.crt;
#请填写私钥文件的绝对路径。此路径仅供参考,具体请您按照实际目录操作
ssl_certificate_key /etc/nginx/ssl/touhouxingchen.fun.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
}
}

重新运行nginx后,可以成功访问网站

二、git环境部署

此步骤在服务器上进行

1. 服务器配置Git仓库

1
2
3
4
5
6
7
# 安装git
sudo apt install git -y

# 创建裸仓库(用于接收 Hexo 推送)
mkdir -p ~/hexo-repo.git && cd ~/hexo-repo.git
git init --bare
git config --global init.defaultBranch main

2. 服务器配置Git Hook

创建脚本 ~/hexo-repo.git/hooks/post-receive

post-receive

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
TARGET="/var/www/html"
GIT_DIR="/home/lighthouse/hexo-repo.git"
BRANCH="main"

while read oldrev newrev ref
do
if [[ $ref = refs/heads/$BRANCH ]];
then
echo "Deploying $BRANCH to $TARGET..."
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
# 更新文件权限
chmod -R 755 $TARGET
echo "Deployment completed."
fi
done

当然路径要根据实际情况填写

赋予脚本执行权限

1
chmod +x ~/hexo-repo.git/hooks/post-receive

3. 上传公钥到服务器

本地生成密钥

1
ssh-keygen -t ed25519

用git bash运行(不能用windows的命令行,没这个命令)

1
2
# 上传密公钥到服务器
ssh-copy-id lighthouse@touhouxingchen.fun

然后ssh测试,理论来说上传公钥之后不需要输入密码就可以ssh进去

image-20250315020734929

三、hexo配置修改

本文默认已经安装过了hexo并成功在github的pages上部署。如果这一步没做好可以参考我朋友写的这篇hexo搭建博客,或者是在csdn上找一篇

先把服务器上 /var/www/html文件夹清空

1
rm -rf /var/www/html/*

在source文件夹里创建CNAME文件,内容是你的域名(我的是touhouxingchen.fun)

image-20250315021823048

1. _config.yml更改

url改成服务器的域名

image-20250315022033180

git deploy改成:用户名@域名:/home/username/hexo-repo.git

image-20250315022124009

2. 备案号悬挂

如果是自己买的国内的域名,是需要备案的,其中要求悬挂备案号。

${Blog_root}/node_modules/hexo-theme-butterfly/layout/includes/footer.pug下作如下改动:(Blog_root指你博客的目录)

image-20250315022452912

3. deploy测试

1
2
hexo g
hexo d