服务器上同时部署hugo和hexo

服务器环境:Centos 8 x64

本地环境:Win10 x64

1. 本地操作

1.1. 安装 Git 和 Node.js

本地需要安装 GitNode.js,安装过程略,安装Node.js是为了方便在服务器上同时部署hugo和hexo。

安装完git后还要配置环境变量:
右键我的电脑 –> 属性,然后点击高级系统设置 –> 环境变量 –> 选择用户变量或系统变量中的Path,点击编辑;找到Git安装目录,添加以下地址:

1
2
3
D:\Program Files\Git\bin
D:\Program Files\Git\mingw64\libexec\git-core
D:\Program Files\Git\mingw64\bin

1.2. 配置SSH 公钥

Windows 上安装 Git for Windows 之后在开始菜单里打开 Git Bash 输入:

1
2
git config --global user.name "你的用户名"
git config --global user.email "你的电子邮箱"
1
2
3
4
cd ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa

在系统当前用户文件夹下生成了私钥 id_rsa 和公钥 id_rsa.pub

2. 服务器操作

首先,在 服务器 上安装 Git 和 nginx。

1
2
yum update -y
yum install git-core nginx -y

Nginx 安装完成后需要手动启动,启动Nginx并设置开机自启:

1
2
systemctl start nginx
systemctl enable nginx

如果开启了防火墙,记得添加 HTTP 和 HTTPS 端口到防火墙允许列表。

1
2
3
4
firewall-cmd --permanent --zone=public --add-service=http 
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
systemctl restart firewalld.service

配置完成后,访问使用浏览器服务器 ip ,如果能看到以下界面,表示运行成功。

2.1 配置用户

然后新增一个名为 git 的用户,过程中需要设置登录密码,输入两次密码即可。

1
2
adduser git
passwd git

给用户 git 赋予无需密码操作的权限(否则到后面 Hexo 部署的时候会提示无权限)

1
2
chmod 740 /etc/sudoers
vi /etc/sudoers

在图示位置root ALL=(ALL:ALL) ALL的下方添加

1
git ALL=(ALL:ALL) ALL

然后保存。然后更改读写权限。

1
chmod 440 /etc/sudoers

2.2. 上传 SSH 公钥

接下来要把本地的 ssh 公钥上传到 服务器 。执行

1
2
3
4
5
su git
cd ~
mkdir .ssh && cd .ssh
touch authorized_keys
vi authorized_keys

现在要打开本地的 Git Bash,输入vi ~/.ssh/id_rsa.pub,把里面的内容复制下来粘贴到上面打开的文件里。

接着把ssh目录设置为只有属主有读、写、执行权限。代码如下:

1
2
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

然后建立放部署的网页的 Git 库。

1
2
3
cd ~
mkdir file.git && cd file.git
git init --bare

测试一下,如果在 Git Bash 中输入 ssh git@服务器的IP地址 能够远程登录的话,则表示设置成功了。如果你的服务器端口不是22。参考:上传SSH公钥


ps: 如果配置完成还是提示要输入密码,可以使用 ssh-copy-id,在本地打开 Git Bash 输入:

1
ssh-copy-id -i ~/.ssh/id_rsa.pub git@服务器ip地址

2.3. 用户授权

接下来要给用户 git 授予操作 nginx 放网页的地方的权限:

1
su
1
2
mkdir -p /var/www/file
chown git:git -R /var/www/file

2.4. 配置钩子

现在就要向 Git Hooks 操作,配置好钩子:

1
2
3
su git
cd /home/git/file.git/hooks
vi post-receive

输入内容并保存:(里面的路径看着换吧,上面的命令没改的话也不用换)

1
2
3
4
5
6
7
8
#!/bin/bash
GIT_REPO=/home/git/file.git
TMP_GIT_CLONE=/tmp/file
PUBLIC_WWW=/var/www/file
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}

赋予可执行权限:

1
chmod +x post-receive

