试用 openresty/lua-resty-shell

openresty/lua-resty-shell 是当前最新rc 版本内置的shell 功能,我们可以用来执行一个脚本,以及命令
还是比较方便的。

测试集成了一个oreilly电子书下载的功能

环境准备

  • docker-compose 文件
version: "3"
services:
  nginx:
    build: ./
    ports:
    - "8888:8080"
    env_file:
    - .account.env
    volumes:
    - "./nginx_lua/:/opt/app/"
    - "./ebooks/:/opt/ebooks/"
    - "./nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf"
  • dockerfile
FROM openresty/openresty:1.15.8.1rc1-bionic
LABEL author="1141591465@qq.com"
WORKDIR /app
RUN apt-get install -y wget     && wget -O safaribooks-downloader https://github.com/rongfengliang/My-SafariBooks-Downloader/raw/master/safaribooks-downloader-linux     && chmod +x safaribooks-downloader
ENV PATH=$PATH:/app
  • 环境变量文件格式
    环境变量配置主要是为了方便用户账户的管理,如果在请求体没有的话,可以使用环境变量内置的
    .account.env
USERNAME=<yourid>
PASSWORD=<youpassword>
  • nginx.conf
worker_processes 1;
user root;
events {
    worker_connections 1024;
}
env USERNAME;
env PASSWORD;
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    lua_code_cache off;
    lua_need_request_body on;
    gzip on;
    resolver 127.0.0.11 ipv6=off;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    lua_package_path ‘/opt/app/?.lua;;‘;
    server {
        listen 8080;
        server_name app;
        charset utf-8;
        default_type text/html;
        location / {
           default_type text/plain;
           index index.html index.htm;
        }
        location /ebooks {
           root /opt;
           autoindex on;
           default_type application/octet-stream;
           autoindex_exact_size off;
        }
        location /download {
             content_by_lua_block {
              require("api/download")()
            }
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }

    }
}

lua-resty-shell 代码部分

主要是调用oreilly 电子书下载的cli 工具(原始使用nodejs 开发,为了方便我打包为了二进制文件)
nginx_lua/api/download.lua

-- this feature use lua-resty-shell call safaribooks-downloader to do

local json = require("cjson")
local shell = require "resty.shell"
local ngx = ngx;
local function exec_shell(ebookid,storagepath,username,password)
   -- for simple use ebookid
   local filename = ebookid..".epub"
   local defaultstoragepath = (storagepath or "/app/")..filename
   -- exec shell format -b ebookid -o output directory
   -- safaribooks-downloader -b <ebookid> -u <id> -p <password> -o /Users/dalong/Desktop/testbook.epub
   return "/app/safaribooks-downloader".." -b "..ebookid.." ".." -o "..defaultstoragepath.." -u "..username.." -p "..password.." && rm -rf books"
end

local function init()
    ngx.req.read_body()
    local method_name = ngx.req.get_method()
    if method_name ~= "POST" then
       ngx.say("must with post to pass datas")
    end
    local body = ngx.req.get_body_data()
    if not body then
        if ngx.req.get_body_file() then
            return nil, "request body did not fit into client body buffer, consider raising ‘client_body_buffer_size‘"
        else
            return ""
        end
    end
    local downloadinfo = json.decode(body)
    if downloadinfo ~=nil then
       if downloadinfo.ebookid ==nil then
           ngx.say("please pass ebook id ")
           return nil
       end
       -- if not provide username && password use myself && set by os env
       if downloadinfo.username == nil or downloadinfo.password == nil then
           downloadinfo.username=os.getenv("USERNAME")
           downloadinfo.password=os.getenv("PASSWORD")
       end
    end
    local execommand = exec_shell(downloadinfo.ebookid,"/opt/ebooks/",downloadinfo.username,downloadinfo.password)
    -- ngx.say(execommand)
    local timeout = 300000 -- ms
    local max_size = 409600 -- byte
   -- shell 执行的核心
    local ok, stdout, stderr, reason, status =
        shell.run(execommand, nil, timeout, max_size)
    if not ok then
        return stderr
    end
    ngx.say(stdout..reason..status)
end

return init;
  • 下载效果

说明

lua-resty-shell 使用起来还是很方便的,相对以前社区的基于配置socket 服务的模型,简化了好多,对于safaribooks-downloader-linux
这个文件的生成使用的是pkg nodejs 方便的打包工具,具体的可以参考项目源码。

参考资料

https://github.com/rongfengliang/safaribooks-downloader-docker-compose
https://github.com/rongfengliang/My-SafariBooks-Downloader
https://github.com/openresty/lua-resty-shell

