如何配置Envoy加载指定路径的本地外部Lua脚本文件
Envoy 外部Lua脚本加载配置修改方案
具体操作步骤
- 第一步:创建独立Lua脚本文件
在目标路径/envoy/lua/scripts/下新建脚本文件,可命名为response_hook.lua,写入原内联的业务逻辑:
function envoy_on_response(response_handle) body_size = response_handle:body():length() response_handle:headers():add("response-body-size", tostring(body_size)) response_handle:headers():add("foo", "bar") end
第二步:调整Envoy YAML配置
需要修改两个核心配置,同时修正一个会导致逻辑不生效的顺序问题:- 调整HTTP过滤器顺序:Envoy 强制要求
envoy.filters.http.router必须放在所有HTTP过滤器的最后一位,原配置将router放在Lua过滤器之前,会导致Lua逻辑完全不执行,需要调换两者顺序。 - 替换Lua过滤器配置字段:删除原有的
inline_code配置段,改用source_code.filename字段指定Lua脚本的绝对路径。
修改完成后的完整配置如下:
- 调整HTTP过滤器顺序:Envoy 强制要求
static_resources: listeners: - address: socket_address: address: 0.0.0.0 port_value: 10000 filter_chains: - filters: - name: envoy.filters.network.http_connection_manager typed_config: '@type': "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager" stat_prefix: http_proxy route_config: name: all virtual_hosts: - name: allbackend_cluster domains: - '*' routes: - match: { prefix: "/"} route: cluster: cluster_wackopicko http_filters: # Lua过滤器必须放在router之前 - name: envoy.lua typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua source_code: filename: "/envoy/lua/scripts/response_hook.lua" # Router过滤器必须放在所有http_filters的最后 - name: envoy.filters.http.router clusters: - name: cluster_wackopicko connect_timeout: 1s lb_policy: ROUND_ROBIN load_assignment: cluster_name: cluster_wackopicko endpoints: - lb_endpoints: - endpoint: address: socket_address: address: 127.0.0.1 port_value: 8081
- 第三步:配置Ubuntu环境文件权限
Envoy运行进程的用户需要拥有Lua脚本文件、上级目录的可读权限,否则会报文件加载失败。如果是通过官方apt源安装的Envoy,默认运行用户为envoy,执行以下命令赋权即可:
# 给脚本目录及文件添加可读权限,也可按需调整为对应属主权限 chmod -R o+r /envoy/lua/scripts/
- 第四步:加载验证
重启Envoy进程或者调用Envoy热重载接口加载新配置,之后请求10000端口的服务,检查响应头中是否存在response-body-size和foo两个字段,正常返回即代表外部脚本加载成功。
注意:Envoy不会自动监听外部Lua脚本的文件变动,后续修改Lua脚本内容后,需要重启/重载Envoy配置才会生效。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

