Hexo博客实现自动部署阿里云服务器

准备工作

  1. 搭建Nginx服务器:
  2.    参考:Linux安装Nginx--两种方式

  3. 搭建Git环境:
  4.    参考:Linux安装Git-两种方式详细教程

nginx配置

  在/etc/nginx/vhosts下,新建blog.conf

server{
        listen    80;
        root /usr/share/nginx/blog;
        server_name aliyun-ip*****;
        index index.html index.htm index.php default.html default.htm default.php;
        location ~ .*\.(ico|gif|jpg|jpeg|png|bmp|swf)$
        {
           access_log   off;
           expires      1d;
        }
        location ~ .*\.(js|css|txt|xml)?$
        {
           access_log   off;
           expires      12h;
        }
        location /{
           try_files $uri $uri/ =404;
        }
        access_log  /var/log/nginx/blog.access.log combined;
        error_log /var/log/nginx/blog.error.log warn;
}

  chown -R git:gitgroup blog

GIT账户/组

  接下来我们 创建一个git用户组和用户,用来运行git服务:

groupadd gitgroup
useradd git -g gitgroup
passwd git
''''''

禁用shell登录

  为安全考虑,git用户不允许登录shell,从而只能用 git clone,git push 等登录。

cat /etc/shells // 查看 git-shell 是否在登录方式里面
which git-shell // 查看是否安装

vi /etc/shells
添加上2步显示出来的路径,通常在 /usr/bin/git-shell

  修改/etc/passwd中的权限:

vi /etc/passwd

- git:x:500:500::/home/git:/bin/bash
+ git:x:500:500::/home/git:/usr/local/git/bin/git-shell

  这样用户用git账户ssh连接后只能使用git命令了.
  各种配置配完再禁

创建证书登录

  首先在用户本地主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有:

ssh-keygen -t rsa -C "aliyun_test_git_id_rsa" -f aliyun_test_git_id_rsa

  把本地生成的公钥aliyun_test_git_id_rsa.pub,导入到远程服务器/home/git/.ssh/authorized_keys文件里,一行一个。
  远程服务器如果没有该文件创建它:

su git  # 这步很重要,不切换用户后面会很麻烦

cd /home/git/
mkdir .ssh
chmod 755 .ssh
touch .ssh/authorized_keys
chmod 644 .ssh/authorized_keys

  把本地公钥复制到远程服务器(确保相应的权限):

cat aliyun_test_git_id_rsa.pub >> authorized_keys
# 确保权限
# chmod 700 ~/.ssh -R;
# chmod 600 ~/.ssh/authorized_keys

打开 RSA 认证

  然后就可以去Git服务器上添加你的公钥用来验证你的信息了。在Git服务器上首先需要将/etc/ssh/sshd_config中将RSA认证打开,即:

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

  保存并重启 sshd 服务:

/etc/rc.d/init.d/sshd restart

设置用户信息

git config --global user.name "leeze"
git config --global user.email "leeze0216@163.com"

git config --global core.autocrlf false  // 禁用自动转换,这个不设置后面上传时会出现警告,如下

初始化Git仓库

  su git # 这步很重要,不切换用户后面会很麻烦
  首先我们选定一个目录作为Git仓库:

cd /home/git
mkdir gitrepos
# chown git:gitgroup gitrepo/

  在服务器初始化一个远程 Git 裸仓库 (git init –bare)
  裸仓库与 git init 初使化的仓库不太一样,裸仓库其实相当于通过克隆来的仓库里的.git文件夹,整个裸仓库中只有git索引(index),不包含工作目录。要实现 Push to Deploy,首先我们需要一个裸仓库,进入/home/USER/repos/,创建如下:

cd /home/git/gitrepos
git init --bare blog-bare.git # Git 裸仓库
# chown -R git:gitgroup blog-bare.git

测试git仓库

  另找空白文件夹,执行:

git clone git@server_ip:/home/git/gitrepos/blog-bare.git

  如果能把空仓库拉下来,就说明 git 仓库搭建成功了

配置 Git Hook

  1. post-update
  2.   将目录切换至 /home/USER/repos/xxx-bare.git/hooks,用 cp post-update.sample post-update 复制并重命名文件后 vim post-update 修改,增加执行脚本:

    #!/bin/sh
    
    unset GIT_DIR
    DIR_ONE=/usr/share/nginx/blog/  #此目录为服务器页面展示目录
    cd $DIR_ONE
    
    git init
    git remote add origin /home/git/gitrepos/blog-bare.git
    git clean -df
    git pull origin master

       注意: 一定要unset GIT_DIR清除变量, 不然会引起remote: fatal: Not a git repository: ‘.’错误。

      post-update添加执行权限:

    chmod +x post-update
  3. post-receive
  4.   将目录切换至 /home/USER/repos/xxx-bare.git/hooks,用 cp post-receive.sample post-receive 复制并重命名文件后 vim post-receive 修改,增加执行脚本:

    #!/bin/sh
    git --work-tree=/usr/share/nginx/blog/ --git-dir=/home/git/gitrepos/blog-bare.git checkout -f

      post-receive添加执行权限:

    chmod +x post-receive

本地配置

  修改Hexo博客根目录下_config.yml文件

deploy:
- type: git
  repo: git@aliyun-ip:/home/git/gitrepos/blog-bare.git
  branch: master

  hexo clean hexo g hexo d后,网站更新了。