Go!sugsfree之HEXO+VPS使用webhooks方案个人博客搭建
前言
经历几天探索,在hexo和wordpress纠结许久,还是选择hexo搭建好。作为一个轻量级博客系统,hexo的体验个人感觉不错,都是静态的,比较安全,最重要是md用的感觉顺手,哈哈。
出于github国内部分线路访问慢的原因,选择Coding,后面在考虑试试默认github线路+备用Coding双层布局。个人不想备案,所以都选着洋货。。。
一、部署方案介绍
Hexo 提供了5种部署方案(点击查看),但这些部署方案,都有明显的缺点,就是本地需要Hexo环境,无法实现随时随地的更新博客。所以我选择使用Coding仓库的webhook方案实现。将hexo资源放在VPS上,本地只需编写md文件,push到Coding仓库后,再利用webhook向VPS发送请求,VPS收到请求后触发自动部署脚本,最后由脚本生成静态网页,即可上线博客站点。
常见常见方案
- 本地编写MarkDown文档→本地Hexo解析成静态页→提交到VPS上的Git和GitHub等多仓库→Nginx对外服务→用户访问
- 本地编写MarkDown文档→本地Hexo解析成静态页→提交到GitHub→直接用GitHub Page资源→用户访问
- 本地编写MarkDown文档→自动同步到VPS并安装Hexo服务解析成静态页→Nginx对外服务→用户访问
- 本地编写MarkDown文档→自动同步到VPS并安装Hexo服务解析成静态页→Hexo server对外服务→用户访问
发布流程图:
如流程图所示,整个发布系统
共涉及到 3 个环境,分别为本地(写作)、Git 仓库(托管 md 源文件)、服务器(Web 服务)环境。在服务器环境构建静态文件,因此需要在服务器端安装 Hexo 环境。
一个完整的发布流程包含 3 个部分:
如:
流程 ① :写作流程;
流程 ② :发布流程;
流程 ③ :构建流程;
1. 写作流程
本地采用MarkDown编辑器,当写作完成后,利用git环境,push到coding仓库对应分支即可。
#####2. 发布流程
利用Git分支管理策略,可以很好进行发布、修改、整合。当需要发布时,可以将对应开发分支 merge 到 master 分支,然后push master分支,最终实现各分支的合并发布,方便快捷。
#####3. 构建流程
这里使用到Coding的 Webhook 机制,简单来说,就是服务器监听着Coding仓库,一旦触发特定事件就执行构建操作,最终实现用户的自动部署、自动测试等,构建脚本见 Webhook 脚本部分。
当流程 ① 和 ② 结束后,Git 仓库都会向服务器发起一次 HTTP 请求。当收到构建请求后,执行构建操作。构建流程图如下:
首先检查当前变更分支,只有为 master 分支时,执行 pull 操作拉取 md 文件更新,然后再执行 hexo g完成静态文件的构建。
操作流程:
在本地使用Markdown写文章,将.md源文件push到Coding仓库的相应分支,再利用Webhook向VPS发送请求,VPS接收到请求后将相应分支如source分支pull到Hexo的source文件夹,再利用hexo g -d生成静态网页,最终实现自动生成静态文件发布。
##二、环境配置
服务器环境:
Centos 7
nginx1.14
git 1.8.3.1
node.js 8.11.3本机环境:
Windows 10
node.js 8.11.3
git 2.18.0其他:
域名+VPS
三、本地环境搭建
需要安装:git+nodejs
3.1、windows上安装git安装git
从Git官方上获取下载安装程序。然后按默认选项安装即可:
安装完成后,在开始菜单找到"Git" -> "Git Bash ",执行弹出命令行窗既安装成功。

