从零开始的新博客搭建!


前言

时光真的好快哦!转眼间,我就从学生成为了一名上班族,走上了工作岗位。而我能够从事网络相关的工作,我本人是非常意外的。我想我大概率会成为一名软件研发工程师吧,但我的确做上了网络相关的工作。我想,这的确就是我和网络有缘吧。

经历了刚刚入职时什么都不会、业务做不完需要经常加班的阵痛期,我现在可以拥有更多的时间来思考、学习、输出,况且折腾一个新的blog就是继续熟悉网络、云计算的一个极好现实教程,于是我就有了再开一套博客的想法。我之前的博客是基于Wordpress的,然而即便用了Markdown的插件,也需要对每篇文章进行一些微调。恰好我在2020年暑期基于Github Pages搭建过另一套博客,所以我这次想,能不能再搞一套服务器,点滴记录我工作以后的成长。

那么,就让我们开始吧!

本地搭建Hexo

安装Hexo

第一步就是搭建本地的Hexo。由于我是MacBook,通过Homebrew安装一些前置项即可:

1
2
3
4
5
brew install git
git --version
brew install node
node --version # 应显示 v20.19.0 或更高
npm --version # 应显示 10.x 或更高

如果想要用Homebrew安装最新版的node.js,如下:

1
2
3
4
5
6
7
8
9
10
11
# Download and install Homebrew
curl -o- https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh | bash

# Download and install Node.js:
brew install node@24

# Verify the Node.js version:
node -v # Should print "v24.13.1".

# Verify npm version:
npm -v # Should print "11.8.0".

有一个小坑,如果你的系统里有多个版本的node.js,那么可能用的是老版本的,需要你调整PATH让homebrew安装的node.js优先级最高:

1
2
3
which -a node # 如果你观察到了多个版本,则可能需要调整
echo 'export PATH="/opt/homebrew/opt/node@24/bin:$PATH"' >> ~/.zshrc
soruce ~/.zshrc

接着就可以安装Hexo了:

1
npm install -g hexo-cli

我们可以验证是否安装成功:

1
hexo --version

其输出了版本,证明搭建成功。

本地Hexo初始化

我们找个地方来存放Hexo的文章吧!我想放在/Users/caiguu/Desktop/newblog里,作为我的新博客的本地存储地。

我执行了如下命令:

1
2
3
4
cd ~/Desktop
mkdir newblog
cd newblog
hexo init

按理来说,就会在newblog下新建一个博客了。然而,我遇到了证书过期的报错:

error An unexpected error occurred: “https://registry.npm.taobao.org/hexo: certificate has expired”.

WARN Failed to install dependencies. Please run ‘npm install’ in “/Users/caiguu/newblog” folder.

很显然,这个网址可能不对了。定位是镜像源的问题。我们换个源:

1
2
3
npm config get registry
npm config set registry https://registry.npmmirror.com
npm config get registry #验证是否顺利更换源

这次就没再报错了!看到了成功提示:

这是我们newblog文件夹下能够看到的东西:

接下来,我们让这个博客运行在本地!执行:

1
2
npm install
hexo server

如果成功了,会有下面的显示:

本地Hexo验证

我们打开这个网址看看:

说明本地运行Hexo成功了!

至此,本地的部署就完成了,下面将进行云服务器的配置。

云服务器配置

创建SSH密钥对

我们的云服务器创建后还没登录过,我们可以通过腾讯云默认提供的方案进行登录,不过我想在本地就能远程登录,这样我们可以利用SSH来做。我们先去创建一个SSH密钥对,并下载、保存好私钥,然后用密钥绑定实例。

需要注意的是,绑定密钥对需要在实例关机的情况下操作,因此务必最开始就做好应有的绑定。而且,使用了密钥就不能单纯通过密码来进行登录了。密钥对绑定完之后,我们需要在本地电脑进行如下操作:

1
chmod 400 <私钥文件>

以赋予自己读权限。

于是我们就可以登录了:

1
ssh -i <私钥文件> root@<云服务器IP>

设置完SSH登录,此时就可以安全地访问轻量级服务器了。虽然Cent OS的包管理工具是yum,但是dnf是它的未来。

我们先做一些基础操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 更新系统
dnf update -y

# 安装Git
dnf install git -y

# 安装Nginx
dnf install nginx -y

# 启动Nginx并设置开机自启
systemctl start nginx
systemctl enable nginx

# 如果防火墙开启,需要放行HTTP和HTTPS(不过我的实际没开)
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

创建裸Git

接下来,我们为了能够在服务器上获取并解析出这些页面文件,我们需要创建一个裸Git并设置一个钩子。

1
2
3
4
5
6
7
8
9
# 创建博客文件存放目录
mkdir -p /var/www/hexo

# 创建裸Git仓库
cd /root
git init --bare blog.git

