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
部分参数解释: