hexo + vps 搭建个人博客
本文最后更新于:2024年12月14日 凌晨
1. 前言
从昨天开始心血来潮,想搭一个个人的博客网站。看过很多方案,最后综合考虑选择了hexo
+vps
。
2. 在Windows上安装hexo
参考以下文章:
GitHub Pages + Hexo搭建个人博客网站,史上最全教程
2.1 安装node.js
到node.js官网上下载适合的文件并安装,我选则的版本是windows installer(.msi)
的64-bit。
安装选项全部默认,一路点击next。
最后安装好之后,按Win+R
打开命令提示符,输入node -v
和npm -v
,如果出现版本号,那么就安装成功了。
如果没有梯子的话,可以使用阿里的国内镜像进行加速。
1 |
|
2.2 安装git
为了把本地的网页文件上传到github上面去,我们需要用到分布式版本控制工具——Git。
安装选项还是全部默认,只不过最后一步添加路径时选择Use Git from the Windows Command Prompt
,这样我们就可以直接在命令提示符里打开git了。
安装完成后在命令提示符中输入git --version
验证是否安装成功。
下面我们来生成密钥SSH Key。我们右键打开git bash,输入下面的命令
1 |
|
我参考的教程是Hexo + Github的方案,上面的用户名和邮箱是注册Github使用的邮箱。不过我在自己的VPS上搭建,不知道用户名和邮箱是否可以任意填写。
生成SSH Key:
1 |
|
生成的密钥在用户的.ssh
目录下面,比如我的在C:\Users\dabod\.ssh
下。用记事本打开该目录下的id_rsa.pub
文件,可以得到ssh-rsa
开头以邮箱名结尾的一串字符。这个以后会用到。
2.3 安装Hexo
在合适的地方新建一个文件夹,用来存放自己的博客文件,比如我的博客文件都存放在C:\Users\dabod\Blog
目录下。
定位到该目录下,在空白处按shift
+鼠标右键
,选则在此处打开powershell窗口
。在弹出的窗口中输入npm install -g hexo-cli
安装Hexo。会有几个报错,无视它就行。
安装完后输入hexo -v
查看版本,验证是否安装成功。
然后就要初始化我们的网站。输入hexo init blog
初始化文件夹(blog是文件夹名,可以选其他),会在该目录下生成一个blog文件夹,然后我们进入blog文件夹cd blog
,然后执行npm install
来安装必要的组件。
可以先尝试本地启动。执行hexo g
和hexo s
,然后浏览器访问http://localhost:4000,就可以看到一个简陋的Hexo主页。我们以后再慢慢完善它。在命令窗口按(两次)ctrl + c
退出。
3. vps上的部署
参考以下的文章:
3.1 git和nginx安装
我的VPS使用的是Debian10系统,不同的系统相关命令可能会略有不同。
ssh连接到vps的后台,我是用root用户登录的。首先执行以下命令保证系统和apt列表完全更新:
1 |
|
然后安装git和nginx:
1 |
|
可以用git --version
和nginx -v
来查看版本确保安装正确。
我们可以先启动nginx服务来试试看:
1 |
|
为确保每次VPS重启之后都能自动运行nginx服务,运行:
1 |
|
在nginx服务启动之后,在浏览器中访问IP地址进行确认,如无意外,可以看到Welcome to nginx页面。
3.2 配置nginx
可以在/var/www/blog
目录下创建blog
文件夹(可以自己命名),我们的网页相关的文件就放在这里。
下面我们配置对nginx进行一些配置。
1 |
|
下面是修改后default文件的内容:
1 |
|
在配置完nginx之后,可以用nginx -t
命令检查是否出错。执行下面的命令重启nginx服务:
1 |
|
3.3 Git相关配置
创建git用户,并赋予sudo权限:
1 |
|
然后在root ALL=(ALL) ALL
下面添加:
1 |
|
之后改回权限:
1 |
|
切换git用户并且进入git用户目录:
1 |
|
配置ssh:
1 |
|
之后在自己的电脑上测试是否可以登录(可能需要输入密码):
1 |
|
- 默认22端口,不是则需要在后面加上
-p 端口号
。 - WARNING: REMOTE HOST IDENTIFICATION HAS
CHANGED!是以前配置过主机,需要进行删除
.ssh
文件夹下面的known_hosts
文件。
3.4 创建git裸库
回到git目录并且使用git用户创建git裸仓库
1 |
|
检查blog.git
, .ssh
,
blog
目录的用户组权限是否都为git:git
:
1 |
|
如果不是,则执行如下命令赋予权限:
1 |
|
1 |
|
3.5 使用git-hooks同步网站根目录
使用一个钩子文件:post-receive
,当git仓库接收到内容的时候,就会自动调用这个钩子,把内容同步到网站根目录。注意以下内容最好切换到git用户执行,不然用root用户执行可能会出现权限问题。
切换到hooks目录下执行:
1 |
|
创建文件 1
$ vim post-receive
添加如下内容:
1 |
|
保存后,执行下面的命令赋予权限:
1 |
|
3.6 连接本地与vps
配置本地hexo的_config.yml文件,位置在创建博客的文件夹下面,比如我是在C:\Users\dabod\Blog\blog
目录下。在该文件最后的deploy处进行如下修改:
1 |
|
同步到服务器(在blog文件夹内打开命令窗口执行):
1 |
|
其中hexo clean
作用是清楚缓存,每次修改博客相关配置之后执行,hexo g
作用是生成静态网页,hexo d
的作用是上传到服务器,之前用到的hexo s
的作用是打开本地服务器,打开后在localhost:4000
就可以看到博客的效果。hexo g
和hexo d
可以合并成hexo g -d
。
如果网站没有变动,可以尝试检查钩子文件post-receive
是否执行,若否可能是权限的问题。
如果出现error: spawn failed...
的错误,可以参考下面的方法尝试解决:
hexo发生error:spawn failed错误的解决方法
简单地说,就是先删除.deploy_git
文件夹,再执行:
1 |
|
之后依次执行hexo clean
、hexo g
、hexo d
。
成功之后可以在浏览器输入vps的ip地址来访问网页。
4. 域名解析及HTTPS配置
在域名网站上添加两条记录,分别是@
和www
,记录值都为vps的IP地址。过一段时间可以尝试在浏览器中输入域名访问。不过目前还不支持https访问,所以下面我们添加ssl证书。主要参考
简单地说就是在域名网站上申请证书,下载证书,然后将证书文件上传到vps服务器中,再对nginx进行相关配置。我使用的是腾讯云域名,所以使用下面的布置:
在 SSL
证书管理控制台 中选择需要安装的证书并单击下载
。在弹出的
“证书下载” 窗口中,服务器类型选择
Nginx
,单击下载
并解压缩
cloud.tencent.com
证书文件包到本地目录。
解压缩后,可获得相关类型的证书文件。其中包含
cloud.tencent.com_nginx
文件夹,内容如下:
cloud.tencent.com_bundle.crt
证书文件
cloud.tencent.com_bundle.pem
证书文件(可忽略该文件)
cloud.tencent.com.key
私钥文件
cloud.tencent.com.csr
CSR 文件
CSR 文件是申请证书时由上传或系统在线生成的,提供给 CA 机构。安装时可忽略该文件。
使用 “WinSCP”登录 Nginx 服务器。WinSCP为本地与远程计算机间的复制文件工具,也可以用别的,我用的是mobaxterm。
将已获取到的 cloud.tencent.com_bundle.crt
证书文件和
cloud.tencent.com.key
私钥文件从本地目录拷贝到 Nginx
服务器的 /etc/nginx
目录(此处为 Nginx
默认安装目录,请根据实际情况操作)下。
远程登录 Nginx
服务器,仍然编辑/etc/nginx/sites-available
目录下的default
文件,添加443监听端口和上传后的证书位置,修改后如下:
1 |
|
通过执行以下命令验证配置文件问题。
1 |
|
通过执行以下命令重载nginx:
1 |
|
执行成功后就可以用https访问博客网站了,比如我的博客网站地址是https://www.zhouw.top。
5. 后记
到此为止我们已经可以在任意一台网络设备上输入域名访问自己的网页了。至于网页的具体配置,包括主题、创建文章、添加阅读统计、添加评论功能等等,还需要慢慢优化。
其实本来想用Gridea配合github或者gitee来搭建网页的,但Gerida的上传功能好像一直有点问题,网页一直没法正确渲染。然后我尝试在vps上使用LNMP+WordPress的方案,但这又太复杂了,直接劝退。后来决定用Hexo+github pages,实际上手之后发现没有自己想的那么复杂。可惜github在国内的访问始终有点问题,想转到gitee上,但网页没法更新,不知道是什么问题。于是尝试用vercel加速github pages的访问,但是vercel也有点问题,好像是被墙了。最终确定hexo+vps的方案,过程比用github要复杂一点,不过学到了很多知识,最终真的成功访问还是很有成就感的。