将Hexo部署至云服务器
经过好几天的忙里偷闲,总算是将Hexo部署到云服务器上了,为了防止以后忘记,遂在此记录,以防万一,顺便给大伙提供一点帮助
事前准备
一台有公网IP的云服务器(最好是直接安装带Docker的系统)、注册域名并备案(可以先没有,不影响部署,之后想上线再弄,但域名备案需要8~20个工作日,着急的建议先申请备案)、了解基本的linux命令(起码要会cd和vim)
推荐
雨云 - 新一代云服务提供商,我之前一直在用他的NAT网络的服务器,价格很便宜,虽然没有公网IP,但使用端口映射也可以实现大部分的需求了,并且还免费提供二级域名。
地址:雨云官网
邀请码:MzgwODIy (使用邀请码可获得首月5折优惠券,1核1G的服务器首月券后仅需9元)
此外,雨云支持试用,1元试用1天,试用后可继续使用新人优惠购买服务器或续费使用的服务器。
又拍云 - 加速在线业务 - CDN加速 - 云存储
地址:又拍云官网
注册完实名认证之后会送61元的代金券,代金券自动抵扣消费,比如你想用云存储当图床,就直接创建使用即可,费用会自动从代金券中扣除
另外只需在网页底部悬挂又拍云拍云 LOGO 及链接,就可以申请又拍云联盟,会送一年的代金券,每年都可以申请。
思路
- 本地安装git、hexo,修改配置、主题、写笔记什么的都在本地完成
- 服务器安装git、创建个git仓库、配置密钥、钩子函数
- 本地从github把hexo代码拉取下来,之后每次修改后调用的hexo deploy命令就会自动将上传到服务器的git仓库,服务器端的git仓库再用钩子函数将本地上传的静态文件部署到指定目录
工作原理以及部署步骤什么的这个大佬的博客写的很好,我当时就是按照他来的基于Hexo的静态博客网站搭建并部署至云服务器 | Cream薄荷糖 (creammint.github.io),不过其中可能会因人而异出现一些问题,我在此记录了我出现的问题以及解决方法。
开始部署
在本地计算机安装Git
为了在本地进行hexo clean && hexo generate && hexo deploy,并用Git的钩子函数只将静态文件部署到服务器,减少服务器的占用。
当然,如果你租的服务器性能够好,那就直接在服务器上安装hexo,然后把自己本地写好的md文件上传到_posts文件夹,在服务器上运行这些命令即可,也省得换了电脑还得重新配置密钥。
这个网上一堆教程,我就不细说了,留个大佬的链接:windows安装git(全网最详细,保姆教程)_windows 安装git-CSDN博客
创建git用户
打开Git Bash,依次输入以下命令
1 | git config --global user.email "xxx@xxx.com" # xxx@xxx.com改为邮箱 |
此处的邮箱和用户名用于标识是哪位用户提交的代码,起个自己喜欢的名称即可,邮箱最好是真实的邮箱
在本地计算机安装Node.js和npm
前往官网下载较新的LTS(即长期支持)版本并安装,Hexo官方要求Node.js 版本需不低于 10.13,建议使用 Node.js 12.0 及以上版本,Node.js安装过程中会一并将npm包管理工具安装至本地。安装完成后可以在Git Bash或cmd中输入 node -v 和 npm -v 查看版本。
在本地计算机安装Hexo
官方文档:文档 | Hexo
创建个文件夹,用户安装Hexo,例如
D:\MyBlog
,进入该文件夹,右键打开Git Bash,输入以下命令安装Hexo1
npm install -g hexo-cli hexo-server
本地初始化博客站点
1
2hexo init # 会在当前文件夹从GitHub克隆项目并下载依赖
npm install hexo-deployer-git --savehexo init
后可以跟随参数,如hexo init blog
这样就会多一层目录:D:\MyBlog\blog
hexo-deployer-git
为自动部署至远程git仓库的插件,用于把我们在本地生成的静态网站页面push到服务器上。显示如下即安装成功:
初始化后目录结构如下:
这里有一些比较重要的文件或文件夹:
_config.yml
文件:站点的配置文件source
文件夹:存放需要进行渲染的文件,该目录下的 _post 文件夹内存放我们写的博文themes
文件夹:存放主题及其配置文件
测试:Git Bash输入命令
1
hexo s
打开浏览器,输入地址
http://localhost:4000
,显示以下页面即本地部署成功。Git Bash按下Ctrl + C
停止服务
连接服务器
使用Xshell或者其他软件连接服务器,我使用的是WindTerm,开源免费,在此放个链接WindTerm官网 (winterm.org)。
登录服务器的用户名初始为root,密码为自己当时设置的,忘了的话在服务器管理中重置密码或者直接重装系统(服务器没怎么用过的话),重装的时候也会让你重新设置密码。
若还是连接不上则需要查看防火墙,有没有添加规则,放行22端口。
查看是否安装了Git
1 | git --version |
若显示如下则无需再次安装GIt
1 | git version 1.8.3.1 |
若未安装则进行安装
1 | yum install -y git # CentOS使用yum安装,Debian使用apt-get安装 请自行查找命令 |
添加git用户
root用户默认的权限过大,出于安全考虑,我们为服务器添加一个名为git的用户,用于将博客自动部署至服务器上(不需要主动切换到git用户,我们所有的操作都用root用户即可)。
1
2useradd git #添加名为git的用户
passwd git #修改git用户的密码此处可能遇到密码过于简单,无法创建用户的问题:跳转至问题一
为git用户授予sudo权限,用WindTerm打开 /etc 目录下的 sudoers 文件,在 root ALL=(ALL) ALL 语句下添加 git ALL=(ALL) ALL ,如图所示。
或者在/etc/sudoers.d目录下,新建usergit文件,添加
git ALL=(ALL) NOPASSWD:ALL
并保存,效果一样1
2vim /etc/sudoers.d/usergit
git ALL=(ALL) NOPASSWD:ALL
为git用户添加SSH密钥
若不添加SSH密钥,那么本地计算机对服务器的git仓库进行的所有操作都需要输入密码,我们可以通过为git用户添加SSH密钥的方式来实现免密登录。
本地计算机在任意位置打开
Git Bash
,输入以下命令生成密钥1
ssh-keygen
按三次Enter即可生成密钥
进入
C:\Users\用户名
里面有.ssh目录,里面的id_rsa.pub就是我们需要的文件服务器中进入
/home/git
目录,创建.ssh目录,并新建名为authorized_keys的文件,将id_rsa.pub的内容复制进去并保存1
2
3cd /home/git
mkdir .ssh
vim authorized_keys为公钥文件和文件夹设置读写权限
1
2chmod 600 /home/git/.ssh/authorized_keys
chmod 700 /home/git/.ssh将.ssh文件夹及其内的文件所有权移交给git用户
1
chown -R git:git /home/git/.ssh
在本地计算机测试是否可以用ssh免密登录服务器。打开Git Bash
1
ssh -v git@xxx.xxx.xxx.xxx #git@后填写服务器的公网ip
第一次免密登录会提示让你输入yes/no,输入yes即可,之后就不需要输入yes了,显示以下内容即免密登录成功
1
Last login: Tue Jun 18 15:21:51 2024 from 111.194.209.107
若之前使用过ssh连接过此服务器,但是重装系统了,那么会报错:跳转至问题二
服务器创建Git仓库并配置自动部署
这里的Git仓库(repository)可以理解为一个存放着不同版本代码的代码库,包含了项目所有的源文件和版本控制信息。但我们在这里需要用到的是裸库,即仅包含版本控制信息的仓库。后者不保存文件,常用作服务器仓库,实现数据共享和同步。
自动部署的核心在于git-hooks(钩子),可以理解为一种脚本,在特定条件下触发时会调用钩子并执行钩子文件中的内容。
创建并进入自己想初始化git仓库的目录
1
2
3mkdir -p /home/repo
cd /home/repo
git init --bare hexo-blog.git #创建一个名为blog的仓库,--bare参数为创建裸库进入
/home/repo/hexo-blog.git/hooks
目录,找到post-receive
文件(若无则创建),在里面输入git --work-tree=/home/blog/hexo --git-dir=/home/repo/hexo-blog.git checkout -f
(work-tree为hexo的部署目录,git-dir为Git仓库的目录)1
2
3cd /home/repo/hexo-blog.git/hooks
vim post-receive
mkdir -p /home/blog/hexo这里我们使用的是
post-receive
钩子,当Git收到push请求的时候就会调用这个钩子。这个钩子中添加的语句执行的操作为:删除hexo部署目录中原有的文件,然后将Git仓库中的内容clone至hexo部署目录下。这样我们在本地更新博客并且执行部署命令后,网页文件会被push至服务器的Git仓库内,钩子文件则会将Git仓库内的网页文件复制到hexo部署目录下,从而实现自动部署功能。为钩子文件及Git仓库目录配置权限。这里需要将我们创建的仓库及部署目录的所有权移交给git用户,因为linux下创建文件时默认只有拥有者(即创建者)才具有读写权限,而Git进行push操作时登录的用户为git用户。
1
2
3chmod +x /home/repo/hexo-blog.git/hooks/post-receive #为钩子文件授予可执行权限(+x)
chown -R git:git /home/repo #将仓库目录的所有权移交给git用户
chown -R git:git /home/blog/hexo #将hexo部署目录的所有权移交给git用户修改本地Hexo的配置文件_config.yml
1
2
3
4deploy:
type: git
repo: git@yourIP:/home/repo/hexo-blog.git
branch: master
安装Nginx
安装nginx所需的依赖,gcc-c++为编译nginx源码所需的编译器;pcre为正则表达式的支持库;zlib为压缩算法的支持库;Nginx支持http与https协议,如需实现https协议需要用到openssl库。
1
2
3
4yum install gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel进入Nginx官网,查看稳定版nginx的版本号,并在终端中输入指令下载nginx的源代码。这里以1.26.1版本为例。
1
2wget -c http://nginx.org/download/nginx-1.26.1.tar.gz #用wget命令下载源代码的压缩包
tar -zxvf nginx-1.26.1.tar.gz -C /usr/local #解压压缩包至/usr/local目录下若服务器下载过慢可以在本地计算机下载,然后上传至服务器
进入解压后的目录执行配置文件
1
2cd /usr/local/nginx-1.26.1
./configure --with-http_ssl_module #http_ssl_module为https模块编译安装nginx
1
make && make install
默认安装目录为
/usr/local/nginx
。进入nginx的sbin目录,启动nginx。注意,启动成功后在终端中不会显示任何信息,而在已启动nginx的情况下再次试图启动会显示错误信息(可据此粗略判断nginx是否启动)。1
2
3cd /usr/local/nginx/sbin
./nginx -v #显示nginx版本号,说明安装成功
./nginx #启动nginx测试,启动后在浏览器地址栏中输入
http://你的服务器ip:80
即可看到nginx的欢迎页面,如图所示。将nginx添加至环境变量,否则只能在sbin中使用nginx命令,在
/etc/profile
文件的结尾添加以下代码1
2export NGINX_HOME=/usr/local/nginx
export PATH=${NGINX_HOME}/sbin:$PATH在任意位置输入nginx -v,出现以下结果则环境变量添加成功
1
nginx version: nginx/1.26.1
nginx常用命令
1
2
3nginx -s stop # 停止nginx
nginx -s reload # 重载nginx,修改配置文件后使用
nginx -t # 检查配置文件语法是否有错误,常用于修改配置文件后的检查
配置Nginx反向代理
可以根据最开始那个教程直接修改nginx.conf,不过最好还是另建个vhost目录,再使用include导入到nginx.conf,这样方便管理
进入
/usr/local/nginx/conf
,创建vhost目录,进入vhost,创建hexo-blog.conf文件1
2
3
4cd /usr/local/nginx/conf
mkdir vhost
cd vhost
vim hexo-blog.conf写入以下内容:
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
31server {
listen 80;
# 服务器公网IP
server_name 123.123.123.123;
# 项目的部署地址
root /home/blog/hexo;
location /{
}
# 以下配置是绑定SSL证书时使用的,若域名没备案就先不填,使用上面的就行了
# listen 443 ssl;
# 请填写绑定证书的域名
# server_name huochairener-blog.cn;
# 部署ssl使用的参数
# if ($server_port !~ 443){
# rewrite ^(/.*)$ https://$host$1 permanent;
# }
# 请填写证书文件的相对路径或绝对路径
# ssl_certificate /xx/xx/xxxx.crt;
# 请填写私钥文件的相对路径或绝对路径
# ssl_certificate_key /xx/xx/xxx.key;
# ssl_session_timeout 10m;
# 请按照以下协议配置
# ssl_protocols TLSv1.2 TLSv1.3;
# 请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
# ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
# ssl_prefer_server_ciphers on;
}检查语法,并重载nginx
1
2nginx -t # 一般报错信息很明确,翻译一下就行。若不知道就查查,或者看看文件里有没有多余的空格
nginx -s reload
至此,Hexo已成功部署至云服务器,后续的后台管理系统Qexo、评论系统Waline的部署请看我站内的其他文章。
我使用的是butterfly主题,可自行根据网上的教程配置,如【Hexo】Hexo搭建Butterfly主题并快速美化_hexo butterfly-CSDN博客
实现https访问需要域名备案并申请SSL证书,证书不要去买,就用免费的就行,每三个月续期一次(重新申请并部署到服务器),腾讯云、阿里云什么的搜索SSL证书,里面都会有免费申请的入口。申请后根据提示,用DNS进行解析通过SSL的申请,然后在上文中nginx配置里配置自己申请后下载下来的的SSL证书即可
如果嫌麻烦的话就去买,价格也需要斟酌,我挑了俩感觉价格还行:
记得看清楚商品详情是多久续签一次的,续签就是重新发一个证书,然后还是要自己部署到服务器,买1年的。90天的别买,本身就是免费的。
juyssl-3年136
永久免费SSL证书_永久免费https证书_永久免费ssl证书申请-JoySSL
西部数码-3年153
别买通用的,通用的有效期90天,90天的本身就是免费的
SSL证书-免费SSL证书申请-西部数码 (west.cn)
问题总结
问题一
根据此大佬给的方法修改系统文件即可
问题二
之前连接过,所以本地会有记录,手动删除记录即可。
找到本地计算机的密钥文件夹,打开known_hosts,删除带有你服务器公网IP的记录并保存即可
问题三
每个需要用端口进行访问的步骤之前,先去防火墙看看自己有没有放行这个端口,不然无法访问