一、本地安装

1. 安装Git、Node.js、npm(略)

2. 安装hexo

1
>npm install -g hexo-cli hexo-server

npm install -g:npm包管理工具进行全局安装。
hexo-cli:为hexo的客户端模块。
hexo-server:服务器模块。可以支持在本地服务器生成网页并进行调试。
image.png

3.本地初始化博客文件夹

1
2
3
>hexo init hexo         // 创建 hexo 文件夹(自定义),拉取hexo项目。
>cd hexo // 进入 hexo 文件夹
>npm install hexo-deployer-git --save // 安装自动部署至远程git仓库的插件

4.配置Hexo的部署插件(_config.yml)

在本地计算机的hexo文件夹,打开 D:\bolg\hexo\ _config.yml 文件,找到 deploy 语句并进行修改,如图所示。

1
2
3
4
5
6
# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
type: git #部署方式采用git
repo: git@129.146.185.142:/home/repo/hexo.git #git@服务器ip:git仓库目录 
branch: master

在执行部署命令时,hexo就会用 git 用户登录服务器,并将生成的网页文件push到服务器的git仓库。

5.启动服务

1
2
3
// 生成静态文件,启动服务,在浏览器输入 http://localhost:4000。
>hexo clean && hexo generate && hexo server
// 或 hexo clean && hexo g && hexo s

6.部署到服务器

1
2
// 生成静态文件,部署至服务器上。 或  hexo g -d
>hexo clean && hexo generate && hexo deploy

详细参考:https://www.cnblogs.com/wsmrzx/p/9439448.html

二、部署到云服务器(第一种)

我们将在服务器上安装hexo及其环境,配置 git 的自动部署和 nginx 。

/home/www/hexo:nginx 网站目录,用于存放Hexo静态页面。
/home/repo:git 空仓库目录,用于本地push到此仓库时,执行钩子内的语句,把数据存放到nginx网站目录。

1
2
3
4
// 将仓库目录的所有权移交给git用户,所有者具有读写权限。
$ chown -R git:git /home/repo
// 将hexo部署目录所有权移交给git用户,所有者具有读写权限。
$ chown -R git:git /home/www/hexo

1.安装Nginx

默认安装程序文件: /usr/sbin/nginx 
默认安装配置文件: /etc/nginx/
默认站点配置文件:/etc/nginx/sites-enabled/default
默认页面文件:/var/www/html/index.nginx-debian.html

1
2
sudo apt update
sudo apt install nginx

2.配置Nginx(建议)

(1)创建hexo部署目录,用于存放Hexo静态页面
由于git用户访问权限问题,建议创建在home下,而不是其它用户目录(/home/ubuntu/hexo X))

1
>mkdir -p /home/www/hexo   //自动创建www和hexo文件夹。

(2)配置Nginx反向代理
编辑 nginx 配置文件(/etc/nginx/nginx.conf ),添加server语句块。

1
$ vi /etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 443 ssl; # 监听443 ssl端口
# visit https://ttddp.com https://www.ttddp.com https://blog.ttddp.com
server_name ttddp.com www.ttddp.com blog.ttddp.com;
ssl_certificate /root/.acme.sh/ttddp.com_ecc/fullchain.cer; # 证书位置
ssl_certificate_key /root/.acme.sh/ttddp.com_ecc/ttddp.com.key; #私钥位置
location / {
root /home/www/hexo; #部署目录,Hexo静态文件存放路径
index index.html index.htm;
}
# location / {rewrite ^(.*)$ https://$host$1 permanent;}
}

server {
listen 80; # 监听80端口
# visit http://www.ttddp.com => 浏览器地址栏跳转到 https://blog.ttddp.com
server_name blog.ttddp.com www.ttddp.com ttddp.com;
return 301 https://$server_name$request_uri; # $server_name=servername[0]
}

配置cdn服务器(可选)允许跨域访问,即网站通过代理(cdn.ttddp.us.kg)请求cdn服务器的静态资源(cdn.imcao.cn)。参考:Nginx 解决跨域.note

1
2
3
4
5
6
7
8
9
10
11
12
server{
server_name cdn.ttddp.us.kg ;
listen 443 ssl;
ssl_certificate /home/www/cert/ttddp.us.kg.fullchain.cer;
ssl_certificate_key /home/www/cert/ttddp.us.kg.key;
location / {
proxy_pass https://cdn.imcao.cn/source/;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
add_header 'Access-Control-Allow-Header' 'Content-Type,*';
}
}

修改完成后重载nginx。

1
$ nginx -s reload

(3) 启动Nginx
启动成功后在终端中不会显示任何信息。

1
$ nginx                    //首次启动nginx;后续重启 ./nginx -s reload

在这里附上一些常用的nginx命令。

1
2
3
4
$ nginx -v         //显示nginx版本号,说明安装成功
$ nginx -s stop //关闭nginx
$ nginx -s reload //重载nginx
$ nginx -t //检查nginx配置文件语法是否有错误,常在修改配置文件后执行

启动后在浏览器地址栏中输入 http://你的服务器ip:80 。

3. 安装并配置Git

(1) 添加git用户,授予sudo权限
我们为服务器添加一个名为git的用户,用于将博客自动部署至服务器上。

1
2
$ useradd git     // 添加名为git的用户
$ passwd git // 修改git用户的密码

打开 “/etc/sudoers” 文件,为git用户授予sudo权限。

1
$ sudo vi "/etc/sudoers"

User privilege specification
root ALL=(ALL:ALL) ALL
git ALL=(ALL:ALL) ALL

这行的意思是,允许git用户在所有主机上(第一个ALL)作为所有用户(第二个ALL)执行任何命令(最后一个ALL)。

