ZiGma

【Hexo】从Wordpress转Hexo的那些深坑

字数统计: 2k阅读时长: 9 min
2018/06/27

前言

昨天作死开始了从wp到Hexo的迁移之旅,网上大部分Hexo搭建教程都还停留在2017年甚至2016年,所以整个迁移过程历尽深坑不断。

因此我觉得有必要记录一下自己所踩过的那些深坑。

具体有以下几点:

  • 搬瓦工ssh端口;
  • ssh公钥和秘钥问题;
  • VPS文件/文件夹权限问题;
  • post-receive钩子无法正常执行的问题;

主要参考:

Hexo环境搭建个人博客

使用 Git Hook 自动部署 Hexo 到个人 VPS

填坑开始

Hexo的基本运行逻辑就是本地编写Markdown文档——利用Git生成html页面——利用Git推送到VPS——VPS再通过Git钩子发布到Nignx配置文件夹发布。

一、本地环境搭建

安装node.js

Node.js官网下载对应版本一路next安装即可。

安装Git环境

同样在Git For Windows下载后一路next安装。

根据前述参考文章是需要配置环境变量的,但是我本地的Git是因为VS Code才安装的,并没有设置环境变量。虽然也能用但是无法排除本文所提的深坑是因此而出现,所以还是建议配置一下。

安装完Git,需要生成ssh密钥,但是我们先要设置Git用户名,从开始菜单中运行Git Bash。

1
2
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱地址"

设置完成后继续生成ssh密钥

1
ssh-keygen -t rsa -C "你的邮箱地址"

完成后打开目录C:\Users\XXX\.ssh\ 内的id_rsa.pub 文件备用。

创建本地目录

在电脑任意位置创建文件夹作为本地目录用以写作,例如我就是以D:\Hexo\为本地目录。

在此目录下右键点击Git Bash Here分别执行以下命令以安装Hexo:

1
2
3
4
npm install -g hexo-cli
hexo init
npm install
hexo d -fg

完成后可以在D:\Hexo\目录下看到已有本地文件生成,继续在Git命令窗口输入hexo s运行本地服务器,看到提示有http://localhost:4000 后在浏览器打开该地址已验证本地是否部署成功。

二、VPS环境部署

VPS系统我选择的是Centos 7,因为发现Centos 6安装Nginx十分复杂。

1、安装Nginx

· 添加Nginx到YUM源

1
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

· 安装Nginx

1
sudo yum install -y nginx

· 配置Nginx

利用

1
vi /etc/nginx/conf.d/default.conf

编辑default.conf文件,插入如下代码(需要自行更改server_name example.com www.example.com;,其他的路径可以不改动)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 80 ;
root /var/www/hexo; //这里可以改成你的网站目录地址,我将网站放在/var/www/hexo
server_name example.com www.example.com; //这里输入你的域名或IP地址
access_log /var/log/nginx/hexo_access.log; //这里的log文件也可以根据自己网站名字替换
error_log /var/log/nginx/hexo_error.log; //这里的log文件也可以根据自己网站名字替换
location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ {
root /var/www/hexo; //网站目录地址
access_log off;
expires 1d;
}
location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {
root /var/www/hexo; //网站目录地址
access_log off;
expires 10m;
}
location / {
root /var/www/hexo; //网站目录地址
if (-f $request_filename) {
rewrite ^/(.*)$ /$1 break;
}
}
}

然后利用service nginx restart 重启Nginx服务。

· 设置Nginx开机自启

像上面安装完以后Nginx并不会开机自动启动,手动启动就比较麻烦了,因此我们需要设置其开机自动启动。

利用命令建立Nginx脚本

1
vim /etc/init.d/nginx

然后添加命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: NGINX is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
if [ -z "`grep $user /etc/passwd`" ]; then
useradd -M -s /bin/nologin $user
fi
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

保存后设置可执行权限

1
chmod a+x /etc/init.d/nginx

添加chkconfig控制

1
chkconfig --add /etc/init.d/nginx

设置开机自启

1
chkconfig nginx on

2、安装Git

利用以下代码安装Git

1
2
yum update && apt-get upgrade -y #更新内核
yum install git-core

3、新建git用户并添加sudo权限

分别利用以下命令新建git用户、给sudoers文件提权、编辑。

