前言
兄弟萌, 我实现了一个实用的小工具, 特来分享.
事情刚开始是这样的, 我需要一个脚本来实现代码仓库web hook
的任务, 首先想到的是直接调用php
, 但是php-fpm
是以www-data
用户运行的, 很多调用是无法实现的. 此时, 我就需要一个常驻的偶尔调用一下的, 能够以root
用户执行的http
服务器, 但是网上查了查, 发现并么有符合我要求的现成*, 于是它来了.
是什么
简单介绍一下这个*是做什么用的. 简单说, 就是启动一个执行shell
脚本的http
服务.
它启动一个服务, 来监听指定端口并响应HTTP
请求, 脚本在监听到新的请求后, 会根据请求路径调用响应的脚本执行任务并返回对应的内容.
如果需要HTTPS
外边再套一层nginx
就行了.
使用介绍
这个破玩意如何使用呢? 为了简化使用, 我将其打包成了docker
镜像. 注意, 此服务每一次调用会启动一个新的进程, 故不适用于高并发场景.
启动
假设脚本的本地运行目录为: /usr/share/script
.
创建文件/usr/share/script/test.bash
. 内容如下:
#!/usr/bin/env bash
response "return"
给脚本赋予执行权限: chmod +x /usr/share/script/test.bash
docker
命令行启动:
docker run -it -d -p 80:80 -v /usr/share/script:/opt/script hujingnb/http_cron
docker-composer
启动:
version: '3.1'
services:
tcp_cron:
build: hujingnb/http_cron
container_name: http_cron
restart: always
port:
- 80:80
volumes:
- /usr/share/script:/opt/script
OK, 此时访问请求: http:127.0.0.1/test
, 就会看到返回内容return
了.
脚本运行机制
路由分配
根据请求的request_uri
调用对应的脚本.
若请求为: /user/change_name
.
那么会将脚本的工作路径/opt/script
(工作路径通过环境变量WORKSPACE
修改) 与请求拼在一起, 拼接后的路径为: /opt/script/user/change_name
, 依次寻找以下后缀文件, 首次找到的为执行脚本:
/opt/script/user/change_name.pl
/opt/script/user/change_name.sh
/opt/script/user/change_name.bash
/opt/script/user/change_name.php
/opt/script/user/change_name.py
/opt/script/user/change_name.rb
若没有找到脚本, 或访问根路径, 返回404
.
注意, 所有脚本都需要赋予执行权限.
接收请求
脚本通过环境变量接收请求内容, bash
脚本可直接通过$METHOD_TYPE
读取. 有如下内容:
-
METHOD_TYPE
: 请求的方法.GET
POST
等 -
HTTP_VERSION
: 请求的HTTP
版本.HTTP/1.1
-
REQUEST_URI
: 请求原始路径(去掉GET
参数的). -
QUERY_STR
:GET
请求的原始参数字符串 -
FORM_CONTENT
: 若请求是POST
, 则此变量保存请求体的字符串内容.- 没有对内容进行解析. 因为根据
content-type
不同, 解析方式不同. 请自行解析
- 没有对内容进行解析. 因为根据
-
QUERY_PARAM_xxx
: 解析后的GET
请求参数.xxx
为参数名 -
HEADER_xxx
: 请求的header
内容.xxx
为header
名称
不同类型脚本读取系统env
环境变量的方式不同, 请自行搜索.
响应请求
通过调用shell
命令response
进行返回. 如:
#!/usr/bin/env bash
# 注意, 脚本在所有输出之前, 必须先调用 response 命令
# status: 响应码. 默认为 200
# header_: 以 header_ 打头的参数为响应中添加的 header, 后面跟着 header 名. 可不传
# 最后的响应内容是必传参数. 若不需要, 可传空字符串
response --status=200 --header_ADD_HEADER=TEST "这里存放响应内容"
# 以极简的模式调用. 返回200, 并且没有响应体
# 若脚本全程没有审核输出, 则默认调用 response ""
# response ""
# 后续的所有 echo 都作为响应内容输出
echo $QUERY_STR
若是其他脚本请参考调用系统命令的方式, 需要将response
的输出内容写到标准输出流.
配置
可通过如下配置进行自定义修改.
环境变量
-
WORKSPACE
: 修改运行脚本的查找目录. 默认为:/opt/script
. -
LISTEN_PORT
: 修改脚本监听的端口. 默认80
docker
命令行通过-e
参数添加环境变量
docker-composer
通过environment
参数修改环境变量
环境准备
为了保证镜像的大小, 只安装了必要的软件, 包括python
PHP
运行环境都没有. 故, 若你有额外需求的话, 有如下两种方式来实现系统环境的定制化:
1.覆盖/opt/init.bash
文件
镜像在每次启动时, 都会首先执行/opt/init.bash
文件, 可以在这里安装额外的软件等初始化操作.
请注意, /opt/init.bash
脚本每次镜像启动都会执行一次. 此脚本默认不执行任何操作.
2. 镜像引用
你也可以通过FROM
的方式来制作自己的镜像.
原文链接: https://hujingnb.com/archives/729