生命在于折腾

买VPS真的买了好几个月了,一直想用Hexo搭一个个人博客,在空闲下来的时候到网上搜的教程也是不友好,嗯其实也是我的学习能力太差了啊。然后荒废了几个月白交了几十美刀后,终于重整旗鼓准备把这个事做完。

参考资料:

http://www.jianshu.com/p/0839b09dc381
http://www.fanicy.com/2014/06/01/0001.hexowithvpsdropbox.html
https://www.xmt.design/2016/04/04/blog-depoly-via-dropbox.html

那么我们开始吧。简单介绍一下上面几个教程。其实就是有一篇2014年出的教程,然后后面有2个人根据这篇教程去搭建并填坑,然后把坑晒出来的故事。

再介绍下我,Linux 小白一只。反正对命令不懂就是了。慢慢学着弄。踩了很多坑,特别是在前面有两个人填坑的情况下依然如此,在开始写这篇教程的时候我正看着上面的教程慢慢在做,并且把每一步小白可能会遇见的问题都晒出来。最后,尽量把这个教程做到超细节的地步,毕竟自己深受其苦,衷心希望大家少踩点坑了!哈哈


买 VPS

我买的是Vultr家的,
https://www.vultr.com/?ref=7144468
这是我的推广链接。我当时买的时候有个充100送100的活动,不知道现在还有没,不过他家经常做活动的。

这里另外再开一篇讲怎么买的吧,毕竟是超细节教程。请戳传送门

嘘! 因为某些大家都懂的原因, Dropbox 在国内用不了. 需要借助梯子, 有需要的可以私聊我推荐, 自己用的一个还不错.


开始教程

首先介绍两种快捷登陆VPS服务器的方式(二选一)

快捷登录服务器

  1. 密码快捷登录 (这种方式比较简单, 但是密码有被盗用的风险.)

    右键桌面的putty快捷方式,选择属性,在弹出窗口中的“目标”一栏结尾处空一格输入下面的指令

    root@45.77.00.00 -pw "xxx" root是默认账户名,@后面是服务器IP,xxx是密码。

    完整的实例如下: D:\MySoft\PuTTY\putty.exe root@45.77.00.00 -pw "00000000rD=D"

    win10 系统下也可以去掉引号, 貌似做教程的时候在我 win10 笔记本上就因为引号问题出现异常, 不过后来重新输入又莫名奇妙好了.
    但是确定在不输入引号的情况下也可以正常使用.

  2. 私钥快捷登录 (这种比较复杂, 但是安全性高)

    先去Putty官网下载并安装最新版本的Putty。(没用过xshell,应该跟putty差不多)

    做到教程快完的时候碰见个坑得在这里说明下, 刚开始Putty用的贼溜, 做到教程后半段突然就来一个 “SSH,Telnet and Rlogin client已停止工作” 的提示, 怀疑可能是我为了填下面一个坑装 xshell 后又卸载导致的. 网上有解决方案,碰到这个错的人 戳这里 不过我照着做还是偶尔有几次会这样就是了

    安装后在目录里找到一个PuTTYgen的程序,打开并用它生成公私钥。操作详解如下图,先点Generate 然后把鼠标放在上面空白的区域来回上下搓动,顶部有个绿色的进度条提示,晃动你的右手直到射出, 哦不是, 弹出一串公钥的字符在 key 区域,选中并复制这串字符,接着在下面两个空白输入框输入相同的两次密码(不输也行,不过身为小可爱你还是严谨一点好, 都说了要做好安全措施!)点击 Save private key 弹出一个窗口,选择储存位置取好文件名就可以了。详细的操作看下面的GIF。

    有了私钥文件后, 需要把生成的公钥配置到VPS服务器上去,这一步有两个方案:

