您的位置 首页 php

响应HTTP服务的shell脚本

前言

兄弟萌, 我实现了一个适用的小工具, 特来分享.

事情刚开始是这样的, 我需要一个脚本来实现代码仓库 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 的方式来制作自己的镜像.

文章来源:智云一二三科技

文章标题:响应HTTP服务的shell脚本

文章地址:https://www.zhihuclub.com/79467.shtml

关于作者: 智云科技

热门文章

网站地图