nginx使用ngx_lua访问后端Thrift-Server实现和介绍

背景

随着openresty的出现,让nginx使用lua解决一些业务的能力大幅度提高,ngx_lua可以使用nginx自生的基于事件驱动的IO模型,和后端的存储,业务等系统实现非阻塞的连接交互。

如何使用ngx_lua连接后端的Thrift-Server呢?

基于这个需求,本人为ngx_lua做了一下增强。

增强后的业务架构图

前端使用http对外提供服务,将请求的数据调用ngx_lua逻辑,使用定义好的Thrift的IDL文件生成lua代码,调用Thrift的服务,实现业务逻辑。

开源实现github:https://github.com/gityf/ngx_lua_thrift

支持的协议protocol

Support protocol: binary,compact and JSON.
binary: TBinaryProtocol.lua
compact: TCompactProtocol.lua
JSON: TJsonProtocol.lua
Support transport: RawSocket,Buffered,Framed and Http.

支持的socket

使用nginx的tcp实现socket通信 socket: ngx.socket.tcp()

安装步骤

下载 https://openresty.org/download/openresty-x.y.z.a.tar.gz .
install openresty.
To copy all files in lualib to directory openresty/lualib/
To cpoy all conf file to directory openresty/nginx/conf/
compile source in directory openresty/lualib/libthrift/c
Start openresty nginx server.

Nginx的配置

  

       location = /v1/lua_thrift{
            access_log logs/access.log main;
            add_header ‘Content-Type‘ ‘text/html‘;
            content_by_lua ‘
                local cln = require "test_cln"
                ngx.say(cln.demoFunc());
            ‘;
        }

 

ngx_lua的thrift客户端代码

function _M.demoFunc()
    local socket = TSocket:new{
        host=‘127.0.0.1‘,
        port=8090
    }
    --local protocol = TBinaryProtocol:new{
    -- local protocol = TCompactProtocol:new{
        --trans = socket
    --}
    local protocol = TJSONProtocolFactory:getProtocol(socket)
    --local protocol = TCompactProtocolFactory:getProtocol(socket)
    client = RpcServiceClient:new{
        protocol = protocol
    }
    local argStruct = ArgStruct:new{
      argByte = 53,
      argString = "str 测试字符串\"\t\n\r\‘\b\fvalue",
      argI16 = 54,
      argI32 = 12.3,
      argI64 = 43.32,
      argDouble = 11.22,
      argBool = true
    }
    -- Open the socket
    socket:open()
    pmap = {}
    pmap.name = "namess"
    pmap.pass = "vpass"
    pistrmap = {}
    pistrmap[10] = "val10"
    pistrmap[20] = "val20"
    ret = client:funCall(argStruct, 53, 54, 12, 34, 11.22, "login", pmap,
        pistrmap,
        {"ele1", "ele2", "ele3"},
        {11,22,33},
        {"l1.","l2."}, false);
    res = ""
    for k,v in pairs(ret)
    do
        print(k, v)
        res = res .. k .."." .. v .. "<br>"
    end
    return res
end

简单的demo测试

To access web url http://127.0.0.1:8000/v1/lua_thrift and get result.

      1.return 1 by FunCall.
      2.return 2 by FunCall.

参考

https://github.com/apache/thrift/tree/master/lib/lua

http://openresty.org/

Done.

时间: 2024-11-10 14:52:14

nginx使用ngx_lua访问后端Thrift-Server实现和介绍的相关文章

keepalived+nginx反向代理访问后端web服务器

 架设web服务器通过nginx反向代理访问,并通过keepalived配置nginx反向代理服务器和nginxweb 服务器的故障转移 1.系统:Centos6.6 2.反向代理:Keepalived+nginxproxy:  主机:PHP-API-P1       IP地址:192.168.0.111 主机:PHP-API-P2 IP地址:192.168.0.112 VIP :192.168.0.8 3.后端服务:Keepalived+nginx: 主机:PHP-API-S1 IP地址:19

haproxy后端nginx取得用户访问ip地址

            set_real_ip_from 172.16.100.120;  #haproxy 的IP地址         set_real_ip_from 172.16.100.110;  #haproxy 的IP地址         real_ip_header X-Forwarded-For;         log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '      

通过Nginx访问后端应用,ERR_CONTENT_LENGTH_MISMATCH 问题的解决

遇到两个问题 1. 选择日期功能,不起作用了 2. 下载稍大一点的文件,只能下载一小半 页面调试发现有ERR_CONTENT_LENGTH_MISMATCH错误 系统:CentOS,Nginx,proxy到后端的tomcat 原因:nginx会缓存大文件到proxy_temp目录中,然而对这个目录没有读写权限 解决过程: 页面调试,抛出错误:net::ERR_CONTENT_LENGTH_MISMATCH 在chrome下,请缓存或强制刷新,response的status code为200 不强

Nginx&mdash;&mdash;使用 Nginx 提升网站访问速度【转载+整理】

原文地址 本文是写于 2008 年,文中提到 Nginx 不支持 Windows 操作系统,但是现在它已经支持了,此外还支持 FreeBSD,Solaris,MacOS X~ Nginx("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器. Nginx 是由俄罗斯人 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru(俄文:Рамблер)站点开发的,第一个公开版本 0.1.0 发布于2004年10月4日.

nginx下无法访问中文文件名的解决方法

今天在网上寻找关于Nginx访问中文目录及文件名的解决方法,偶然看到qwqg的一篇文章! 解决问题的思路很清晰,特转载过来与大家一起分享!该方法还没有亲自测试,所以不太确定是否真有用! 方法一: 搞了大半天nginx下无法访问中文文件名的问题,现在看来是secureCRT的问题? 看来还是字符集的问题了. 看来nginx不需要象apache那样要单独加载支持中文模块. 服务器端字符集如下 [[email protected]]# locale LANG=en_US.UTF-8 LC_CTYPE=

使用 Nginx 提升网站访问速度(转)

Nginx 简介 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了. Igor 将源代码以类 BSD 许可证的形式发布.尽管还是测试版,但是,Nginx 已经因为它的稳定性.丰富的功能集.示例配置文件和低系统资源的消耗而闻名了. 根据最新一期(08 年 6 月份)的 N

nginx 禁止ip访问只允许域名访问

nginx 禁止ip访问只允许域名访问 在nginx 配置文件中,再添加一个server段 server{listen 80 default;return 500;}

nginx lua redis 访问频率限制(转)

1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的需求. Nginx处理请求的过程一共划分为11个阶段,分别是: post-read.server-rewrite.find-config.rewrite.post-rewrite. preaccess.access.post-access.try-files.content.log. 在openre

利用nginx反向代理,后端Web如何获取真实客户ip

利用nginx反向代理,后端Web如何获取真实客户端ip 一.nginx反向代理nginx,后端的nginx该如何配置才能获取到客户端的真实IP地址呢. 1.首先需要在nginx代理服务器上的配置文件nginx.conf上的 location 中添加一行参数: proxy_set_header  X-Real-IP  $remote_addr; 重启nginx服务 2.对后面的nginx进行配置 vim /usr/local/nginx/conf/nginx.conf 加入下面参数: set_r