2.5. 配置 SSL&Nginx

这里以Centos 8为例。

2.5.1. 安装Certbot

1
2
yum install epel-release -y
yum install certbot -y

然后执行:

1
certbot certonly --webroot -w /var/www/file -d f.bore.vip -m 455343442@qq.com --agree-tos

2.5.2. 配置Nginx

为了开启Nginx目录浏览,要将下面几行配置文件加入nginx配置的server段内:

1
2
3
4
autoindex on;                        
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8,gbk;

最终效果:

1
vi /etc/nginx/conf.d/file.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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
server {
listen 80;
server_name f.bore.vip;
rewrite ^(.*)$ https://$server_name$1 permanent;
}
server {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8,gbk;
listen 443;
root /var/www/file;
server_name f.bore.vip;
ssl on;
ssl_certificate /etc/letsencrypt/live/f.bore.vip/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/f.bore.vip/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/file_access.log;
error_log /var/log/nginx/file_error.log;
error_page 404 = /404.html;
location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ {
root /var/www/file;
access_log off;
expires 1d;
}
location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {
root /var/www/file;
access_log off;
expires 10m;
}
location / {
root /var/www/file;
if (-f $request_filename) {
rewrite ^/(.*)$ /$1 break;
}
}
location /nginx_status {
stub_status on;
access_log off;
}
}

重启Nginx生效:

1
systemctl restart nginx

如果上传网页后,Nginx 出现 403 Forbidden,执行:

1
vi /etc/selinux/config

将SELINUX=enforcing 修改为 SELINUX=disabled 状态。

1
SELINUX=disabled

重启生效,reboot。


3. 上传下载

3.1. 上传

3.1.1. 作文件服务器

本地新建一文件夹,在Git Bash里输入:

1
2
3
4
5
6
git remote rm origin
git init
git remote add origin git@104.224.191.88:hugo.git
git add .
git commit -m "building site"
git push origin master --force

为了方便可以在根目录新建一个上传脚本upload.sh

1
2
3
4
5
6
7
8
#!/bin/bash
echo -e "\033[0;32mupload file...\033[0m"
rm -rf .git
git init
git remote add origin git@104.224.191.88:file.git
git add .
git commit -m "upload file"
git push origin master --force

每次删除本地文件,再重新提交到远程仓库,即可删除服务器文件,可是在.git文件夹里还有缓存,时间久了该文件夹会非常大,最简单粗暴的方法就是删除.git文件夹(rm- -rf .git),再重新初始化git,关联远程仓库。不过这样做每次都会将改文件夹所有文件再重新上传一遍。另外服务器上hugo.git文件夹也会有缓存,时间久了,会占很大服务器空间。最简单的方法就是删除该文件夹,再重新部署

3.1.2. 同时部署hugo和hexo

如若想同时部署hugo和hexo到服务器,则在hugo根目录输入:

1
2
3
4
5
6
7
8
9
rm -rf public/*
hugo
cd public
git remote rm origin
git init
git remote add origin git@104.224.191.88:hugo.git
git add .
git commit -m "building site"
git push origin master --force

或者在hexo里做相应调整:

1
2
3
4
5
6
deploy:
type: git
repo:
coding: git@e.coding.net:iwyang/hexo/hexo.git
fwq: git@104.224.191.88:hugo.git
branch: master

3.2. 下载

3.2.1. 利用Nginx下载文件

将下面几行配置文件加入nginx配置的server段内,开启nginx目录浏览:

1
vi /etc/nginx/conf.d/file.conf
1
2
3
4
autoindex on;                        
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8,gbk;

3.2.2. 克隆服务器仓库到本地

1
git clone ssh://git@104.224.191.88:22/home/git/file.git

4. 总结

最终效果:

5. 参考链接

1.在服务器上搭建hexo博客,利用git更新

2.从 0 开始搭建 hexo 博客

3.基于CentOS搭建Hexo博客

4.Nginx出现403 forbidden