1
2
3
adduser git
chmod 740 /etc/sudoers #改变权限值用于读写
vi /etc/sudoers

找到

1
2
## Allow root to run any commands anywhere
root ALL=(ALL) ALL

后在之后添加以下代码并保存。

1
git    ALL=(ALL)   ALL

随后再将sudoers文件改回原来的权限

1
chmod 440 /etc/sudoers

4、配置ssh登录

1
su git

切换为git用户

1
2
3
4
cd ~
mkdir .ssh && cd .ssh
touch authorized_keys
vi authorized_keys // 在这个文件中粘贴进刚刚Winodws下申请的key(在id_rsa.pub文件中)

因为搬瓦工的ssh端口是随机的,但是git默认使用22端口,我测试在本地修改config文件更换git通讯端口,但是效果并不好,所以我们需要将搬瓦工的ssh端口改回22,并且打开免密登录。

1
vi /etc/ssh/sshd_config

找到以下代码前的#并删除。

1
2
RSAAuthentication yes
PubkeyAuthentication yes

并将最后的Port xxxxx改为Port 22

最后!!!

需要设置.ssh文件夹和authorized_keys文件的权限,分别设置为700和600,不然永远无法push代码到服务器,这个坑足足坑了我一天。

1
2
3
4
cd ~
chmod 700 .ssh
cd .ssh
chmod 600 authorized_keys

现在你可以在Git Bash使用ssh git@你的VPS IP地址测试能否登录,如果可以则代表前三个坑已经填完。

5、初始化git仓库

1
2
3
cd ~
mkdir hexo.git && cd hexo.git
git init --bare

等待初始化完毕后,再创建网站目录

1
2
3
cd /var/www
mkdir hexo
chown git:git -R /var/www/hexo

配置Git Hooks

1
2
3
su git
cd /home/git/hexo.git/hooks # 如果没有hooks目录,就mkdir hooks 自己建一个目录
vi post-receive

输入以下代码

1
git --work-tree=/var/www/hexo --git-dir=/home/git/hexo.git checkout -f

这里是最后一个坑,因为Hexo版本的更新,旧版的post-receive无效,所以需要用新方法。

然后赋予post-receive文件执行权限。

1
chmod +x post-receive

最后将hexo.git目录所有权设置为git。

1
2
cd /home/git
chown -R git:git hexo.git

至此服务端配置完毕。

三、Hexo配置

修改 hexo 目录下的 _config.yml 文件,找到 [deploy] 条目,并修改为

1
2
3
4
deploy:
type: git
repo: git@服务器地址:/home/git/hexo.git
branch: master

至此,Hexo配置完毕,最后在本地D:\Hexo文件夹右键Git Bash Here运行

1
npm install hexo-deployer-git --save

安装git的push插件,完成后再利用

1
hexo g && hexo d

将本地目录生成静态网页并推送到VPS。

齐活。

结束语

鉴于本文并不是在解决问题时撰写,而是成功后根据回忆和参考教程所写,因此在实际操作过程中会有一定出入,如有错误欢迎指正。

希望本文给折腾的你提供些许参考,而不是重复造轮子。

原文作者:ZiGma

原文链接:http://www.zigma.cc/996aa4a683f3/

发表日期:June 27th 2018, 10:44:12 pm

更新日期:May 31st 2020, 10:34:26 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. 前言
  2. 2. 填坑开始
    1. 2.1. 一、本地环境搭建
      1. 2.1.1. 安装node.js
      2. 2.1.2. 安装Git环境
      3. 2.1.3. 创建本地目录
    2. 2.2. 二、VPS环境部署
      1. 2.2.1. 1、安装Nginx
        1. 2.2.1.1. · 添加Nginx到YUM源
        2. 2.2.1.2. · 安装Nginx
        3. 2.2.1.3. · 配置Nginx
        4. 2.2.1.4. · 设置Nginx开机自启
      2. 2.2.2. 2、安装Git
      3. 2.2.3. 3、新建git用户并添加sudo权限
      4. 2.2.4. 4、配置ssh登录
      5. 2.2.5. 5、初始化git仓库
        1. 2.2.5.1. 配置Git Hooks
    3. 2.3. 三、Hexo配置
  3. 3. 结束语