gpt4 book ai didi

validation - HAproxy+Lua : Return requests if validation fails from Lua script

转载 作者:行者123 更新时间:2023-12-04 22:42:29 26 4
gpt4 key购买 nike

我们正在尝试使用 HAProxy+Lua 构建传入请求验证平台。
我们的用例是创建一个 LUA 脚本,该脚本基本上将对验证 API 进行套接字调用,并基于响应
从验证 API 中,我们希望将请求重定向到后端 API,如果验证失败,我们希望返回
来自 LUA 脚本的请求。例如,对于 200 响应,我们希望将请求重定向到后端 api,对于 404,我们希望
返回请求。从文档中,我了解到有各种默认功能可用
与 Lua-Haproxy 集成。

core.register_action() --> I'm using this. Take TXN as input
core.register_converters() --> Essentially used for string manipulations.
core.register_fetches() --> Takes TXN as input and returns string; Mainly used for representing dynamic backend profiles in haproxy config
core.register_init() --> Used for initialization
core.register_service() --> You have to return the response mandatorily while using this function, which doesn't satisfy our requirements
core.register_task() --> For using normal functions. No mandatory input class. TXN is required to fetch header details from request

我已经尝试了上面列表中的所有功能,我明白 core.register_service 基本上是从
Lua 脚本。然而,有问题的是,我们必须从 LUA 脚本发送响应,它不会将请求重定向到 BACKEND。
目前,我正在使用 core.register_action 来中断请求,但我无法使用此函数返回请求。这是
我的代码是什么样的:
local http_socket = require("socket.http")
local pretty_print = require("pl.pretty")

function add_http_request_header(txn, name, value)
local headerName = name
local headerValue = value
txn.http:req_add_header(headerName, headerValue)
end

function call_validation_api()
local request, code, header = http_socket.request {
method = "GET", -- Validation API Method
url = "http://www.google.com/" -- Validation API URL
}

-- Using core.log; Print in some cases is a blocking operation http://www.arpalert.org/haproxy-lua.html#h203
core.Info( "Validation API Response Code: " .. code )
pretty_print.dump( header )
return code
end

function failure_response(txn)
local response = "Validation Failed"
core.Info(response)
txn.res:send(response)
-- txn:close()
end

core.register_action("validation_action", { "http-req", "http-res" }, function(txn)
local validation_api_code = call_validation_api()
if validation_api_code == 200 then
core.Info("Validation Successful")
add_http_request_header(txn, "test-header", "abcdefg")
pretty_print.dump( txn.http:req_get_headers() )
else
failure_response(txn) --->>> **HERE I WANT TO RETURN THE RESPONSE**
end
end)

以下是配置文件条目:
frontend  http-in
bind :8000
mode http
http-request lua.validation_action

#Capturing header of the incoming request
capture request header test-header len 64

#use_backend %[lua.fetch_req_params]
default_backend app

backend app
balance roundrobin
server app1 127.0.0.1:9999 check

非常感谢在实现此功能方面的任何帮助。另外,我知道来自 Lua 脚本的 SOCKET 调用是一个阻塞调用,这与 HAProxy 的保持事件连接的默认性质相反。如果您已经使用过它,请随时提出任何其他实用程序来实现此功能。

最佳答案

好的,我已经找到了这个问题的答案:
我为请求的成功和失败创建了 2 个后端,并根据响应返回了 2 个不同的字符串。在“failure_backend”中,我调用了一个不同的服务,它本质上是一个 core.register_service 并且可以返回响应。我正在粘贴配置文件和 lua 脚本的代码

HAProxy 配置文件:

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
maxconn 4000
user haproxy
group haproxy
daemon
#lua file load
lua-load /home/aman/coding/haproxy/http_header.lua

# turn on stats unix socket
stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
retries 3
timeout http-request 90s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend http-in
bind :8000
mode http
use_backend %[lua.validation_fetch]
default_backend failure_backend

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend success_backend
balance roundrobin
server app1 172.23.12.94:9999 check

backend failure_backend
http-request use-service lua.failure_service

# For displaying HAProxy statistics.
frontend stats
bind :8888
default_backend stats

backend stats
stats enable
stats hide-version
stats realm Haproxy Statistics
stats uri /haproxy/stats
stats auth aman:rjil@123

Lua脚本:
local http_socket = require("socket.http")
local pretty_print = require("pl.pretty")

function add_http_request_header(txn, name, value)
local headerName = name
local headerValue = value
txn.http:req_add_header(headerName, headerValue)
end

function call_validation_api()
local request, code, header = http_socket.request {
method = "GET", -- Validation API Method
url = "http://www.google.com/" -- Validation API URL
}

-- Using core.log; Print in some cases is a blocking operation http://www.arpalert.org/haproxy-lua.html#h203
core.Info( "Validation API Response Code: " .. code )
pretty_print.dump( header )
return code
end

function failure_response(txn)
local response = "Validation Failed"
core.Info(response)
return "failure_backend"
end

-- Decides back-end based on Success and Failure received from validation API
core.register_fetches("validation_fetch", function(txn)
local validation_api_code = call_validation_api()
if validation_api_code == 200 then
core.Info("Validation Successful")
add_http_request_header(txn, "test_header", "abcdefg")
pretty_print.dump( txn.http:req_get_headers() )
return "success_backend"
else
failure_response(txn)
end
end)

-- Failure service
core.register_service("failure_service", "http", function(applet)
local response = "Validation Failed"
core.Info(response)
applet:set_status(400)
applet:add_header("content-length", string.len(response))
applet:add_header("content-type", "text/plain")
applet:start_response()
applet:send(response)
end)

关于validation - HAproxy+Lua : Return requests if validation fails from Lua script,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42337734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com