原文: https://blog.csdn.net/xyz_dream/article/details/87827480
什么是hexo?
hexo是基于node.js做的一个静态文件生成工具。通过hexo可以将我们写好的markdown文件,生成可视化的html页面。对于程序员来说,写技术博客不需要花里胡哨的排版,简洁大方。详情可以查看github: https://github.com/hexojs/hexo
搭建过程
1. 安装node.js运行环境
这个可以自行百度,网上教程一堆。我是基于docker容器搭建的,不懂docker是什么? 查看我另外一篇文章,
通俗易懂跟你说明白.地址: https://mojun.me/2016/11/08/6311f63b1e68870222ef526f2bda94f8/
上dockerhub把node镜像pull下来就行了. node分为很多版本,我使用基于alpine构建的,比较小巧实用,
麻雀虽小五脏俱全,完全能应付这个博客。
# 拉镜像
docker pull node:lts-alpine
# 运行容器 挂载目录 映射端口
docker run -it -v /home/hexo:/home/hexo -p 4000:4000 –name hexo-blog node:lts-alpine
# 进入容器
docker exec -it hexo-blog /bin/sh
#在/home/hexo目录下:
npm install -g hexo-cli
#初始化hexo:
hexo init blog
# 启动 服务
hexo s # 此时就可以通过4000端口访问了
# 生成静态文件
hexo g -d # 此时生成一个public目录,把public目录通过nginx/apache配置一下即可访问
整体的流程还是挺简单的。切换主题 等配置 网上有许多详细教程,这里就不提了。提一些在途中遇到的问题
遇到的坑
在搭建完毕后我想通过webhook钩子,执行hexo s -g的这么一个过程,能够让我新写的文章重新生成出来,而不是每次手动去执行。webhook钩子就是git仓库(如github 码云)提供的一个功能,你设置git的某个”动作”(如当push的时候,当打tag的时候等等),会去调用你提供的一个公网能访问http接口,从而实现你自己想要在这些动作之后的一些操作。
我采用nginx+php去做一个简单接口,实现的功能内容如下:
# 1. 进入项目目录,拉去最新代码
cd /home/hexo && git pull
# 2. npm更新,防止你在push新的代码中新增依赖包
npm install
# 3. 生成静态文件
hexo g -d
内容很简单。
1. alpine中的crond有坑
以上shell脚本很简单。但是由于webhook有接口超时时间限制(码云 5s),所以接口要做成异步的形式。因为上面的shell脚本执行时间较长,大概在20s左右,所以只能异步执行,同步接口超时。于是,自己把问题复杂化,但是同时也才踩到这个坑。
了解php的同学都知道,php不支持异步。所以我想利用crond,定时去执行我的shell脚本。首先接口把请求时间拿到,为了更准确的执行,我是延时1分钟才执行脚本,把定时任务写进/etc/crontabs/root里面。例如现在拿到时间是 2019-2-20 21:39:00 则 定时任务是 40 21 20 2 * /root/hexo.sh。但是到了时间shell不执行, ps查看 crond进程正在运行,权限也没问题。 但是加入其它简单任务,有时可以运行有时又不可以。。。网上查了好多没找到原因, 后来网上也有提到在alpine中基于busybox的crond不稳定。行吧,以后能不用crond就不用…。 不过在实体物理机上centos7或者ubuntu倒是没有问题。
后来发现是自己想多了,一个shell_exec后台运行shell脚本即可,没那么多乱七八糟的。
shell_exec(‘/root/hexo.sh > /dev/null 2>&1 &’)
# 解释
1. /root/hexo.sh > /dev/null #将脚本标准输出的内容定向输入到一个不存在的设备/dev/null(俗称”黑洞”)
2. 2>&1 # 2代表标准错误 重定向到 &1(标准输出)
3. & # 将任务调度到后台运行。 常见在某个命令后面加 & 不占用当前shell控制台
2. 迁移csdn文章,python安装pyquery失败
我采用python3去迁移我csdn上的文章到新博客地址。其中也是使用了python基于alpine做的镜像,有一个lxml扩展一直装不上。使用apk add lxml也装不上,有报错gcc,加上了gcc也没用。 之后多番尝试,apk add g++就好了。 所以,以后遇到这种问题,最好 gcc和g++都装上,可能有些使用c++写的,光用gcc编译可能出错。
要在docker容器pull代码,映射.ssh目录即可
在docker容器假如没有映射宿主机的.ssh目录,执行git pull报错,拉不到代码,所以确保容器apk add openssh和app add git之后,.ssh也要映射挂载过去即可。
3.hexo第三方评论插件gitalk gitment
我在使用gitment的使用安装各种配置之后,登录个人github会被报[object ProgressEvent]的错。查看很多原因,由于作者的服务器好像不用了导致的,网上有各种解决方案,不过感觉太麻烦,直接换gitalk就好了,很顺利网上搜索详细教程即可,很顺利。
我的个人博客:https://mojun.me