zoukankan      html  css  js  c++  java
  • 响应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内容. xxxheader名称

    不同类型脚本读取系统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的方式来制作自己的镜像.

    Dockerfile地址

    原文链接: https://hujingnb.com/archives/729

  • 相关阅读:
    java数组的相关方法
    spring boot 文件目录
    mysql 数据库安装,datagrip安装,datagrip连接数据库
    linux maven 的安装与配置
    java String字符串常量常用方法
    java 命名规范
    deepin 安装open jdk
    jetbrains(idea,webstorm,pycharm,datagrip)修改背景,主题,添加特效,汉化
    JVM学习(九)volatile应用
    JVM学习(八)指令重排序
  • 原文地址:https://www.cnblogs.com/hujingnb/p/15732143.html
Copyright © 2011-2022 走看看