缘起
最近刚好手上有 vps,本来 blog 是自己放在 gitpage 上的,用的是 jekyll ,不过 jekyll 不好再本机windows上安装,需要安装 ruby 的支持,而 ruby 在windows上又特别难弄。以前弄过一次,不过前段时间重装系统之后,就不想继续把 ruby 装到windows上,麻烦。
刚好了解到 hexo ,知道它只需要安装 node.js, 而 node.js 在windows上还是支持的特别好的,只需要在 node.js 官网 下载安装包下载即可。
hexo 也有很好的中文支持,可以很顺利的在本机上安装好 hexo。
本机操作
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,没有可以自己去购买一个。
国内:阿里云、腾讯云;国外:vultr、digitalocean
环境:Ubuntu 18.10 需要安装:git、nginx
git 安装、配置
- 安装
sudo apt-get install git
安装完成后查看:
git --version

查看到版本信息即说明安装成功。
- 新加git 用户
adduser git
为git 用户添加sudo权限
gpasswd -a git sudo
- 配置
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上时,不用每次都输入密码。
- 配置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
- 配置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
- 关闭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 进去。这样感觉太没效率了。