(2) 设置git用户SSH密钥免密登陆

不同的git仓库指定私钥.note

原理:在本地生成一对密钥文件(分别是公钥和私钥),将公钥文件上传到服务器上。服务器收到连接请求时,会将本地的私钥与服务器的公钥进行比对,用私钥解密服务器发来的一段信息并将其发回,验证通过后准许连接。

a.本地计算机上,创建SSH的私钥和公钥。

1
>ssh-keygen // 创建私钥和钥文件,默认放在C:\Users\用户名\.ssh文件夹

在 C:\Users\用户名.ssh文件夹内的 id_rsa 为私钥文件,id_rsa.pub 为公钥文件。

b.服务器上,配置SSH。

1
2
3
4
5
6
7
8
$ mkdir /home/git        //新建 git 文件夹
$ mkdir /home/git/.ssh //新建 .ssh 文件夹
$ vi /home/git/.ssh/authorized_keys //新建文件,复制公钥文件中的所有内容保存
// root账户登录
$ chmod 600 /home/git/.ssh/authorized_keys //公钥文件设置权限
$ chmod 700 /home/git/.ssh //文件夹设置权限
//$ chown -R git:git /home/git //git文件夹及其内的文件所有权移交git用户
$ chown -R git:git /home/git/.ssh //.ssh文件夹及其内的文件所有权移交git用户

chown命令可以变更目录或文件的所有者,-R参数是对子目录及其内的所有文件生效。

e. 本地计算机用ssh测试免密登录服务器。

1
ssh -v git@xxx.xxx.xxx.xxx     #git@后填写服务器的公网ip

(3) 创建Git仓库(repo)并配置自动部署

这里的Git仓库(repository)可以理解为一个存放着不同版本代码的代码库,包含了项目所有的源文件和版本控制信息。但我们在这里需要用到的是裸库,即仅包含版本控制信息的仓库。后者不保存文件,常用作服务器仓库,实现数据共享和同步。

自动部署的核心在于git-hooks(钩子),可以理解为一种脚本,在特定条件下触发时会调用钩子并执行钩子文件中的内容。

(1) 创建Git仓库。

1
2
3
$ mkdir -p /home/repo       //创建存放 git仓库的文件夹
$ cd /home/repo
$ git init --bare hexo.git //创建hexo.git仓库(需带.git),--bare参数为创建裸库

(2) 在 /home/repo/blog.git/hooks 目录,新建 post-receive 钩子文件,添加以下代码。

1
vi /home/repo/hexo.git/hooks/post-receive

#!/bin/bash

git --work-tree=/home/ubuntu/www/hexo --git-dir=/home/repo/hexo.git checkout -f

work-tree:hexo的部署目录

git-dir:Git仓库的目录

checkout -f:用于将工作目录和暂存区与指定分支的最新提交一致。

这里使用的是 post-receive 钩子。在本地更新博客并且执行部署命令后,网页文件会被push至服务器的Git仓库内,当服务器的Git收到push请求的时候就会调用这个钩子执行其中语句(删除hexo部署目录中原有的文件,将Git仓库内的网页文件复制(clone)到hexo部署目录下)。

(3) 为钩子文件及Git仓库目录配置权限。
需要将我们创建的仓库及部署目录的所有权移交给git用户。因为linux下创建文件时默认只有拥有者(即创建者)才具有读写权限,而Git进行push操作时登录的用户为git用户。

1
2
3
$ chmod +x /home/repo/hexo.git/hooks/post-receive #为钩子文件授予可执行权限
$ chown -R git:git /home/repo #将仓库目录的所有权移交给git用户
$ chown -R git:git /home/www/hexo #将hexo部署目录所有权移交给git用户

三、部署到GitHub(第二种)

1.创建 algz.github.io 仓库(github)

须为 public,并添加 read.md 文件。

2.配置文件 _config.yml(本地)

配置文件 _config.yml,翻到最后,修改为YourgithubName就是你的GitHub账户

1
2
3
4
5
deploy:
type: git
repo: git@github.com:algz/algz.github.io.git
# repo: https://github.com/algz/algz.github.io.git
branch: main

3.安装deploy-git

1
npm install hexo-deployer-git --save

4.提交和部署

1
2
3
4
5
6
# 清理缓存
hexo clean
# 创建静态文件 hexo generate
hexo g
# 发布到 github. hexo deploy
hexo d

命令简写

1
2
3
4
5
6
7
8
9
10
hexo n "我的博客" == hexo new "我的博客" #新建文章
hexo g == hexo generate #生成
hexo s == hexo server #启动服务预览
hexo d == hexo deploy #部署

hexo server #Hexo会监视文件变动并自动更新,无须重启服务器
hexo server -s #静态模式
hexo server -p 5000 #更改端口
hexo server -i 192.168.1.1 #自定义 IP
hexo clean #清除缓存,若是网页正常情况下可以忽略这条命令

5.GitHub 自定义域名配置

点击 Settings.

选择 Pages -> Custom domain ,输入域名,开启 Enforce Https .

source目录下新建 CNAME 文件,文件内容填写域名(blog.ttddp.com),不然每次部署都会清空自定义域名。

6.问题处理

(1)出现404无法访问 algz.github.io,

如果出现404无法访问 algz.github.io,重新修改下本地任意文件,再执行以上命令重新提交。

(2)使用Hexo提交代码时,发现提交不上去


进入站点目录,修改修改_config.yml文件

1
2
3
4
deploy:
type: git
repo: git@github.com:algz/algz.github.io.git
branch: main

重新部署

1
hexo clean && hexo g && hexo d