Centos7 如何优雅的实现 webhook

2018-06-12 11:34:32

起因

有一台腾讯云 ESC,配置很低,1核1g1m那种,前段时间搭车撸的.
买完以后如同鸡肋,闲置在那里吃灰,醉了..
这两天比较闲,突发奇想,为何不使用它部署一个前端项目玩玩。
但是问题来了,什么样的前端项目比较好玩呢?
犹记得那是12年的第一场雪,也是一个无聊的下午,那时候我还是一个充满热血的少年
我使用jquery + tp 做了一个仿 dos 的命令行web项目,那也是我独自为自己做的第一个 web 项目
很简陋,做完以后却很开心。如今项目早已经不在了,源代码也不知道弄哪里去了。
我何不重新在弄一个玩玩呢?

于是就有了 muzilong.pro
这个是用 vue + laravel 写的,前后端完全分离开了。腾讯云 ESC 目前只部署了一个 nginx

问题来了

那么问题来了,如何更简单的实现 webhook ?
当然这个问题,我以前是没有想过的,毕竟当 java, php, node, python ...跑 web 服务的时候,都是可以直接调用系统命令来完成 webhook 的,但如今一台性能很低而且只跑 nginx 的服务器,如何最简单的实现 webhook 就是需要考虑的事情了。当然,你可以给服务器装一个基于 python 的 Tornado 或 flask 等web环境,毕竟服务器是内置 python 的,成本很低。
但是特意搞一个这个只为 webhook 服务,浪费资源,或许有更优的解决方案。

主角登场

在网络工具中有“瑞士军刀”美誉的 NetCat ,在我用了N年了至今仍是爱不释手。
这个小巧的工具就能实现监听端口->响应请求->执行脚本部署的需求。
比如说如下的一行代码


echo -e "hello" | nc -l 0.0.0.0 1234

下面的命令可以一直监听 1234 端口,当外部访问 http://ip:1234 这个链接的时候,nc 会马上输出 hello ,然后结束命令,很酷不是吗? 而安装 netcat 非常简单,在 centos7 中直接执行


sudo yum install nc

就可以了。

于是我们稍微改动一下,就可以通过 url 触发我们的 webhook 脚本,从而完成代码的拉取更新操作了,非常的方便

echo -e "HTTP/1.1 200 ok,\r\nConnection: close\r\n\r" |  nc -l 0.0.0.0 1234 ; sh /u/git/pull.sh >> /u/git/log.log 2>&1

接下来,我们只需要通过 systemd ,可以将这个脚本管理起来,让它永远重启,这样一次部署之后,马上就可以重新监听,等待下一次部署命令。注意要添加 StartLimitInterval ,限制一下执行的频率。最终的 systemd service 如下:

[Unit]
Description=Autopull through webhook
After=network.target
 
[Service]
User=你的用户名称
Type=simple
ExecStart=/bin/bash -xc 'echo -e "HTTP/1.1 200 ok,\r\nConnection: close\r\n\r" |  nc -l 0.0.0.0 1234 ; sh /u/git/pull.sh >> //u/git/log.log 2>&1'
Restart=always
StartLimitInterval=1min
StartLimitBurst=60
 
[Install]
WantedBy=multi-user.target

这样我们就实现了最简单的部署 webhook 的操作。