前言
昨天作死开始了从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 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
|
设置开机自启
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
|
找到
后在之后添加以下代码并保存。
随后再将sudoers
文件改回原来的权限
4、配置ssh登录
切换为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 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
文件执行权限。
最后将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插件,完成后再利用
将本地目录生成静态网页并推送到VPS。
齐活。
结束语
鉴于本文并不是在解决问题时撰写,而是成功后根据回忆和参考教程所写,因此在实际操作过程中会有一定出入,如有错误欢迎指正。
希望本文给折腾的你提供些许参考,而不是重复造轮子。