Hexo自驾服务器教程

一、自驾服务器环境搭建

安装 git、nginx

Git 用于版本管理和部署,Nginx 用于静态博客托管。

1
[root@10-7-89-87 ~]# yum install git nginx -y

添加用户并创建密码

1
2
3
4
5
6
[root@10-7-89-87 ~]# adduser git
[root@10-7-89-87 ~]# passwd git
Changing password for user git.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

创建git仓库

进入 /srv目录(如果有)或者自己定义在/var下面等,

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建目录
[root@10-7-89-87 ~]# cd /srv/
[root@10-7-89-87 srv]# mkdir repo
[root@10-7-89-87 srv]# cd repo
[root@10-7-89-87 repo]# pwd
/srv/repo

# 初始化仓库
[root@10-7-89-87 repo]# git init --bare blog.git
Initialized empty Git repository in /srv/repo/blog.git/

# 改变 blog.git目录的拥有者为git 用户
[root@10-7-89-87 repo]# chown -R git:git blog.git

添加一个web服务目录

拥有者改为git用户,增加git全仅限

1
2
3
4
5
6
7
[root@10-7-89-87 repo]# mkdir -p /srv/www/hexo

# 拥有者改为git用户
[root@10-7-89-87 repo]# chown -R git:git /srv/www/hexo

# git用户读+写+执行,其它用户读+执行
[root@10-7-89-87 repo]# chmod -R 755 /srv/www/hexo

给blog.git添加添加Hooks

Hook 就是在执行某个事件之前或之后进行一些其他额外的操作

1
[root@10-7-89-87 repo]# vim /srv/repo/blog.git/hooks/post-receive

添加

1
2
#!/bin/sh
git --work-tree=/srv/www/hexo --git-dir=/srv/repo/blog.git checkout -f

然后保存退出,并设置权限

1
[root@10-7-89-87 repo]# chmod +x /srv/repo/blog.git/hooks/post-receive

二、配置与测试

服务器配置公钥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 先切到git用户,这个公钥是给git用户配置的
[root@10-7-89-87 .ssh]# su git
[git@10-7-89-87 .ssh]$ pwd
/root/.ssh

# 进入主目录发现没有.ssh目录
[git@10-7-89-87 .ssh]$ cd
[git@10-7-89-87 ~]$ ls ./ssh
ls: cannot access './ssh': No such file or directory

# 创建.ssh目录并且设置权限为当前git用户全权其它用户无权限
[git@10-7-89-87 ~]$ mkdir .ssh && chmod 700 .ssh

# 创建一个公钥文件,并且权限设置为读写
[git@10-7-89-87 ~]$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

客户端创建密钥和git测试

客户端可能是windows或者其它,生成公钥和私钥后,把公钥添加到服务器的authorized_keys

ssh-keygen.exe文件在安装git后就会有,在如C:\Program Files\Git\usr\bin\ssh-keygen.exe这样的路径,如果添加了环境变量则直接执行即可

1
2
3
4
5
# 当前为wondows平台,在命令行运行
ssh-keygen -t rsa -C "cai_dog_space"

# 会让输入一个名称来存文件
Enter file in which to save the key (C:\Users\Administrator/.ssh/id_rsa):

然后到客户端的C:\Users\Administrator/.ssh/下查看,会看到有两文件

1
2
id_rsa.pub
id_rsa

其中id_rsa.pub就是公钥,相当于锁子,私钥相当于钥匙,都要保存好

id_rsa.pub用记事本打开并全部复制,再在服务器上以git用户登录

1
2
3
4
5
6
[git@10-7-89-87 ~]$  vim .ssh/authorized_keys

# 在最后把公钥的内容复制粘贴进来
# 如果使用的是xshell远程连接,复制粘贴默认的快捷键
# 复制是 Ctrl+Insert 粘贴是 ShIft+Insert
# 然后wq保存退出

再客户端测试当前搭建的git服务器是否正常,打开命令行

1
2
3
4
5
6
7
8
9
10
11
# 当前为wondows平台,创建一个MyBlogDic目录并拉取blog.git
cd /d d:
md MyBlogDoc
cd MyBlogDoc
git clone git@server_ip:/srv/repo/blog.git
...

dir

# dir后可以看到已下拉
2022/03/13 02:43 <DIR> blog

如果能拉下来东西,则说明配置正常,但可能有你有老的内容没清的话会有报错如下

1
2
3
Add correct host key in /c/Users/Administrator/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /c/Users/Administrator/.ssh/known_hosts:2
ECDSA host key for 113.149.27.199 has changed and you have requested strict checking.