配置公钥到服务器

  1. 在Vultr主机创建时,就添加进去

    首先确认你目前位于vultr控制面板的首页Servers(服务器)模块,在页面顶部有一列导航,选择SSH Keys - 点击Add SSH Key 然后填写私钥的名称(随便填一个用来区分)并且把公钥字符串粘贴进去,点击Add SSH Key 这时就生成了一份保存在你账号中的SSH密钥了。 之后 在创建VPS主机的页面中选择这个密钥 就算是添加了到主机中了. 唉, 光讲还是不太放心啊, 给个图你们看看吧.

  2. Vultr主机已创建,无法在控制面板再添加了,必须登陆主机去添加(这里登录就只能用密码去登录先了)

    常规的登录方式就是打开 putty 程序, 然后在 host name 的地方输入服务器 ip , 再点 open 打开链接窗口, 如下图

    弹出警告的话点确定.

    接着会弹出的命令行窗口, 提示 login as : 输入 root 这是主机默认账户名, 除非你改了, 不然就是这个账户. 回车后屏幕上又提示: root@xx.xx.xx.xx's password: 再输入密码, 复制控制面板里主机那串贼长的密码字符, 然后在命令行窗口右键就粘贴进去了, 注意因为密码是隐藏的, 所以粘贴进去了也看不到! 然后敲回车, 看到最后一行是 [root@主机名 ~] # 就登录成功了!

    然后继续添加私钥的步骤, (卧槽劳资在这个坑挖了一下午)

    目前为止我们应该在 /root 目录, 也就是 /~ ,

    接着用 mkdir .ssh 这个命令创建 .ssh 文件夹, 然后 cd .ssh , 接着 vi authorized_keysi 键进入编辑模式, 右键把生成的那串公钥字符串粘贴进去保存退出. (保存退出的方法是: 按 Esc键 退出编辑模式, 键入 :wq 意为保存退出, 如果不幸把文件内容搞乱了的话, 键入 :q! 意为强制退出, 就不会保存你的修改了. 另外, 如果不小心关掉生成公钥的窗口的话就再打开 PuTTYgen , 然后点击 load 找到保存的私钥文件导入进去, 输入设置的密码就看到公钥了.)

    接下来给 authorized_keys 提权 chmod 777 authorized_keys (有看到700就可以了, 但是劳资就是怕权限问题搞出来 BUG ,所以全部 777 简单粗暴)

    然后 vi /etc/ssh/sshd_config , 找到 #StrictModes yes 这一行, i 编辑, 把 # 号删除, 把 yes 改为 no, 也就是 StrictModes no ,然后 Esc ,然后 :wq (这里我说一下, 在网上的教程看到要改好几个地方, 但是劳资亲测证明就改这个就行了.)

    systemctl restart sshd.service 重启ssh服务. 这一步很重要, 我新建了一个服务器验证自己的教程后发现不重启就有问题.为了这详细教程,写的贼累.

    保存退出以后右键桌面 PuTTY 快捷方式, 点击属性, 编辑目标栏输入框, 在最后加个空格, 输入

    -i "D:\private_key.ppk" root@45.32.00.000

    引号内是私钥的绝对路径, root是主机账户, @后面跟服务器地址.

    完整实例为 :

    D:\MySoft\PuTTY\putty.exe -i "D:\private_key.ppk" root@45.32.00.000

    保存后双击打开就自动登录了, 当然,之前在创建私钥的时候如果有设置密码的话,在连接上服务器时还得输入一下密码登陆,但是这就比正常登陆时输入那串又长又复杂的密码简单多了。

升级与安装必备环境

