# 前言

  • 参考网上大神写的部署教程,虽然教程写的比较详细,但是还是遇到了不少问题,这里记录我的部署过程,还有部署过程中采到的一些坑

# 原理

  • 在云服务器上创建一个 git 仓库,并且创建一个名叫 git 的 linux 账户,并为这个账户配置 SSH
  • 在云服务器上安装并配置 Nginx,并指定博客的网站目录
  • 在 git 仓库中创建一个 post-receive 钩子,这样我们在平时写完博客以后在本地执行 deploy 后, hexo 会帮我们将博客项目打包并推送到 git 仓库中,
  • 然后 post-receive 钩子将会被触发,自动将刚提交的内容更新到网站目录中,实现自动部署的效果

# 环境

  • Linux 云服务器: CentOS-7.6.1810-x64

# 在客户端中安装 git

进入 git 官网 https://git-scm.com/downloads,下载并安装 git

image

# 创建 SSH 密钥

在桌面中右键,选择 Git Bash Here

image

git config --global user.name "你要设置的名字"
git config --global user.email "你要设置的邮箱"
ssh-keygen -t rsa -C "你刚刚设置的邮箱"

密码的部分话直接回车就行,之后会在 C:\Users\(你的用户名)\.ssh 下面生成两个文件 id_rsaid_rsa.pub

# 在服务器中安装 git

# 安装 git

  • 使用 XShell 等工具连接上自己的云服务
yum install git

中途出现 Is this ok [y/d/N] ,输入 y 回车,最后出现 Complete! 表示安装成功了

# 创建 git 用户

adduser git

# 为 git 用户分权权限

  • 先修改 sudoers 文件的读写权限
chmod 740 /etc/sudoers
  • 然后用 vim 命令编辑 sudoers 文件
vim /etc/sudoers
  • 我个人不是很喜欢用 vim 命令,可以使用 WinScp 等工具将需要修改的文件下载到本地,修改完成后再重新上传到服务器
  • 修改 sudoers 文件,在大约第 100 行处找到 root ALL=(ALL) ALL , 然后在下面再加一行 git ALL=(ALL) ALL
root ALL=(ALL) ALL
git ALL=(ALL) ALL
  • 修改完成后将 sudoers 文件的读写权限改回来
chmod 400 /etc/sudoers

# 设置 git 账户密码

  • 这个密码是推送 git 代码时所使用的密码,建议不要将密码设置得太简单,避免服务器被盗用的风险
sudo passwd git
  • 注意输入密码是不显示 ** 的,输入完成后结果如下
[root@HKc114514 ~]# sudo passwd git
Changing password for user git.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

# 给 git 账户添加 ssh 密钥

  • 在 git 用户目录 /home/git 下面创建一个 .ssh 文件夹,注意:是目录 /home/git 下面,不是 /root 下面
mkdir -p /home/git/.ssh
  • 创建 authorized_keys 文件并设置权限
touch /home/git/.ssh/authorized_keys
chmod 600 /home/git/.ssh/authorzied_keys
chmod 700 /home/git/.ssh
  • 使用 vim 命令或者 WinScp ,将 C:\Users\(你的用户名)\.ssh 下面 id_rsa.pub 的内容复制到 authorized_keys 文件内保存
  • 在电脑本地桌面,右键 Git Bash Here ,执行命令,测试是否能免密登录 git
ssh -v git@SERVER
  • 其中 SERVER 填写自己的云主机 ip,执行输入 yes 后登录成功表示配置成功了,登录效果如下
There were 48 failed login attempts since the last successful login.
[git@HKc114514 ~]$

# 创建网站根目录

  • 在 srv 目录下创建 hexo 作为 Git 仓库目录,后面使用 nginx 加载该目录
mkdir /srv/hexo
  • 设置目录权限
chown -R git:git /srv/hexo
chmod -R 755 /srv/hexo

# 创建 git 仓库

  • 在 srv 目录下创建 repo 作为 Git 仓库目录
mkdir /srv/repo
  • 设置目录权限
chown -R git:git /srv/repo
chmod -R 755 /srv/repo
  • 创建 git 仓库
cd /srv/repo
git init --bare hexo.git
  • 运行结果