原因是运行第一次通过ssh去连接远程服务器的时候生成了一个认证信息,存储在客户端上。更换了远程服务器的系统之后(服务器远程重装系统了),需要更新我们的认证信息,否则会报错

1
2
3
4
5
6
# ssh-keygen -R 服务器地址
D:\MyBlockDoc> ssh-keygen -R 113.149.27.199

# Host 113.149.27.199 found: line 2
C:\Users\Administrator/.ssh/known_hosts updated.
Original contents retained as C:\Users\Administrator/.ssh/known_hosts.old

再做一次提交测试

1
2
3
4
5
6
7
8
9
10
D:\MyBlockDoc>cd blog
D:\MyBlockDoc\blog>echo This is my blog > ReadMe.txt
D:\MyBlockDoc\blog>git add ReadMe.txt

D:\MyBlockDoc\blog>git commit -m "init blog git"
[master (root-commit) c1a3baa] init blog git
1 file changed, 1 insertion(+)
create mode 100644 ReadMe.txt

# 看来是成功了

服务器配置nginx

nginx的默认设置,使用root用户修改

1
2
3
4
5
# ubuntu
vim /etc/nginx/sites-available/default

# centos
vim /etc/nginx/conf.d/blog.conf

将root指令指向 /srv/www/hexo 目录(钩子目录),同时可配置域名

1
2
3
4
5
6
7
8
9
10
11
 server {
listen 80;
listen [::]:80;
root /srv/www/hexo; # 目录
server_name caidog.com www.cai.dog; # 我的域名
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}

重启服务

1
service nginx restart

目录下添加一个文件看是否生效

1
echo "CaiDog" > /srv/www/hexo/index.html

客户端浏览器打开,可以看到主页内容

如果主页内容是RedHat的欢迎页面,根据提示把etc/nginx/nginx.conf下的server{}配置部分用#注释

客户端Hexo配置发布地址

打开 hexo 博客目录,编辑_config.yml文件修改 repository 为:

1
2
3
4
5
deploy:type: git

# 为当前服务器地址的配置
repository: git@ip或域名:/srv/repo/blog.git
branch: master

执行

1
hexo g -d

会直接发布到当前git服务器上并且部署到 /srv/www/hexo

服务器安全性配置

安全考虑,禁用git用户的shell登录权限配置

首先你必须确保 git-shell 已存在于 /etc/shells 文件中使用命令 which git-shell 判断系统是否安装了 git-shell

如果已经安装,则返回 git-shell 的安装目录,如:/usr/bin/git-shell

1
2
[root@10-7-89-87 .ssh]# which git-shell
/usr/bin/git-shell

如果未安装则需要安装 git-shell 命令,安装命令

1
yum install git

判断 shells 文件是否存在,判断命令:

1
cat /etc/shells

如果文件不存在或没有/usr/bin/git-shell,则需要使用 vim 增加这个路径:sudo vim /etc/shells,在最后一行添加 git-shell 路径

1
2
3
4
5
6
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
#添加这个路径
/usr/bin/git-shell

现在可以使用chsh 命令修改任一系统用户的 shell 权限了,现在我们修改第一步中创建的 git 用户的登录权限,禁止 git 用户使用 shell 权限:终端中输入chsh git,再接着输入/usr/bin/git-shell

1
2
3
4
5
6
[root@10-7-89-87 .ssh]# chsh git
Changing shell for git.
New shell [/usr/bin/git-shell]
/usr/bin/git-shell
chsh: Shell not changed.
[root@10-7-89-87 .ssh]#

再到

1
vim /etc/passwd

找到类似

1
git:x:1000:1000::/home/git:/usr/bin/git-shell

看看 git 用户是否是以 git-shell 结尾这样,git 用户就只能使用 SSH 连接对 Git 仓库进行推送和拉取操作,而不能登录机器并取得普通 shell 命令

1
2
3
4
5
6
# 换成 git 用户会报错, 如果用 git 用户登录 shell 会自动关闭终端

[root@10-7-89-87 .ssh]# su git
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
[root@10-7-89-87 .ssh]#

三、服务器和域名

域名和和备案说明

只要服务器在国内,跳向服务器的域名都是要备案的,所以要租用国内的服务器,一般都要在国内服务器商购买域名,因为它要求实名认证。

如果域名商和服务器商不是一个服务器商,则域名提交到管理局要3天时间,所以3天后才能开始在服务器商这边进行备案

基本流程如下图所示

购买域名并备案后,在nginx配置中增加当前域名,并且在域名服务器商中,给域名添加A记录,转到当前服务器。

四、参考文章

Git - 配置服务器 (git-scm.com)