安装完成后,使用 git bash 来设置自己的用户名和 email 信息:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意:
git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
或者使用GitHub Desktop,完全可视化,简单。
3.2、windows安装node.js
从Node.js网站上下载安装包,一路默认下来就行,记得勾选自动配置Path,省得以后麻烦。
查看是否安装成功,显示版本即可
3.3、windows安装hexo(可选)
在dos窗口输入命令操作:
第一步,安装hexo命令行工具,这个工具在服务器端也需要执行安装
npm install hexo-cli -g
第二步,生成一个本地hexo项目
1 | # 创建blog目录,并初始化hexo项目 |
注:
windows用户路径不含中文
第三步,新建一篇文章
1 | hexo new "test post " |
启动后访问 http://localhost:4000/,如图:
hexo new可以在/source/_posts目录下生成test-post.md这一个文件,.md是markdown文件的扩展名,这样就可以使用自己的工具去编辑markdown,比如马克飞象、sublime Text,个人习惯用typore。
推荐两个个Sublime Text插件,MarkDownEditing(markdown写作)+OmniMarkupPreviewer(用于标记文件的实时预览器/导出器)。
四、提交到远程仓库(第三步后可进行提交)
这里得需要一个远程仓库托管代码,可以使用Github或国内的Coding.net。由于Github网速…且对私有项目是收费的,而且我并不愿意别人能访问到自己的部分源文件,所以选择使用Coding。而且,Coding.net服务器在国内,速度也比较理想,上传和访问都比较稳定。。
写作环境提交到coding仓库上,需要配置ssh才能使用ssh地址,也可以选择使用使用https地址,推荐ssh。https每次都需要输入密码,且。《Help.GitHub - SSH key passphrases》里也说了用SSH更方便更安全,不需要去输入长长的密码。
Coding的银牌会员(绑定腾讯云账号即可免费获得)可以创建10个私有项目。.
如果你有兴趣注册Coding账号的话,欢迎使用我的推广链接:https://coding.net/register?key=KCBRQW,或者使用我的邀请码:KCBRQW
4.1 生成SSH私钥及公钥
参考官方教程:https://help.coding.net/docs/project/features/ssh.html#pageTitle
ssh-keygen -t rsa -C "email@email.com"# 填自己的邮箱
# 为了webhooks编写方便,可不用设置密码,默认回车即可。
如图:
windows下会在C:\Users\用户\.ssh下生成两个文件id_rsa和id_rsa.pub,再将id_rsa.pub的内容复制到coding账户中的“SSH公钥”选项中即可,如图:
注: 本地与VPS都需要生成及添加到Coding
如果需要通过webhooks实现服务器自动化部署,推荐使用ssh会更方便一些
使用下面的命令测试是否可以连接上Coding
ssh -T git@git.coding.net
效果图:
4.2 创建项目为hexo(自定义)
在coding上新建一个项目名为hexo
4.3 hexo初始化并提交到coding
本地中,在hexo目录初始化本地仓库,并提交到Coding
1 | git init |
完成后,返回Coding即可查看到提条的代码了:
五、服务器环境搭建
需要安装:nginx+git+nodejs
也可以采用LNMP、LAMP、宝塔作为web环境。
5.1、nginx安装:
编译安装请参考本博客中nginx或tengine的安装。
通过 yum方式安装比较麻烦,还需要安装epel依赖库,下面介绍一种最简单的安装方法
5.1.1、获取nginx安装源
1 | cd /etc/yum.repos.d/ |
在 yum.repos.d 文件下新建一个nginx.repo,然后将下面的内容拷贝进去,:x保存退出
vim nginx.repo
1 | [nginx]name=nginx repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/gpgcheck=0enabled=1 |
5.1.2、 从配置文件安装nginx
执行下面的命令直接从配置文件安装 nginx
1 | yum install nginx -y |
5.1.3、启动nginx
1 | nginx |
然后打开服务器所在的IP测试nginx是否安装完成。
附:
安装好后nginx服务器后默认目录是/usr/share/nginx/html
第二次部署博客采用宝塔部署了,更方便点。
5.2、git 部署
安装git
1 | yum install git-core |
设置Git用户名和邮箱
安装完成后,在VPS上设置Git用户名和邮箱,这里的配置最好与写作环境的git用户与邮箱一致。
1 | git config --global user.name "username" git config --global user.email "email@email.com" |
5.3、从远程仓库中获取代码(验证git配置)
这里也需要配置ssh才能使用ssh地址,也可以选择使用使用http地址。但最好与写作环境一致。
生成SSH私钥及公钥
同样的VPS也要配置ssh密钥,添加到coding公钥里,才能连接成功,否则会出现Permission denied (publickey).问题
ssh-keygen -t rsa -C "email@email.com"# 填自己的邮箱 # 为了webhooks编写方便,可不用设置密码,默认回车即可。
如图:3次回车,设置密码为空

VPS下最终生成下生成两个文件id_rsa和id_rsa.pub。再使用cat id_rsa.pub命令将id_rsa.pub的内容复制到coding账户中的“SSH公钥”选项中即可,如图:
enter code here
使用下面的命令测试是否可以连接上Coding
ssh -T git@git.coding.net
效果图:
创建项目存放目录:
项目存放目录,既可做为网站根目录:
mkdir -p /home/www/hexo
获取代码:
1 | cd /home/www/hexogit initgit remote add origin git@git.coding.net:Gs0nlyu_Star2/hexo.gitgit pull origin source |
效果图:
5.4、Nodejs部署
HEXO介绍
Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。
安装前提
安装 Hexo 相当简单,只需要先安装下列应用程序即可:
Hexo 版本 最低兼容 Node.js 版本 5.0+ 10.13.0 4.1 - 4.2 8.10 4.0 8.6 3.3 - 3.9 6.9 3.2 - 3.3 0.12 3.0 - 3.1 0.10 or iojs 0.0.1 - 2.8 0.10
node软链接安装(在用方法)
傻了,后面才知道可以直接设置环境变量使用,比编译方便太多了,就是模块每次都要软链接下,模块不多的话,还是强烈推荐这种。
xz文件是一个独立程序包文件,放到任何位置都可以执行,不需要安装到/usr/bin 或者 /usr/sbin目录里,为了让shell能够找到nodejs需要配置一下环境变量
1. 获取node.js
1 | cd /usr/local/src/ |
2. 解压
1 | xz -d node-v16.13.1-linux-x64.tar.xz |
3. 文件测试
切换到node bin目录,找到 node ,npm , npx三个文件
1 | cd node-v16.13.1-linux-x64/ |
4. 设置全局变量
做软链 使 命令全局可用 node 目录写自己对应的目录

