当前位置: 首页 > 软件库 > Web应用开发 > 网站API >

lua-resty-ffi

OpenResty/Nginx 通用接口
授权协议 BSD
开发语言 C/C++ Lua
所属分类 Web应用开发、 网站API
软件类型 开源软件
地区 国产
投 递 者 夏建木
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

lua-resty-ffi提供了一个通用高效的接口,使得你可以使用Go,Python,Java和Rust为 OpenResty/Nginx 直接开发你想要的功能。

众所周知,OpenResty使用的lua和C,生态很弱,很多重造的轮子也缺乏维护,以至于跟外围生态系统互通时,巧妇难为无米之炊。

特色:

  • 非阻塞,以协程的方式运行
  • 简单可扩展的接口,支持任何符合C ABI的语言
  • 一劳永逸,无需再编写任何C或者lua的模块来开发新功能
  • 高性能,比unix domain socket要快
  • 通用的java、python加载器
  • 可使用任何你喜欢的消息序列化格式

最简单的实例:

使用golang开发一个echo功能。

创建文件:​echo.go

package main

/*
#cgo LDFLAGS: -shared
#include <string.h>
void* ngx_http_lua_ffi_task_poll(void *p);
char* ngx_http_lua_ffi_get_req(void *tsk, int *len);
void ngx_http_lua_ffi_respond(void *tsk, int rc, char* rsp, int rsp_len);
*/
import "C"
import (
	"log"
	"unsafe"
)

//export libffi_init
func libffi_init(cfg_cstr *C.char, tq unsafe.Pointer) C.int {
	log.Println("start go echo runtime")
	go func() {
		for {
			task := C.ngx_http_lua_ffi_task_poll(tq)
			if task == nil {
				break
			}
			var rlen C.int
			r := C.ngx_http_lua_ffi_get_req(task, &rlen)
			res := C.malloc(C.ulong(rlen))
			C.memcpy(res, unsafe.Pointer(r), C.ulong(rlen))
			C.ngx_http_lua_ffi_respond(task, 0, (*C.char)(res), rlen)
		}
		log.Println("exit go echo runtime")
	}()
	return 0
}

func main() {}

 

创建文件:nginx.conf

daemon off;
error_log /dev/stderr info;
worker_processes auto;
env LD_LIBRARY_PATH;

events {}

http {
    server {
        listen 20000;

        location /echo {
            content_by_lua_block {
                local demo = ngx.load_ffi("ffi_go_echo")
                local ok, res = demo:echo("foobar")
                assert(ok)
                assert(res == "foobar")

                demo:__unload()
                ok, res = demo:echo("foobar")
                assert(not ok)
                ngx.log(ngx.ERR, res)

                ngx.say("ok")
            }
        }
    }
}

运行:

