API网关之Nginx + Lua网关实战

Lua:

Lua是一个小巧的脚本语言。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。

一个完整的Lua解释器不过200k,在所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。

Lua不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML, ini等文件格式,并且更容易理解和维护。

Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。

OpenResty:

OpenResty是一个基于 Nginx Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

OpenResty的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

在Ubuntu上安装并启动OpenResty的步骤:

wget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add -

echo "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main" > openresty.list

cat openresty.list

cp openresty.list /etc/apt/sources.list.d/

apt update

apt install openresty

systemctl enable openresty

systemctl start openresty

安装后可以进入到OpenResty的目录(/usr/local/openresty/):

进入lualib, 可以在这个目录新建code目录,将写好的lua脚本文件放入其中:

Nginx + Lua网关实战:

Nginx+Lua来开发网关的好处是既能满足相对复杂一些的业务逻辑(毕竟Nginx的配置还是有限),又能获得不错的性能(因为离客户端越近,转发链路越短,性能也就越高,而且Lua脚本非常轻量级,资源消耗少)。还有个好处是和微服务应用解耦,代码中不需要想Spring Cloud那样特意去配置网关功能,只需关注业务逻辑处理即可。

现在假设要实现一个access token校验的网关功能。

 1. 首先需要写一个Luau脚本,Lua脚本里面写校验token的逻辑。Lua脚本示例 luatest.lua:

2. Nginx配置:

rewrite_by_lua_file这里要指明lua脚本所在的路径。

Nginx reload之后,浏览器访问/luatest的时候会先根据请求头中的token进行鉴权,然后再控制跳转。

Nginx自带的配置比较基础,难以适应比较复杂的处理,通过lua脚本可以加入更加复杂的业务逻辑,比如解析token、鉴权、处理复杂路由过滤等。

还可以直接把lua脚本写在nginx.conf配置文件中:

rewrite_by_lua:  {

              # Lua脚本内容...

}

openresty中有这些与lua相关的参数:

lua_load_resty_core

lua_capture_error_log

lua_use_default_type

lua_malloc_trim

lua_code_cache

lua_thread_cache_max_entries

lua_regex_cache_max_entries

lua_regex_match_limit

lua_package_path

lua_package_cpath

init_by_lua

init_by_lua_block

init_by_lua_file

init_worker_by_lua

init_worker_by_lua_block

init_worker_by_lua_file

exit_worker_by_lua_block

exit_worker_by_lua_file

set_by_lua

set_by_lua_block

set_by_lua_file

content_by_lua

content_by_lua_block

content_by_lua_file

server_rewrite_by_lua_block

server_rewrite_by_lua_file

rewrite_by_lua

rewrite_by_lua_block

rewrite_by_lua_file

access_by_lua

access_by_lua_block

access_by_lua_file

header_filter_by_lua

header_filter_by_lua_block

header_filter_by_lua_file

body_filter_by_lua

body_filter_by_lua_block

body_filter_by_lua_file

log_by_lua

log_by_lua_block

log_by_lua_file

balancer_by_lua_block

balancer_by_lua_file

lua_need_request_body

ssl_client_hello_by_lua_block

ssl_client_hello_by_lua_file

ssl_certificate_by_lua_block

ssl_certificate_by_lua_file

ssl_session_fetch_by_lua_block

ssl_session_fetch_by_lua_file

ssl_session_store_by_lua_block

ssl_session_store_by_lua_file

lua_shared_dict

lua_socket_connect_timeout

lua_socket_send_timeout

lua_socket_send_lowat

lua_socket_read_timeout

lua_socket_buffer_size

lua_socket_pool_size

lua_socket_keepalive_timeout

lua_socket_log_errors

lua_ssl_ciphers

lua_ssl_crl

lua_ssl_protocols

lua_ssl_trusted_certificate

lua_ssl_verify_depth

lua_ssl_conf_command

lua_http10_buffering

rewrite_by_lua_no_postpone

access_by_lua_no_postpone

lua_transform_underscores_in_response_headers

lua_check_client_abort

lua_max_pending_timers

lua_max_running_timers

lua_sa_restart

lua_worker_thread_vm_pool_size

部分参数解释:

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值