1 | ln -s /usr/local/src/node/bin/node /usr/bin/node |
注:
1、
软链接,安装npm模块后,需要
npx hexo来运用,直接hexo命令会提示找不到解决方法:
添加
hexo软链接
1
2
3 ln -s /usr/local/src/node/bin/hexo /usr/bin/hexo
ln -s /lib/node_modules/hexo-cli /usr/bin/hexo-cli
5. 测试+完成
任意目录可执行,既完成。

node编译安装(旧方法,可忽略)
1. 获取node.js
官方:
https://nodejs.org/en/download/ (稳定版)或 https://nodejs.org/en/download/current/ (最新版)
1 | wget https://nodejs.org/dist/v16.13.1/node-v16.13.1-linux-x64.tar.xz |
2. 解压并重命名
1 | tar zxvf node-v16.13.1.tar.gz && mv node-v16.13.1 node |
3. 安装node.js
1. 进入目录
1 | cd node |
使用ls -l列出当前文件
2. 编译
./configure --prefix=/data/server/node/v16.13.1 && make && make install
注:
可以使用
make clean清理掉make file,重新编译
有可能遇到gcc+ 没有或者需要版本为4.9.4以上。
部分问题如图:
- 遇问题可以使用命令
gcc -v(gcc --version) 或 g++ -v(g++ --version)检测- 根据结果显示,选择安装或升级版本,具体参考文末
"问题解决”
- gnu++14需要g++5.2以上,而centos默认的g++只有4.8.5
3. 配置NODE_HOME,进入profile编辑环境变量
vim /etc/profile
1 | set for nodejs |
4. 编译/etc/profile使配置生效
1 | source /etc/profile |
5. 验证是否安装配置成功
1 | [root@host 8.11.3] |
注:npm模块安装路径
/usr/local/node/8.9.4/lib/node_modules/
6. nodejs卸载
卸载npm
1 | npm uninstall npm -g |
卸载node
1 | yum remove nodejs npm -y |
残留清理:
1 | 进入 /usr/local/lib 删除所有 node 和 node_modules文件夹 |
编译安装的卸载方式:
使用--prefix选项的卸载:
- 当某个安装的软件不再需要时,只须简单的删除该安装目录,就可以把软件卸载干净;
- 移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统下)
make方式:
- 在源码包目录中使用
make uninstall
其他方式:
一个临时目录重新安装一遍,如:
1 | $ ./configure --prefix=/tmp/to_remove && make install |
然后遍历/tmp/to_remove的文件,删除对应安装位置的文件即可(因为/tmp/to_remove里的目录结构就是没有配置--prefix选项时的目录结构)。
5.5、HEXO 部署
1. 安装hexo模块
1 | cd /home/www/hexo |
2. hexo静态编译
1 | hexo init # 初始化 |
这一步会在hexo目录下生成一个public目录,这里面就是编译后的静态文件目录。
国内部分云主机,无法访问github时,可以修改本地hosts文件件,绕过国内dns解析:
/etc/hosts
使用nslookup获取到的ip解析手动加入文件:
1 20.205.243.166 github.com 185.199.110.133 raw.githubusercontent.com正常来说,加入上面两个github地址即可。
3. Hexo常见的命令:
生成静态文件:
1 | hexo g |
清除缓存文件 (db.json) 和已生成的静态文件 (public)
hexo clean
生成站点map
npm install hexo-generator-sitemap --savenpm install hexo-generator-baidu-sitemap --save
相关连接
具体hexo命令参考:
https://hexo.io/zh-cn/docs/commands
具体heox配置参考:
https://hexo.io/zh-cn/docs/configuration
5.6、配置nginx
1. 新建hexo.conf
配置nginx,让80端口指向博客静态页面首页,在 nginx 配置conf.d文件目录中新建一个hexo.conf文件
1 | cd /etc/nginx/conf.d/vi hexo.conf |
2. 写入内容:
在hexo.conf中写入相应的配置并保存,注意细节,不要少分号。
1 | server { listen 80; # 监听端口 server_name sugsfree.com www.sugsfree.com; # 你的域名 location / { root ~/hexo; index index.html; }} |
3. 重启nginx
重启 nginx 使服务生效
nginx -s reload
重启后就可以通过https://www.sugsfree.com访问hexo了。
这里可能出现的问题:
- 404 或者 403 报错
- 访问页面是一片空白
- CSS样式问题
解决参考“问题解决”
六、Git WebHooks 自动化部署
每次本地更新博客,push到coding上,还要上VPS在git pull,这是一件很麻烦的故事,我需要一个webhooks方案,在coding有push操作时能自动更新并部署博客。
可参考官方webhook文档:
https://open.coding.net/webhooks/
6.1、那么WebHooks是什么?
WebHooks就是在你本地执行git push的时候,
远程仓库(coding)会检测到仓库的变化,并发送一个请求到我们配置好的WebHooks(既钩子)。
实现WebHooks自动化部署的推荐条件:
- 服务器端配置ssh认证
- 服务器端配置node.js服务,接受Coding发来的请求。
实现自动化部署只需要在本地将.md源文件push到Coding仓库的source分支,后续的操作将利用Coding的Webhook功能和VPS端的js脚本来自动完成。
6.2、远程仓库配置WebHooks
输入url:http://www.sugsfree.com:9292/webhooks/push/167349
Coding WebHooks 配置界面
这张图的配置的意思是:当仓库发生push的时候,会发送一个请求到http://www.sugsfree.com:9292/webhooks/…
为了服务端的简易处理,这里没有使用token,而是将url地址当做token,167349就充当了token的角色。这里的端口以及后缀可以自行修改。如果存在CDN则需要将主机地址改为IP地址,否则连接不上
远程仓库配置完后,就需要考虑服务器如何接收这个请求并重新部署hexo了。
七、VPS上部署响应WebHooks的服务
我使用的是nodejs语言去响应。
在VPS上传同步source文件夹
1 | cd path/to/Blog/source git init git remote add origin git@git.coding.net:Gs0nlyu_Star2/sugsfree.git git checkout -b source git add -A git commit -m "Source Upload" git push origin source |
7.1 新建webhooks.js文件
在本地hexo目录中新建一个webhooks.js文件,vim webhooks.js内容如下:
1 | var flag = 0var http = require('http')var exec = require('child_process').exechttp.createServer(function (req, res) { // 该路径与WebHooks中的路径部分需要完全匹配,实现简易的授权认证。 if(req.url === '/webhooks/push/167349'){ if(flag == 0) { // 如果url匹配并且运行过程没有产生其他变化,表示认证通过,则执行 sh ./deploy.sh exec('sh ./deploy.sh') flag = 1 //flag值为1,表示成功 } else { flag = 0 //flag值为0,表示失败 } } res.end()}).listen(9292) |
代码意义:
启动一个nodejs服务,监听4002端口。当请求过来的url完全匹配的时候,执行deploy.sh。
7.2 新建deploy.sh脚本
再新建一个文件deploy.sh处理部署相关脚本,内容如下:
1 | cd /home/www/hexo/sourcegit reset --hardgit pull origin mastercd /home/www/hexo/hexo cleanhexo g |
增加执行权限:
chmod +x deploy.sh
7.3 push新建文件到服务器上
将新增的webhooks.js与deploy.sh两个文件push到服务器。
然后在服务器中启动nodejs服务监听webhooks,服务器会自动更新部署博客
node ./webhooks.js
7.4 启动进程守护
要将进程加入守护,可以通过 pm2 来实现
npm install pm2 --global
7.5 pm2启动webhooks.js,将脚本运行在后台
1 | pm2 start /home/www/hexo/webhooks.js |
7.6 加入开机自启
如果服务器重启,我们还要手动开启webhooks服务,所以我们将上面的命令加入开机启动就可以了,将命令加入/etc/rc.d/rc.local中,即可实现开机自启
将命令写到脚本/home/www/hexo/webhooks.js中:
/sbin/runuser -l root -c "/usr/bin/pm2 start /home/www/hexo/webhooks.js"
在/etc/rc.d/rc.local中添加刚才的脚本:
/data/www/sugsfree/webhooks.js 2>&1 > /dev/null &
查看启动状态
重启VPS,然后用命令pm2 show webhooks查看 webhooks 是否已经启动。
八、在本地同步soucre文件夹
1 | //创建 path/to/source git init git remote add origin git@git.coding.net:Gs0nlyu_Star2/sugsfree.git git checkout -b source //或者使用//git add -A//git commit -m "Source Upload" git pull origin source//git push origin source -f,强行让本地分支覆盖远程分支。。。 |
这样一来,以后只需要在本地将.md源文件push到Coding仓库的source分支,就可以实现自动部署了。
##九、全站HTTPS
因为http是明文传输,通过http协议传输的内容很容易查看,为了安全,所以选用了https,既“HTTP over SSL/TLS”超文本传输安全协议。
要部署https就要需要一张被信任的CA( Certificate Authority )也就是证书授权中心颁发的 SSL 安全证书,并且将它部署到你的网站服务器上。部署上,用户访问页面时网址前就会有把受浏览器信任的小绿锁。
遵从免费、高可用性等等原则,选择Let’s Encrypt免费证书进行部署。
Let’s Encrypt是第一个免费并且开源的CA,且已经获得Mozilla、微软等主要浏览器厂商的根授信,是免费SSL证书中首选,wzfou.com用的SSL就是这家。目前已经推出了免费泛域名证书,
注:
使用 Let’s Encrypt 的免费证书,每三个月要续签一次。
接下来,就记录一下,具体的实施步骤:
第一步、安装Certbot
安装可以通过 Certbot 的傻瓜式操作
Certbot 是 ISRG 的发起者 EFF (电子前哨基金会)为 Let’s Encrypt 项目发布了一个官方的客户端,利用它可以完全自动化的获取、部署和更新安全证书。
Certbot 的官方网站是 https://certbot.eff.org/ ,进入官方后就可以选择自己的web服务器和系统,并且EFF 官方会给出详细的使用方法,当然也可以参考本文章方法快速部署的。
在CentOS7上安装Certbot有三种方式:
- 使用Certbot官方提供的对应平台的RPM包安装
- 使用Certbot官方的提供的certbot-auto安装
- 使用pip安装Certbot,因为Certbot是Python程序
安装Certbot客户端
1 | wget https://dl.eff.org/certbot-auto |
第二步、赋权
赋权可执行
chmod a+x certbot-auto
第三步、执行脚本
执行客户端即可获取证书,Cerbot会自动对nginx进行配置。
sudo ./certbot-auto --nginx
执行后开始安装证书,中间需要我们输入邮箱,域名等等,按照步骤操作就可疑了,最后顺利申请到证书。
第四步、自动更新Let’s Encrypt证书
Let’s Encrypt证书的有效期为三个月,所以Let’s Encrypt证书到期时,要使用Certbot更新证书,Certbot推荐使用Cron或者Systemd Timer每天运行两次更新证书命令,当证书不到期时,不会更新证书,当证书到期后,会自动更新证书。
1)定义Systemd服务certbot.service:
1 | sudo vi /usr/lib/systemd/system/certbot.service |
内容如下:
1 | [Unit]Description=Let's Encrypt renewal[Service]Type=oneshotExecStart=/usr/bin/certbot renew --quiet --agree-tos |
ExecStart:要指向你系统中certbot命令,因为你可能使用其他方式安装。
2)定义Systemd Timer:
1 | sudo vi /usr/lib/systemd/system/certbot.timer |
内容如下:
1 | [Unit]Description=Twice daily renewal of Let's Encrypt's certificates[Timer]OnCalendar=0/12:00:00RandomizedDelaySec=1hPersistent=true[Install]WantedBy=timers.target |
3)使Timer开机自动运行
1 | sudo systemctl enable certbot.timer |
4)启动Timer
1 | sudo systemctl start certbot.timer |
这样系统当Timer定时运行对应的certbot.service服务。
问题解决:
webhook+https 没检查完整
图片显示不了the requested content cannot be loaded. Please try again later
一、Centos7 安装gcc-5.2
yum源: 阿里云源
问题一:
node安装时WARNING: warnings were emitted in the configure phase
提示信息:
1 | WARNING: C++ compiler too old, need g++ 4.9.4 or clang++ 3.4.2 (CXX=g++)creating icu_config.gypi |
或者:
1 | WARNING: failed to autodetect C++ compiler version (CXX=g++)WARNING: failed to autodetect C compiler version (CC=gcc)Node.js configure error: No acceptable C compiler found! Please make sure you have a C compiler installed on your system and/or consider adjusting the CC environment variable if you installed it in a non-standard prefix. Makefile:102: *** Missing or stale config.gypi, please run ./configure. Stop. |
解决:
安装并升级gcc++ 至4.9.4及以上。
(gcc和g++都是GNU(组织)的一个编译器。不愿折腾的建议安装4.9)
参考文档:
- gcc和g++的区别 (很详细的描述)
https://my.oschina.net/alphajay/blog/3989
1. 获取文件:
打开 https://ftp.gnu.org/gnu/gcc/ 选择一个版本,这里我们选择版本10.3.0.:
1 | cd /usr/local/src |
2. 安装基本编译环境
1 | yum groupinstall "Development Tools" |
3. 解压并检测依赖脚本
1 | tar -zxvf gcc-10.3.0.tar.gz |
根据提示自动下载依赖,注意提示失败的版本号