快捷登录配置完就可以开始正式搞 Hexo 环境了, 在putty界面中使用以下命令:

  1. 升级并更新内核:

    yum -y update

    安装进度在 2662 blocks 时会停顿一下, 别乱动, 继续等待按照完成即可.

  2. 安装中文支持(喜欢就装,不喜欢就跳过,英文也挺好的)

    yum groupinstall "fonts"

    碰到提示输入 y 回车继续安装

    (坑1,参考教程中用的是 CentOS 6 ,编辑修改的配置文件为 /etc/sysconfig/i18n, 我创建的版本 CentOS 7 改了字符配置文件为 /etc/locale.conf, 找了好久才在这篇文章里的一个角落找到答案。)

    vi /etc/locale.conf

    按键 i 进入编辑模式, 把内容改为

    LANG="zh_CN.UTF-8"

    按键 Esc 退出编辑模式后, 输入 :wq 意为保存退出. 如果内容弄乱了就输入 :q! 意为强制退出不做改变

    然后输入 reboot 重启命令,等10秒钟后再次用putty登陆主机。随便敲个 1 测试下就知道成没成功了,成功的提示是中文的:未找到命令

  3. 安装 git

    yum install git-core

    碰到提示输入 Y 回车继续安装

  4. 安装 epel ( CentOS 7 直接跳过)

    注意 CentOS 6.x 以上默认有安装 epel , 检查指令 yum repolist ,看输出的内容中有 epel 就对了。
    没有的话使用下面命令安装。(我的有默认安装所以没有验证这里是否确实能安装上,不行就自行去百度)

    导入 epel 的 KEY:
    sudo rpm --import http://download-i2.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6

    32位: sudo rpm -Uvh http://download-i2.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

    64位:sudo rpm -Uvh http://download-i2.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

    最后安装:yum install yum-priorities

  5. 安装 Node.js

    现在是2017年10月27日,最新版本的安装指令如下:

    curl --silent --location https://rpm.nodesource.com/setup_6.x | sudo bash -

    也可以直接去官方找最新的版本: https://nodejs.org/en/download/package-manager/

    接着 sudo yum -y install nodejs

  6. 安装 Dropbox 并添加为自启动

    教程教的新建个用户来创建,劳资就不! 用 root 账户多方便啊.

    32位:cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86" | tar xzf -

    64位:cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

    上面的指令是下载并解压,完成后用 ls 指令是找不到的,因为是个隐藏文件,使用 ls -a 才可以看到。

    ~/.dropbox-dist/dropboxd

    这个指令会启动dropbox进程,首次启动会在窗口中提示

    此电脑尚未与任何 Dropbox 帐户关联...
    请访问 https://www.dropbox.com/cli_link_nonce?nonce=7e6f62a6831dee9123412d0a296bb7f9 来关联此设备。
    

    选中链接后右键就复制了,到电脑浏览器中打开, 点击关联即可绑定你的电脑,忘记这步需不需要注册账号了,反正要用 Dropbox 肯定要注册个账号的. 这时 putty 窗口提示如下 :

    此电脑现在已与 Dropbox 关联。欢迎 geek qian
    

    验证成功后, 使用 Ctrl + C 退出关联程序,接着还要做一些操作,这里是第二大坑! 贼恶心,查了好久才知道 在 CentOS 7 的版本要另外多做下列操作才能让 Dropbox 拥有同步功能,

    wget -O /etc/init.d/dropbox https://gist.githubusercontent.com/thisismitch/6293d3f7f5fa37ca6eab/raw/2b326bf77368cbe5d01af21c623cd4dd75528c3d/dropbox

    wget -O /etc/systemd/system/dropbox.service https://gist.githubusercontent.com/thisismitch/6293d3f7f5fa37ca6eab/raw/99947e2ef986492fecbe1b7bfbaa303fefc42a62/dropbox.service

    chmod 777 /etc/init.d/dropbox 并且 chmod 777 /etc/systemd/system/dropbox.service

    vi /etc/systemd/dropbox 编辑这个文档输入 DROPBOX_USERS="xxx"(Dropbox用户名)

    最后 systemctl daemon-reload

    以及 systemctl start dropbox

    还有 systemctl enable dropbox

    之后在 /root 下面已经生成文件夹 Dropbox 了, 接着下载官方提供的 cli 来控制和管理 Dropbox

    wget https://linux.dropbox.com/packages/dropbox.py

    提权:chmod 777 ./dropbox.py

    提权:chmod 777 /etc/rc.d/rc.local

    编辑并添加为自启动:vi /etc/rc.d/rc.local

    敲下 i 进入编辑模式,光标移动到最后一行末尾回车换行,输入:./root/dropbox.py start

    这样就成功让开机自启 Dropbox 服务了,reboot试一下, 等重启后输入 ps -e查看有没启动 Dropbox 进程, 有就成功了.

    有兴趣的可以实验下, 创建个文本文件上传到你网页版的 Dropbox 盘中,用 cd ~/Dropbox && ls 命令查看下如果在 /root/Dropbox 下有你上传的文本文件就对了。

下载并安装LNMP一键安装包

  • 按官方教程安装

    官方地址戳这里

    首先把当前目录调到 root , cd ~

    然后 screen -S lnmp

    注意我现在是2017年11月1日正常能使用这个版本, 如果有问题就去戳上面官方去找最新的

    wget -c http://soft.vpser.net/lnmp/lnmp1.4.tar.gz && tar zxf lnmp1.4.tar.gz && cd lnmp1.4 && ./install.sh lnmp

    这一步会在 root 文件夹中下载执行 lnmp 一键安装程序,之后的安装方式就按照官方教程来就行,提一点建议,MYSQL 跟 PHP ,我安装的版本都是默认版本,至少不会出现兼容性问题,内存优化我也没装,反正搭建的是静态博客,不会有什么影响。

    这个安装会跑很久. 实测需要 35 分钟左右。慢慢等待。直到界面底下显示绿色字样的 Install lnmp V1.4 completed! enjoy it. 这行字就代表安装成功,如果安装失败的话就去官网找解决方案。

    然后 Ctrl + C 退出安装程序, 接着 cd ~ , 参照这个教程 添加你的域名,SSL 免费证书试着装了一次,失败了,不知道咋回事。

    接着修改安装默认虚拟主机的域名,

    修改方法:vi /usr/local/nginx/conf/nginx.conf 找到 root /home/wwwroot/default,把 default 修改为你的域名,保存,执行:/usr/local/nginx/sbin/nginx -s reload 即可。

    到这一步已经把网站环境搭建好了。