​go build -buildmode=c-shared -o libffi_go_echo.so echo.go
LD_LIBRARY_PATH=$(PWD) $(NGINX_BIN) -p $(PWD) -c nginx.conf
curl localhost:20000/echo

 

  • 大家下午好!首先做下自我介绍,我于 2014 年加入奇虎 360,后与温铭结识,当时他正在基于 OpenResty 做天擎服务端,用于提供 API 服务。2015 年我们一起写了《OpenResty 最佳实践》,原因是当时我们团队想扩充,但是身边的同事都不知道如何学习 OpenResty,OpenResty 相关的学习资料也少。我们完成这本书的写作后,就给身边的同事们使用,而不再需要每次都通过口传

  • lua-resty-core 是什么? lua-resty-core 是 OpenResty 组件的一部分。它由两部分组成,一部分是 resty.core.*,提供了对 lua-nginx-module Lua 接口的替换实现;另一部分是 ngx.*,OpenResty 新的接口一般都会放到这里。 跟其他 lua-resty 开头的库一样,lua-resty-core 也是用 Lua 实现的。说到

  • 相比于现有实现,不需要安装任何第三方程序或者 C 扩展,所有依赖均为 Lua 和 FFI 实现。 安装 使用 opm: opm install fffonion/lua-resty-acme opm 中没有 luaossl 库,所以这种安装使用的是基于 FFI 的 Openssl 后端;需要 OpenResty 链接了大于等于 1.1 版本的 OpenSSL。 如果有完整的编译工具链,可以使用 l

  •   源代码名称:lua-resty-iputils 源代码网址:http://www.github.com/hamishforbes/lua-resty-iputils lua-resty-iputils源代码文档 lua-resty-iputils源代码下载 Git URL: 复制代码 git://www.github.com/hamishforbes/lua-resty-iputils.git

  • 09 | 为什么 lua-resty-core 性能更高一些? 你好,我是温铭。 前面两节课我们说了,Lua 是一种嵌入式开发语言,核心保持了短小精悍,你可以在 Redis、NGINX 中嵌入 Lua,来帮助你更灵活地完成业务逻辑。同时,Lua 也可以调用已有的 C 函数和数据结构,避免重复造轮子。 在 Lua 中,你可以用 Lua C API 来调用 C 函数,而在 LuaJIT 中还可以使用

  • 13 | [视频]实战:基于FFI实现的lua-resty-lrucache 你好,我是温铭。 今天的内容,我同样会以视频的形式来讲解。不过,在你进行视频学习之前,我想先问你这么几个问题: lua-resty-lrucache 内部最重要的数据结构是什么? lua-resty-lrucache 有两种 FFI 的实现,我们今天讲的这一种更适合什么场景? 这几个问题,也是今天视频课要解决的核心内容,

  • 一 、简介 ipmatcher是由api7组织出品的一款高性能IP匹配库,同时支持IPV6及CIDR模式。我们在编写防火墙时常需要对IP匹配黑白名单操作,可以使用该库快速获取到命中信息。 该项目地址:GitHub - api7/lua-resty-ipmatcher: High-performance match IP address for Nginx + Lua 二、使用方法 1.简单匹配IP

  • 【摘要】 在安全领域,lua编程语言因为其小巧在众多工具上都作为插件开发语言,常见的有openresty,nmap等。因此笔者将会开辟一个Lua相关的系列文章,主要记录工作过程中一些领悟或者是一些踩过的坑,希望能够借此平台帮助到读者们。 0x00 背景 最近在写一段nginx+redis的代码,主要基于openresty,其中使用到了lua-resty-redis库。我平时写代码都比较小心,针对外

  • -- Copyright (C) by Yichun Zhang (agentzh) --local asn1 = require "resty.asn1" local ffi = require "ffi" local ffi_new = ffi.new local ffi_gc = ffi.gc local ffi_str = ffi.string local ffi_copy = ffi.c

  • 为什么 OpenResty 要用 FFI ? 看了上文之后,各位读者可能会得出这样的结论: 虽然 FFI 用起来很方便,但是性能会有些问题,所以还是要慎用啊。 这又是一个 “FFI 方便但是性能不行” 的例子吗? 并不是。上文提到,在编译模式下,LuaJIT FFI 的性能会是解释模式下的十倍。所以当程序运行于编译模式时,用 FFI 并不会慢。 还有一笔账值得一算:调用 Lua CFunction

  • 1. require的伪代码 function require(modname)     if not package.loaded[modname] then         local loadfunc = package.preload[modname]         if loadfunc ~= nil then                -- Case 1            

 相关资料
  • 一个基于 OpenResty 的仿 Yii 的 web 框架,通过本框架能够极大降低openresty的开发入门门槛。 运行机制概述 每一次应用开始处理 HTTP 请求时,它都会进行一个近似的流程。 用户提交指向 入口脚本 index.lua 的请求 入口脚本会创建一个 应用(Application) 实例用于处理该请求,并加载配置。 应用会通过 request(请求) 应用组件解析被请求的路由。

  • Lua-Resty-Checkups是一个基于lua的upstream管理和健康检查模块,由又拍云开源。 特点: 支持周期性upstream服务管理操作 支持管理和健康检查 支持upstream动态更新 有利于加权轮询或哈希平衡 支持 Nginx C upstream同步操作 可使用级别和键值实现集群 使用简介: -- config.lua_M = {}_M.global = {    check

  • lua-resty-session 是一个面向 OpenResty 的安全和灵活的 session 库,它实现了 Secure Cookie Protocol。 更详细的说明请查看 https://github.com/bungle/lua-resty-session/blob/master/README.md http {    server {        listen       8080

  • lua-resty-weauth,适用于 OpenResty / ngx_lua 的基于企业微信组织架构的登录认证。 使用 下载 cd /path/togit clone git@github.com:ledgetech/lua-resty-http.gitgit clone git@github.com:SkyLothar/lua-resty-jwt.gitgit clone git@githu

  • Streaming reader and parser for HTTP file uploading based on Lua Nginx Module's cosocket API. Project homepage: https://github.com/agentzh/lua-resty-upload This library is enabled by default. You can

  • A Lua library that provides string utilities and common hash functions for Lua Nginx Module. Project homepage: https://github.com/agentzh/lua-resty-string This library is enabled by default. You can s