# 创建post-receive钩子
vim /root/blog.git/hooks/post-receive

这个hooks文件是个新文件,我们可以直接用vim进行编辑。

我们先暂且不用管它做了什么,原理会在后面解释。我们还要给这个脚本一个可以执行的权限:

1
chmod +x /root/blog.git/hooks/post-receive

可以看到,已经具备了执行权限。

Nginx配置(测试页面)

接下来我们创建一个nginx配置文件:

1
vim /etc/nginx/conf.d/hexo.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80; # 监听80端口(HTTP)
listen [::]:80; # 同时开启IPv6访问权限
server_name _; # 将此处改为你的域名或服务器IP
charset utf-8;

# 网站根目录,指向我们刚刚创建的目录
root /var/www/hexo;
index index.html; # 默认首页文件

# 访问和错误日志(可选,但推荐)
access_log /var/log/nginx/hexo.access.log;
error_log /var/log/nginx/hexo.error.log;

location / {
try_files $uri $uri/ =404; # 尝试访问请求的文件或目录,否则返回404
}
}

我们可以看到此云服务器的80端口默认开放的:

然后我们去这个默认路径/var/www/hexo里加一个默认页面index.html:

我们执行如下命令:

1
2
nginx -t
sudo systemctl reload nginx

所以我们可以做一下测试:

为什么是这个?因为有默认配置!默认配置存在了/etc/nginx/nginx.conf下面,把默认的这个注释掉,就不会存在冲突了。

不过这至少说明了Nginx服务成功。

注释掉默认配置后,我们的配置就生效了,生效效果如下:

至此,我们确认nginx已经能够顺利显示我们想要的静态页面了。

当然了,如果云服务器申请了IPv6地址,那么在有IPv6 GLA地址的设备上,也是可以通过IPv6进行访问的。对于腾讯云轻量服务器来说,这个地址必须主动申请,之后会给你分配一个GLA地址。想用IPv6进行访问,同时需要你的设备、你所在的网络和云服务器支持。

至此,我们服务器的v4和v6双栈都已经顺利配置了!恭喜!

至于Nginx的结构如何,里面是怎么组织的,后面会单独开一篇博文去讲讲。

博客项目Git与服务器裸Git联动

GitHub项目与本地同步

我们接下来要做的事情就是让本地的Hexo能够同步到服务器上。我们先创建一个GitHub项目:

接着我们在本地把Hexo文件夹设置为Git文件夹。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 进入你的博客目录
cd ~/Desktop/newblog/

# 初始化Git仓库
git init

# 创建.gitignore文件
cat > .gitignore << EOF
node_modules/
public/
.deploy_git/
db.json
*.log
.DS_Store
Thumbs.db
EOF

接着我们配置一下本地Git和远程Git的同步。我已经预先配置了SSH Key来登录GitHub。

1
git remote add origin git@github.com:<我的GitHub账号>/blog.git

是这个,不要搞错哦。可以看到顺利完成了操作:

1
2
3
4
5
6
7
8
9
10
11
# 查看当前文件状态(确认要提交的文件)
git status

# 添加所有文件到暂存区
git add .

# 提交到本地仓库
git commit -m "第一次提交:Hexo博客源码"

# 推送到GitHub(第一次推送需要加 -u 参数)
git push -u origin master

最后看看提交效果:

我们完成了同步,这样以后就可以用GitHub来管理博客内容了。

与云服务器裸Git联动

接着,我们希望能够通过deploy,让云服务器获取到我们需要的静态文件。所以,执行如下操作:

1
2
3
4
cd ~/Desktop/newblog
hexo clean
hexo generate
ls -la public/ # 应该看到 index.html 和其他文件

接着,去Hexo里配置云服务器的信息。编辑_config.yml文件,找到Deployment部分,按照如下配置:

1
2
3
4
5
deploy:
type: git
repo: root@你的服务器IP:/root/blog.git
branch: master
message: "Site updated: {{ now('YYYY-MM-DD HH:mm:ss') }}"

接下来,我们在本地安装一个插件:npm install hexo-deployer-git --save,然后执行hexo deploy,这样以后每次hexo deploy,就会自动同步更新到云服务器上了!

当然,为了方便,我配置了~/.ssh/config,把密钥对的文件路径指定,这样以后只要在本用户下,无论哪个终端应用,都可以直接登录到云服务器上去了。

我们的联动配置大成功!

第一篇Hexo博文

如你所见,这就将是我们的第一篇博文。

这篇文章我预先在本地写的,我们先在Hexo里创建这篇文章。

1
hexo new post "文章名"

我们还做了一些其他的基础配置,例如将URL方式按照分类进行组织,而非按照日期。

就这样,第一篇博文也就是我搭建这个博客的经历啦,欢迎大家常来看看!


文章作者: Jack Zhang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Zhang !
  目录