原文地址:https://www.cnblogs.com/rongfengliang/p/10495352.html

时间: 2024-10-10 04:33:56

试用 openresty/lua-resty-shell的相关文章

openresty+lua在反向代理服务中的玩法

openresty+lua在反向代理服务中的玩法 phith0n · 2015/06/02 10:35 0x01 起因 几天前学弟给我介绍他用nginx搭建的反代,代理了谷歌和维基百科. 由此我想到了一些邪恶的东西:反代既然是所有流量走我的服务器,那我是不是能够在中途做些手脚,达到一些有趣的目的. openresty是一款结合了nginx和lua的全功能web服务器,我感觉其角色和tornado类似,既是一个中间件,也结合了一个后端解释器.所以,我们可以在nginx上用lua开发很多“有趣”的东

openresty lua 调试 (图文死磕)

疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy-SpringCloud 微服务脚手架 &视频介绍: Crazy-SpringCloud 微服务脚手架,是为 Java 微服务开发 入门者 准备的 学习和开发脚手架.并配有一系列的使用教程和视频,大致如下: 高并发 环境搭建 图文教程和演示视频,陆续上线: 中间件 链接地址 Linux Redis

lua resty template &amp;&amp; openresty 使用

1. 安装 luarocks install lua-resty-template 2. 使用 配置模板页面位置 有多种方式: a.  直接使用root 目录 代码如下: location /{ root html; content_by_lua ' local template = require "resty.template" template.render("view.html",{ message ="Hello, World!"})

LUA+resty 搭建验证码服务器

使用Lua和OpenResty搭建验证码服务器 雨客 2016-04-08 16:38:11 浏览2525 评论0 云数据库Redis版 摘要: Lua下有个Lua-GD图形库,通过简单的Lua语句就能控制.生成图片. 环境说明: 操作系统:RHEL6.4 RHEL系统默认已安装RPM包的Lua-5.1.4,但其只具有Lua基本功能,不提供 lua.h 等,但 Lua-GD 编译需要用到 lua.h,故 Lua 需要编译安装. Lua-GD... Lua下有个Lua-GD图形库,通过简单的Lua

openresty+lua做接口调用权限限制

说明:openresty可以理解为一个服务器它将nginx的核心包含了过来,并结合lua脚本语言实现一些对性能要求高的功能,该篇文章介绍了使用openresty 1.purview.lua --调用json公共组件 cjson = require("cjson") fun = require("ttq.fun") -- 引用公用方法文件 conf = require("ttq.ini") --引用配置文件 reds = require("

OpenResty之resty.limit.count 模块介绍

resty.limit.count 模块介绍: resty.limit.count 模块就是限制接口单位时间的请求数,This module depends on lua-resty-core模块,所以要在openresty 的http标签端添加 nginxinit_by_lua_block {require "resty.core"} 同时resty.limit.count模块是在OpenResty 1.13.6.1+ 引入的 openresty下开启resty.limit.coun

openresty 之resty.limit.req模块介绍

一.openresty实现限流说明: 静态拦截和动态拦截介绍:静态拦截就是限流某一个接口在一定时间单位的请求数.一般就是单位1s内的客户端的请求数.例如用户可以在系统上给他们的接口配置一个每秒最大调用量,如果超过这个限制,则拒绝服务此接口.而动态拦截其实也是基于静态拦截进行改进,我们可以依据当前系统的响应时间来动态调整限流的阈值,如果响应较快则可以把阈值调的大一些,放过更多请求,反之则自动降低限流阈值,只使少量请求通过. 其实这就是一个很简单的限流方式.但是因为这些场景在我们开发的时候经常遇到,

OpenResty + Lua + Redis 实现 客户端ip防刷

一.环境说明: 在Centos7上安装openresty此次安装采用的是下载openresty的yum源来安装 [[email protected] conf]# sudo yum-config-manager --add-repo https://openresty.org/yum/cn/centos/OpenResty.repo sudo:yum-config-manager:找不到命令解决办法: [[email protected] conf]# yum -y install yum-ut

验证 Openresty+Lua+GraphicsMagick

1 环境准备 1.1 CentOS 安装 Openresty Openresty 的下载及安装请参考:http://openresty.org/cn/. 1.2 安装 GraphicsMagick 源码安装,源码下载地址:https://sourceforge.net/projects/graphicsmagick/. 源码下载后解压,切换到源码目录: ./configure make make install 2 测试代码 代码参考:(linsir/ngx-lua-images)[https: