Hexo-Github迁移到阿里云ECS

Github pages访问还是有点慢,迁移到阿里云ECS,1G1核,Debian 11.4系统

引言——怎么又迁移了

已经经过了gitee pages、github pages,现在又要移到服务器了…根本原因是速度,后面这个博客和域名打算用来干点其他事,买了服务器,不过主要还是自己看,后面不打算做SEO优化。

前置操作

服务器的博客环境

安装git

1
2
3
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git

之后运行git --version出现git的版本号即安装成功,配置git基本信息:

1
2
git config --global user.name "your name"
git config --global user.email "your email"

(可选)服务器开启防火墙

安装防火墙

1
2
sudo apt-get install ufw
sudo ufw enable

此时输入sudo ufw status输出activate即开启成功,常用命令:

1
2
3
sudo ufw status numbered # 查看规则
sudo ufw delete 序号 #,删除前面命令显示的规则
sudo ufw allow 端口 # 加入规则

对于服务器,我们需要输入以下命令:

1
2
3
sudo ufw allow 80/tcp	# 开启http
sudo ufw allow 443/tcp # 开启https
sudo ufw allow ssh # 开启ssh连接

安装 nginx

1
sudo apt-get install nginx

之后运行nginx -v出现版本号即安装成功,nginx的日志文件放在/var/log/nginx,程序在/usr/sbin/nginx,默认目录为/var/www/html,配置文件在/etc/nginx/nginx.conf

此时在浏览器输入服务器的公网ip,看到的应该是nginx的欢迎页面:

测试博客环境

将博客内容放进对应文件夹:

1
2
cd /var/www/html
git clone 博客github

修改配置文件,将root后面的/var/www/html改成你刚刚clone的文件夹名,我的是.github.io的名字(如下):

1
2
3
4
5
6
7
server {
listen 80 default_server;
listen [::]:80 default_server;
...
root /var/www/html/ldefault111.github.io;
...
}

特别注意root后面那个分号,我第一次不小心删了调了半天。。。这时再次访问公网ip可以看到博客页面,说明环境配置成功了!

nginx重启配置的命令:nginx -s reload

服务器配置git仓库与自动部署

不愿每次更新完博客都登录服务器去git pull,所以我们在服务器建一个git仓库,并利用hooks自动将内容推到nginx的默认目录。

创建新用户

1
adduser git

直接用root操作服务器不安全

密钥与SSH配置

1
2
3
4
5
6
7
8
su git		# 一定要切换用户不然后面文件权限会不对劲
cd /home/git
# 创建文件(夹)
mkdir .ssh
touch .ssh/authorized_keys
# 修改权限
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

如果是部署hexo到github应该有在本机创建过公钥了,在本机的C:\Users\你的名字\.ssh文件夹中有id_isa.pub,将内容复制下来:

1
vim /home/git/.ssh/authorized_keys

将刚刚复制的内容贴进文件里,下面修改SSH的配置,如果担心改坏了可以先备份一份出来:

1
2
su root		# 切回root用户
vim /etc/ssh/sshd_config

修改的内容列举如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 开启端口,我的原配置文件里下面这部分被注释掉的,打开注释就行
Port 22
AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::
# 配置允许SSH登录的用户,我的原配置文件里这个没有要自己添加
AllowUsers root git
# 修改公钥配置文件
AuthorizedKeysFile .ssh/authorized_keys
# 允许root用户通过ssh登录
PermitRootLogin yes
# 允许使用公钥对登录
PubkeyAuthentication yes
# 允许密码登录
PasswordAuthentication yes

保存后,输入service sshd restart重启sshd服务,没报错就成功了,报错应该是配置文件有问题,再检查一下

创建git远程仓库

1
2
3
4
su git
cd /home/git
git init --bare hexo.git # 要加--bare,否则会有.git文件,hooks的位置不一样和很多奇怪的问题
chown -R git:git hexo.git

在hooks文件夹里添加一个脚本:

1
2
touch /home/git/hexo/hooks/post-receive
vim /home/git/hexo/hooks/post-receive

文件中写入,注意第一个路径是nginx的默认路径:

1
2
#!/bin/sh
git --work-tree=/var/www/html/ldefault111.github.io --git-dir=/home/git/hexo.git checkout -f

网上的教程到这里就结束了,但是我在部署的时候出现了remote:error: unable to unlink old ' filename_here' (permission denied)' ,查了半天发现可能是nginx默认路径的文件夹的权限问题,所以切到root用户进行修改,将文件夹的修改权限赋予用户git:

1
2
su root
chown -R git:git /var/www/html/ldefault111.github.io

配置hexo部署

打开hexo站点配置文件,在deploy部分添加:

1
2
3
4
5
deploy:
- type: git
repository: git@你的公网ip:/home/git/hexo.git
branch: master
ignore_hidden: false # 忽略隐藏文件及文件夹(目录)

之后进行hexo deploy就可以同时推送到服务器上的仓库,仓库收到推送后自动运行hooks里的脚本将内容更新到nginx的工作目录,网站内容就更新啦

配置域名解析

域名解析到公网ip

我的域名在阿里云,从控制台打开域名解析,添加记录:

(可选)强制https

SSL模块安装

先测试一下,输入/usr/sbin/nginx -V,注意是大写V,小写只给版本号,给出的configure arguments: 如果有--with-http_ssl_module就说明已经有SSL模块了,如果没有就找教程先安装

获取免费SSL证书

在阿里云的控制台找到数字证书管理服务,点开找到SSL证书,点立即购买,可以免费领取一年的:

然后按照步骤进行配置就好,审核下来将证书下载到本地,上传到服务器里去(可以用SFTP,参考Vscode远程连接阿里云ECS服务器

配置nginx

打开配置文件:

1
vim /etc/nginx/nginx.conf

将以下内容填入,其中ssl的两项是你之前下载的证书,放在服务器里的位置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
http {
server {
listen 443 ssl;
server_name www.lyroch.site;

ssl_certificate /root/ssl/8617822_www.lyroch.site.pem;
ssl_certificate_key /root/ssl/8617822_www.lyroch.site.key;
location / {
root /var/www/html/ldefault111.github.io;
index index.html index.htm;
}
}
# Basic Settings
...
}

保存退出后,重启nginx:

1
2
nginx -t				# 检查语法
service nginx restart

再打开域名就能看到了!

(可选)修改SSH端口

参考博客

如何在云服务器上使用git管理项目(git远程仓库、ssh配置、多密钥对配置

Hexo 从 GitHub 到阿里云