I just started using HAProxy
and I have the following situation:
- I have two backend services, lets call them
service A
andservice P
- I am trying to use a load balancer like
haproxy
- When a request comes in, assume that it has a
token
that is part of a HTTP header likeX-SOME-TOKEN
that ishttponly
- I want to extract this
token
, send to itservice A
, retrieve anID token
, attach it to a request forservice B
which, if returns HTTP status code 200, only then a success HTTP status code 200 and the JSON payload sent fromservice B
is sent to client and if otherwise, HTTP status code 500 is sent to client.
My confusion is with part 3 and 4
. I am not sure if this can be done at the load balancing layer using haproxy
. I have looked at the docs and read briefly about acl
. If this can be done using acl
what should be the possible approach?
To add more context, this is the configuration file I have with comments on where I would like to make changes:
global
log /dev/log daemon
maxconn 32768
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats user haproxy group haproxy mode 0640 level admin
tune.bufsize 32768
tune.ssl.default-dh-param 2048
ssl-default-bind-ciphers ALL:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW@STRENGTH
defaults
log global
mode http
option log-health-checks
option log-separate-errors
option dontlog-normal
option dontlognull
option httplog
option socket-stats
retries 3
option redispatch
maxconn 10000
timeout connect 5s
timeout client 50s
timeout server 450s
#listen stats
#bind 0.0.0.0:80
#bind :::80 v6only
#stats enable
#stats uri /
#stats refresh 5s
#rspadd Server:\ haproxy/1.6
frontend testnode
# I want to define all my urls here for which,
# the load balancer needs to listen to on port 4200
bind 127.0.0.1:4200
mode http
default_backend testnodebackend
backend testnodebackend
# this is where I believe I need to add the proper functions
# based on url endpoint like mydomain.com/endpoint, I want
# to decide where service A needs to be called for token exchange
# this configuration currently points to two instances of the same
# server
balance roundrobin
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
option httpchk HEAD / HTTP/1.1\r\nHost:localhost
server node1 127.0.0.1:4201 check
server node2 127.0.0.1:4202 check
EDIT
I have found that custom request handlers can be added in HAProxy
using Lua as a scripting language. I have already set up my configuration which, can run "hello_world" examples from HAProxy. However, when it tries to load modules in Lua (like socket module), there is an import error. As soon as I have that fixed, I will add more on how setup these custom request handlers.