把blog部署VPS上的各种坑

Posted by Eric Jin on 2019-01-31

缘起

最近刚好手上有 vps,本来 blog 是自己放在 gitpage 上的,用的是 jekyll ,不过 jekyll 不好再本机windows上安装,需要安装 ruby 的支持,而 ruby 在windows上又特别难弄。以前弄过一次,不过前段时间重装系统之后,就不想继续把 ruby 装到windows上,麻烦。
刚好了解到 hexo ,知道它只需要安装 node.js, 而 node.js 在windows上还是支持的特别好的,只需要在 node.js 官网 下载安装包下载即可。

hexo 也有很好的中文支持,可以很顺利的在本机上安装好 hexo

本机操作

环境: windows 10 64位
需要安装: gitnode.js

1. 使用npm安装hexo

在本机执行:

npm install -g hexo-cli

2. 初始化 blog

hexo init blog
cd blog
npm install

本例以blog为初始化的文件夹名。可自行定义。 初始化以后,主要配置信息在 _config.yml里面,这个可以去hexo 进行详细了解。
现在来说本机操作已经完成了。让我们先在VPS上操作一番。

VPS操作

假设你已经有了VPS服务器。我是买的 vultr,没有可以自己去购买一个。
国内:阿里云腾讯云;国外:vultrdigitalocean
环境:Ubuntu 18.10 需要安装:gitnginx

git 安装、配置

  1. 安装
sudo apt-get install git

安装完成后查看:

git --version


查看到版本信息即说明安装成功。

  1. 新加git 用户
adduser git

为git 用户添加sudo权限

gpasswd -a git sudo
  1. 配置SSH公钥,两种方法
    第一种(ssh-copy-id):
ssh-copy-id -i ~/.ssh/id_rsa.pub git@服务器ip地址

第二种(直接复制):

cd /home/git                //切换到git用户目录
mkdir .ssh              //创建.ssh目录
cd .ssh
vim authorized_keys

将本地(windows)上的 C:/User/[username]/.ssh/id_rsa.pub 里面的内容复制到 authorized_keys 里面。这样做是为了让每次你把本地的文件 push 到VPS上时,不用每次都输入密码。

  1. 配置VPS 上的git 裸仓
cd /home/git 
mkdir blog.git
cd blog.git
git init --bare   //使用--bare 为裸仓,不包含工作区。我们需要只是这个仓库的共享功能

然后创建VPS上需要发布的网站目录

cd /home/git
mkdir www
cd www
mkdir blog

注: 4步骤中所有文件文件夹的用户组均要设为git用户

sudo chown git:git -R /home/git/www/blog
sudo chown git:git -R /home/git/blog.git
  1. 配置hook,所谓的钩子。

我们这里要使用的是 post-receive 的 hook,这个 hook 会在整个 git 操作过程完结以后被运行。

cd /home/git/blog.git/hook/
vim post-receive

post-receive 文件中写入(两种方式)
第一种(会报):

#!/bin/sh
git --work-tree=/home/git/www/blog --git-dir=/home/git/blog.git checkout -f

第二种:

#!/bin/bash
GIT_REPO=/home/git/blog.git
TMP_GIT_CLONE=/tmp/blog
PUBLIC_WWW=/home/git/www/blog 
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}

保存退出后,不要忘记附可执行权限:

chmod +x post-receive
  1. 关闭git 的shell 权限(自选)
vim /etc/passwd

git:x:1001:1001:,,,:/home/git:/bin/bash

更改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

nginx 安装、配置

安装 nginx

apt-get install nginx

配置路径

cd /etc/nginx/sites-available              
cp default default.bak                 
vim default         

我的配置:

server {
    listen 80 default;              
    root /home/git/www/blog;            
    server_name _;     //你的域名,没有就不写,写_
    access_log  /home/git/log/nginx/blog_access.log;
    error_log   /home/git/log/nginx/blog_error.log;
    error_page 404 =  /404.html;

    location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ {
        root /home/git/www/blog;
        access_log   off;
        expires      1d;
    }

    location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {
        root /home/git/www/blog;
        access_log   off;
        expires      10m;
    }

    location / {
        root /home/git/www/blog;
        if (-f $request_filename) {
        rewrite ^/(.*)$  /$1 break;
        }
    }

    location /nginx_status {
        stub_status on;
        access_log off;
    }
}

保存后退出就好了。
然后重启 nginx

systemctl restart nginx

查看 nginx 状态:

systemctl status nginx

本地发布文章

hexo new "hello,world"

然后在 source\_post 下面就会生成hello,world.md的文件,之后编辑你的世界就可以了。
先在 _config.yml中写入要部署的路径

deploy:
  type: git 
  repo: git@ip:/home/git/blog.git  

然后生成静态页面并且提交到服务器

hexo g -d

更多的关于 hexo 的操作可以去官网看,有中文的文档。

总结

本次第一次操作,弄了很久,有大概一天,解决ssh 没办法生效,总是需要密码的问题,所以本文提供了两种方法。
还有就是nginx配置的时候,各种路径问题,这个需要自己慢慢校验!
最后还有就是本地使用 hexo g -d 部署的时候,服务器上的hook在两种方法中都遇到过问题,第一个采用 bash 命令的时候,总是 permission deny, 这个原因就是发布路径没有变成git 用户所有和权限。 第二个是采用 git checkout 命令时,总是没有work tree,无法操作。这个还需要研究一下。

update 2019-01-31 2:26 pm

刚刚想复现一下 git check 这个问题,靠靠靠,居然好了。。我迷了。。。 这样就不用每次都clone 到临时文件夹,然后删除发布路径的东西以后,再把临时文件夹的东西 copy 进去。这样感觉太没效率了。