响应HTTP服务的shell脚本
以下内容均为第一版, 实际使用请查看最新信息, 转至: https://hujingnb.com/archives/729
前言
兄弟萌, 我实现了一个实用的小工具, 特来分享.
事情刚开始是这样的, 我需要一个脚本来实现代码仓库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
的方式来制作自己的镜像.