[root@HKc114514 repo]# git init --bare hexo.git
Initialized empty Git repository in /srv/repo/hexo.git/

# 创建钩子

  • /srv/repo/hexo.git 下,有一个自动生成的 hooks 文件夹。我们需要在里边新建一个新的钩子文件 post-receive ,然后将下面的代码复制到里面保存
#!/bin/bash
git --work-tree=/srv/hexo --git-dir=/srv/repo/hexo.git checkout -f
  • 注意: post-receive 文件是不带 .sample 后缀的,否则这个钩子会失效
  • 设置执行权限
chown -R git:git /srv/repo/hexo.git/hooks/post-receive
chmod +x /srv/repo/hexo.git/hooks/post-receive

# 配置 Nginx

  • 安装依赖包
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
  • 下载并解压安装包,可以到 nginx 官网上找最新稳定版,我这里用的是 nginx-1.22.1
  • 如果遇到 -bash: wget: command not found 的情况,可以使用 yum -y install wget 安装一下 wget
# 创建一个文件夹
cd /usr/local
mkdir nginx
cd nginx
# 下载tar包
wget http://nginx.org/download/nginx-1.22.1.tar.gz
tar -xvf nginx-1.22.1.tar.gz

image

  • 安装 nginx
# 进入nginx目录
cd /usr/local/nginx
# 进入目录
cd nginx-1.22.1
# 执行命令 考虑到后续安装ssl证书 添加两个模块
./configure --with-http_stub_status_module --with-http_ssl_module
# 执行make命令
make
# 执行make install命令
make install
  • 修改 nginx 配置文件 /usr/local/nginx/conf/nginx.conf
#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        # 自己的博客域名
        server_name  gardencavy.site;

        # 将http跳转到https
		#(第一种)把http的域名请求转成https
		return 301 https://$host$request_uri;
		#(第二种)强制将http的URL重写成https
		rewrite ^(.*) https://$server_name$1 permanent; 

        location / {
            #root为刚才创建的网站根目录
            root   /srv/hexo;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
	
    server {
        listen       443 ssl;
        server_name  gardencavy.site;

        #https证书位置,如果是阿里中购买的域名可以在:数字证书管理服务-->SSL证书-->免费证书中申请
        ssl_certificate      /usr/cert/www_xxx_com.pem;
        ssl_certificate_key  /usr/cert/www_xxx_com.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            #root为刚才创建的网站根目录
            root   /srv/hexo;
            index  index.html index.htm;
        }
    }
}

  • 启动 nginx 服务
​​​​​​​/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
  • 检查一下 80 端口和 443 端口是否已经放行

  • 如果修改了 nginx 配置,可以使用 nginx -s reload 重新加载 nginx

/usr/local/nginx/sbin/nginx -s reload
  • 其他一些可能会用到的 nginx 命令
# 查看nginx进程是否启动
ps -ef | grep nginx
# 退出nginx
/usr/local/nginx/sbin/nginx -s quit
# 重新加载nginx
/usr/local/nginx/sbin/nginx -s reload

# 部署博客

  • 打开 vscode 中的博客项目,修改 _config.yml 文件中的 deploy 配置
# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
  type: git
  repo: git@你的服务器ip:/srv/repo/hexo.git
  branch: master
  • 在 vscode 中安装 hexo-deployer-git 插件
npm install hexo-deployer-git --save
  • 在 vscode 中执行部署命令,遇到密码时输入服务器上设置的 git 账户密码
hexo clean
hexo d -g
  • 在浏览器中输入服务器 ip 或者域名,查看一下是否部署成功

# 禁止 git 用户登陆

  • 因为 git 账户只用于推送代码,可以禁止账户登录服务器,避免服务器被盗
  • 修改 /etc/passwd
  • 将最后一行:
git:x:1000:1000::/home/git:/bin/bash
  • 改成:
git:x:1000:1000::/home/git:/usr/bin/git-shell

# 参考网址

  • https://hjxlog.com/posts/20191130a1.html
  • https://zhuanlan.zhihu.com/p/494698160
  • https://blog.csdn.net/t8116189520/article/details/81909574
阅读次数