安装Hexo

  • 在Dropbox的同步文件夹中安装hexo

    安装过程中有任何问题去官方文档查看解决方案

    先关闭 Dropbox 的同步功能 ./dropbox.py stop, 因为不保证能一次性装好,所以等装好 hexo 再同步吧。

    此刻我们应该是在 root 目录下的, 使用 cd Dropbox && ls 进入 Dropbox 目录, 不出所料的话此时这个目录只有一个 Dropbox 使用入门.PDF 文件.

    执行 npm install -g hexo-cli 安装 Hexo

    接着 hexo init Hexo , 注意:这里 Hexo 是目录,根据你的喜好你也可以取一个你自己喜欢的。例如 hexoblog

    完成后 cd Hexo 进入该目录,执行 npm install

    到这一步不出所料的话已经完成安装了,使用 hexo s 命令启动 hexo 程序。然后在浏览器中访问 “服务器地址:4000” 这个地址时你已经可以看到 hexo 博客的初始样子了。

使用 incrond 监测文件变化

  1. 安装 incrond

    yum install incron

    出现提示输入 Y 继续安装

  2. 加入开机自启动

    /bin/systemctl start incrond.service (省略教程的一句 service incrond start 因为它还是会提示让你执行前面那段指令)

    chkconfig incrond on

  3. incrond 监测文件夹配置

    echo 'editor = vi' >> /etc/incron.conf

    incrontab -e

    存入以下内容:

    /root/Dropbox/Hexo/source/_posts/ IN_MODIFY,IN_CREATE,IN_DELETE,IN_MOVE /root/runhexo.sh  
    /root/Dropbox/Hexo/themes/ IN_MODIFY,IN_CREATE,IN_DELETE,IN_MOVE /root/runhexo.sh  
    /root/Dropbox/Hexo/_config.yml IN_MODIFY,IN_CREATE,IN_DELETE,IN_MOVE /root/runhexo.sh
    

    这些命令大概意思就是说当检测到 Hexo 包下的有文章更新或者主题变动以及网站配置变化时就会启动 root 目录下的 runhexo.sh 这个脚本。

    ps: 2017年11月2日 更新, 后面在装主题的时候发现 themes 下的配置文件改动时没有执行脚本. 特此提醒下改主题的同学到时自己执行下脚本就行了.

  4. 编写 runhexo 脚本

    cd ~ && vi runhexo.sh

    输入以下内容:

    #!/usr/bin/env bash
    exec 200<$0
    flock -n 200 || exit 1
    sleep 10
    cd /root/Dropbox/Hexo && hexo clean
    cd /root/Dropbox/Hexo && hexo g
    rsync -a --delete /root/Dropbox/Hexo/public/ /home/wwwroot/www.geekqian.com/
    

    这个删除命令我也不知道是什么鬼,只知道这个 rsync 是用来同步文件的, 但是具体的命令在网上找的好累. 嗯执行脚本的时候会提示删除失败,但是同步文件倒是成功了。所以后来就没去管他。

    提权: chmod 777 runhexo.sh

  5. 执行脚本

    ~/runhexo.sh

    第一次运行有可能会提示删除 db.json 失败:因为没有那个文件或目录,这是正常的。因为之前没有用 hexo g 命令构建过所以可能没有这个db.json , 运行过脚本后就有了。第二次运行就不会提示了。

    cd /home/wwwroot/你的域名 && ls 可以看到文件确实都同步过去了。

  6. 打开 Dropbox 测试同步

    cd ~ && ./dropbox.py start

    用 markdown 编辑一个 test 文档丢到 Dropbox 网盘里去。注意存放路径是网盘里的 Hexo/source/_posts/

    这时浏览器直接访问主机IP, 你会发现文章自动部署上去了!好开心!

    这是因为自动检测机制的关系,检测到 Dropbox 中有新的日志更新时自动启动 runhexo.sh 脚本,就把新文章发布到 Hexo 博客中了。

  7. 把域名解析指向你的服务器地址。

    这一步就没啥好说的了,以万网为例,登陆后在控制台的域名模块点击域名的解析按钮,添加两条 A 记录. 主机记录分别是 www 跟 @ ,记录值填你的服务器 ip .

    接着到 Vultr 控制面板 Servers 模块下, 点击顶部导航中的 DNS 进入该模块, 点击 Add Domian 添加域名

    解析时间应该很快的,几分钟。等解析完成后我们可以直接访问你的域名,会自动跳转到你的 Hexo 博客! 酷炫!哈哈

  8. 定制独特的主题风格

    进入 官方主题列表 去查找你喜欢的主题, 作者们都会写上详细的安装教程, 接下来就交给你自己去折腾去了!

    之后我再出一篇相关的教程好了.

好了。到这里总算结束本次超详细教程了,讲道理这教程我做了快一周。期间经历各种坑,而且光 Vultr 主机都建了不下 5 个, 就为了验证这篇教程前后的正确性。算是用尽心血了。当然哪怕我现在做到超详细的地步了也说不定会有人会因为各种各样奇葩的问题而踩坑。但我还是希望各位小伙伴们在搭建 Hexo 时不要放弃,生命在于折腾!感谢你的阅读!