1 | //检测依赖脚本并自动安装如果不成功可以手动下载依赖 |
当然以上库可以在ftp://gcc.gnu.org/pub/gcc/infrastructure/下载
4. 编译生成config文件
生成编译文件:
1 | mkdir gcc-build-10.3.0 |
5. 执行编译,生成 Makefile 文件。
这个过程很久,大概花了我一个小时。
1 | make -j4 #(-j4选项是make对多核处理器的优化,如果不成功请使用 make,相关优化选项可以移步至参考文献[2]。建议不要使用make -j来编译,虽然可以缩短编译时间,但极大可能会编译失败) |
可以用命令
echo $?查看是否正确(回显为0既正确,其他皆有错)
6 重启,查看gcc版本:
1 | gcc -v |
如图:
5. 验证特性:
尝试写一个C++11特性的程序段 tryCpp11.cc,使用了shared_ptr
1 | //tryCpp11.cc#include <iostream>#include <memory>int main(){ std::shared_ptr<int> pInt(new int(5)); std::cout << *pInt << std::endl; return 0;} |
验证文件:
1 | g++ -std=c++11 -o tryCpp11 tryCpp11.ccchmod 755 text.cc./tryCpp11 |
二、 安装中问题解决:
问题现象二:
使用make编译时出现错误如下:
1 | make[3]: Entering directory `/home/ec2-user/gcc-7.2.0/build/gcc'build/genattrtab ../../gcc/common.md ../../gcc/config/i386/i386.md insn-conditions.md \ -Atmp-attrtab.c -Dtmp-dfatab.c -Ltmp-latencytab.cmake[3]: *** [s-attrtab] Killedmake[3]: Leaving directory `/home/ec2-user/gcc-7.2.0/build/gcc'make[2]: *** [all-stage1-gcc] Error 2make[2]: Leaving directory `/home/ec2-user/gcc-7.2.0/build'make[1]: *** [stage1-bubble] Error 2make[1]: Leaving directory `/home/ec2-user/gcc-7.2.0/build'make: *** [all] Error 2 |
原因:
使用的是较小的内存实例,例如nano或micro实例,则由于内存不足,编译可能会过早结束。会出现以上错误。
解决:
- 在这种情况下,建议使用以下命令保护大约600 MB的交换区域。
1 | SWAP=/tmp/swap dd if=/dev/zero of=$SWAP bs=1M count=600 mkswap $SWAP sudo swapon $SWAP |
- 先看看config.log
1 | g ++:无法识别的选项'-static-libstdc ++' |
怎么了?:https://gcc.gnu.org/wiki/FAQ#configure
解决方案:https://gcc.gnu.org/ml/gcc-help/2014-08/msg00064.html
解决方法:
删除gcc源目录并再次提取新的源,重新构造安装即可
二、 解决node安装,源码编译升级安装了gcc,出现类似’GLIBCXX_3.4.21’ not found
编译安装node出现 GLIBCXX 版本错误:
1 | /usr/local/src/node-v8.9.4/out/Release/mksnapshot: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /usr/local/src/node-v8.9.4/out/Release/mksnapshot)/usr/local/src/node-v8.9.4/out/Release/mksnapshot: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/local/src/node-v8.9.4/out/Release/mksnapshot)make[1]: *** [/usr/local/src/node-v8.9.4/out/Release/obj.target/v8_snapshot/geni/snapshot.cc] Error 1rm 7680655c26d9eea5b14de312f31ce30a749c41e0.intermediatemake[1]: Leaving directory `/usr/local/src/node-v8.9.4/out'make: *** [node] Error 2 |
原因猜想:
为了安装最新版本的Node.js(最新版本的Node.js使用了C++ 11中,而C++ 11需要code>gcc 4.8+才能支持),将gcc升级到了当前最新版本v 8.2.0。
源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。
解决方法:
在上一个问题中升级 gcc 生成的动态库并没有替换老版本的动态库,我们需要去手动替换一下。升级后,成功编译安装了新版本的Node.js(v 4.2.1),但运行时程序时出现了以下错误:
1. 查看 GLIBCXX 版本:
1 | [root@host gcc-build-8.2.0]# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXXGLIBCXX_3.4GLIBCXX_3.4.1GLIBCXX_3.4.2GLIBCXX_3.4.3GLIBCXX_3.4.4GLIBCXX_3.4.5GLIBCXX_3.4.6GLIBCXX_3.4.7GLIBCXX_3.4.8GLIBCXX_3.4.9GLIBCXX_3.4.10GLIBCXX_3.4.11GLIBCXX_3.4.12GLIBCXX_3.4.13GLIBCXX_3.4.14GLIBCXX_3.4.15GLIBCXX_3.4.16GLIBCXX_3.4.17GLIBCXX_3.4.18GLIBCXX_3.4.19GLIBCXX_DEBUG_MESSAGE_LENGTH |
并没有 GLIBCXX_3.4.21和GLIBCXX_3.4.20
2. 执行以下命令,查找编译 gcc 时生成的最新动态库:
1 | find / -name "libstdc++.so*" |
3.查询结果:
如图:
4. 将上面的最新动态库 libstdc++.so.6.0.24 , 复制到 /usr/lib64 目录下:
1 | cp /usr/local/src/gcc-8.2.0/gcc-build-8.2.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25 /usr/lib64 |
5. 切换工作目录至 /usr/lib64,删除原来的软链接, 将默认库的软链接指向最新动态库:
1 | cd /usr/lib64 |
5. 重新查询:
1 | [root@host node-v8.9.4]# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXXGLIBCXX_3.4GLIBCXX_3.4.1GLIBCXX_3.4.2GLIBCXX_3.4.3GLIBCXX_3.4.4GLIBCXX_3.4.5GLIBCXX_3.4.6GLIBCXX_3.4.7GLIBCXX_3.4.8GLIBCXX_3.4.9GLIBCXX_3.4.10GLIBCXX_3.4.11GLIBCXX_3.4.12GLIBCXX_3.4.13GLIBCXX_3.4.14GLIBCXX_3.4.15GLIBCXX_3.4.16GLIBCXX_3.4.17GLIBCXX_3.4.18GLIBCXX_3.4.19GLIBCXX_3.4.20GLIBCXX_3.4.21 |
搞定,收工~~那node咋办??回头继续重新编译。
参考文档:
解决类似 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found 的问题
https://itbilu.com/linux/management/NymXRUieg.html
三、 hexo d 时SSH端口错误
问题:
服务器默认SSH端口改变
1 | ssh: connect to host www.sugsfree.com port 22: Connection refusedfatal: Could not read from remote repository.Please make sure you have the correct access rightsand the repository exists.FATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.htmlError: ssh: connect to host www.sugsfree.com port 22: Connection refused |
解决方法:
主要是改Hexo的配置_config.yml和主题目录下的_config.yml,修改repository 的配置
1 | # Deployment## Docs: https://hexo.io/docs/deployment.html##如果出于安全或其它原因考虑,你修改了 SSH 默认的端口,那么上面 repository 的配置要做如下修改:##repo: ssh://yourusername@server:<yourport>/~/hexo.git##示例deploy: type: git repo: github: https://github.com/GitHubusername/example.github.io.git #同步到GitHub vps: ssh://git@example.com:22231/~/hexo.git #同步到自己的VPS branch: master message: Hexo update |
四、HEXO访问页面问题:
1. 404 或者403报错。
因为 nginx 是以 nginx 用户运行的, 而nginx没有博客目录的读写权限,有两个方法可以解决:
- 给博客目录赋权,让 nginx 用户拥有读写权限
- 让 nginx 以 root 用户运行
为了安全起见,选择了第一种:
更换博客目录所属用户
修改nginx的bash,使其不能登录系统
vim /etc/passwd
更换目录所属用户为nginx用户,并赋权读写。
chown nginx:nginx /home/www/hexo
chmod 644 /home/www/hexo
更改nginx.conf配置文件
1 | vim /etc/nginx/nginx.conf |
将user nobody; 改成 user nginx; 即可。然后重启 nginx。
2. 访问页面是一片空白
解决:
之前用到的主题并没有上传到 远程仓库Coding上,将主题拷贝到 themes 文件夹下,然后部署 hexo 就可以正常访问了。
3.CSS样式问题
因为博客路径错误,这会导致 CSS 和图像等资源的路径解析错误。
解决方案一:更改 Hexo 的_config.yml 中的 url 参数为相应新路径。
解决方案二:更改 Coding 代码仓库的存放博客的路径。
参考文档:
hexo生成的静态页本地打开css引用不到?
https://segmentfault.com/q/1010000005676078
五、Hexo之解决 FATAL Cannot read property ‘code’ of undefined
运行 hexo g 出现了 ERROR,
1 | FATAL Cannot read property 'code' of undefined |
出现上述Error着实让人头疼,不管新建post.md还是其他更改,均无法完成 hexo g -d (即生成和推送)。
尝试了很多更改,终于奏效了一个,在此备忘并分享,步骤如下:
打开Hexo根目录下的 package.json 文件,
将其内容更改如下:
1 | "{ |
以上更改完成后,即可恢复 hexo g -d 正常运行啦。
六、HEXO 卸载:
单个项目直接删掉文件夹
删除系统:
3.0.0版本执行
1 | npm uninstall hexo-cli -g |
之前版本执行
1 | npm uninstall hexo -g |
七、git问题:
8.1 GitHub常见操作和常见错误(fatal:remote origin already exists)(fatal: Couldn’t find remote ref master)
原文地址:http://blog.csdn.net/dengjianqiang2011/article/details/9260435
8.2 git pull error: The following untracked working tree files would be overwritten by merge
参考地址:
https://github.com/avast-tl/retdec/issues/92
8.3 解决Git中fatal: refusing to merge unrelated histories
Git的报错
在使用Git的过程中有时会出现一些问题,那么在解决了每个问题的时候,都需要去总结记录下来,下次不再犯。
一、fatal: refusing to merge unrelated histories
今天在使用Git创建项目的时候,在两个分支合并的时候,出现了下面的这个错误。
1 | ~/SpringSpace/newframe on master ⌚ 11:35:56$ git merge origin/druidfatal: refusing to merge unrelated histories |
这里的问题的关键在于:fatal: refusing to merge unrelated histories
你可能会在git pull或者git push中都有可能会遇到,这是因为两个分支没有取得关系。那么怎么解决呢?
二、解决方案
在你操作命令后面加--allow-unrelated-histories
例如: git merge master --allow-unrelated-histories
1 | ~/SpringSpace/newframe on druid ⌚ 11:36:49$ git merge master --allow-unrelated-historiesAuto-merging .gitignoreCONFLICT (add/add): Merge conflict in .gitignoreAutomatic merge failed; fix conflicts and then commit the result. |
如果你是git pull或者git push报fatal: refusing to merge unrelated histories
同理:
1 | git pull origin master --allow-unrelated-histories |
8.4 解决冲突:
问题现象,分支冲突问题:
1 | Automatic merge failed; fix conflicts and then commit the result. |
解决:
8.5 Git:代码冲突常见解决方法
如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候,
在发布这个配置文件的时候,会发生代码冲突:
1 | error: Your local changes to the following files would be overwritten by merge: source/_posts/木马病毒入侵手工排查之XorDDos/木马病毒入侵手工排查之XorDDos.mdPlease commit your changes or stash them before you merge.AbortingUpdating de75003..d80f779 |
如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:
1 | git stashgit pullgit stash pop |
然后可以使用git diff -w +文件名 来确认代码自动合并的情况.
反过来,如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:
1 | git reset --hardgit pull |
其中git reset是针对版本,如果想针对文件回退本地修改,使用
1 | git checkout HEAD file/to/restore |
8.6 设置了 SSH KEY还需要密码登录
修改_config.yml,将部署方式从https方式修改为ssh方式。
1 | # Deployment |
修改为
1 | # Deployment |
8.7 fatal: unable to access ‘https://github xxxxxxxxx的解决方法
问题重现:
1 | $ npm install https://github.com/CodeFalling/hexo-asset-image --save |
解决方法:
将命令中的 https改为 git
1 | npm install git://github.com/CodeFalling/hexo-asset-image --save |
八、Hexo部署问题
Error: ENOENT: no such file or directory
如果你遇到了这个错误,有可能是你的文件名、分类或者标签的名字混淆了大写和小写,你可以尝试检查每一个标签和分类的名称,是否大小写一致来修复这一问题。
修正软链接包名
1 mv node-v16.13.1-linux-x64 node添加软链接
1 ln -s /lib/node_modules/hexo-cli /usr/bin/hexo-cli
Warning: Accessing non-existent property ‘cd’ of module exports inside circular depend
**原因:**nodejs版本太高导致,我用的是nodejs 14
两种解决方法:
第一种:
1 | npm install -g shelljs@0.8.4 --save |
第二种:
1 | 使用nodejs v12版本以下 不要用太高的版本 |
参考文献:
- Centos7升级gcc学习笔记[2]
http://www.cnblogs.com/highway-9/p/5628852.html - gcc升级后更新libstdc++.so.6动态库https://blog.csdn.net/na_beginning/article/details/53413997
- 如何配置 SSH 公钥访问代码仓库
https://coding.net/help/doc/account/ssh-key.html - Hexo配置说明:
https://hexo.io/zh-cn/docs/configuration.html - Node.js 安装笔记
https://note.leodev.me/2018/03/30/nodejs-installation-notes/ - Hexo 博客 travis-ci 自动部署到VPS
https://segmentfault.com/a/1190000005687985 - 如何在服务器上搭建hexo博客https://segmentfault.com/a/1190000009363890#articleHeader0
- 关于hexo主题next博客加载空白页的处理
https://123sunxiaolin.github.io/2016/11/12/关于hexo主题next博客加载空白页的处理/ - 启用Hexo开源博客系统
https://www.fanhaobai.com/2017/03/install-hexo.html#官方推荐 - 快速搭建Hexo博客+webhook自动部署+全站HTTPS
http://www.gaoshilei.com/2017/10/30/hexo-init/ - 基于Hexo的matery主题搭建博客并深度优化
https://www.jianshu.com/p/cf9730925b5c
-------------------------------------------------------------------------------- If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !


