Load balancing according to url

Hi All,

Can anyone please help me with the below requirement.

Host machine contains a plugin and it communicates with a plugin handler
running on backend servers and nginx is used to load balance the
requests.

host machine(plugin) ===== >nginx as load balancer =====>3 backend
servers
which hosts plugin handler

I need to load balance the requests based on customer-id field in host
machine.

curl ’

http://localhost:8031/test1/test2/test3/customer/123456789999999999/......./

customer-id: 123456789999999999
customer-id changes with customers.

Since the requests come from same machine, I can’t use ip_hash or cookie
based load balancing technique.

My requirement is to load balance according to customer id and if same
request comes the same customer it should go to same earlier server
which
served the request.

I am planning to extract the customer-id in nginx configuration file and
add them on the fly in the config file and compare the ids using “map”
directive. But unable to know which server served the requests to
customer-id:

map $customer_id $sticky_backend {
default bad_gateway;
<cust-id_1> <server 1>;
<cust-id_2> <server 2>;
}
if ( $request_uri ~ ^/(.)/(customer)/(.?)/(.*)/ ) {
set $customer_id $3;

Thanks
Eswar

there’s a sticky-module (3rd-party), maybe this works out of the box
for you.

https://code.google.com/p/nginx-sticky-module/wiki/Documentation

Posted at Nginx Forum:

You chain two map directives. Like this:

map $uri $customer_id {
~/customer/(?<cust_id>[^/]+)/.*$ $cust_id;

}

map $customer_id $sticky_backend {
default bad_gateway;
<cust-id_1> <server 1>;
<cust-id_2> <server 2>;
}

----appa

Hi Antonio,

Thanks for the response.

I am unable to understand your solution.

As I said, I am unable to know which server served the requests to
respective customer-id.
So I cant write the below map directive.
map $customer_id $sticky_backend {
default bad_gateway;
<cust-id_1> <server 1>;
<cust-id_2> <server 2>;
}

Thanks
Eswar

Hi Mex,

Thanks for the response.

But I don’t think the sticky-module is going to help in my case where
the
load balancing is to be done based on a particular filed in the URL.

Thanks
Eswar

Hi.

Emm, maybe you want to make some kind of sharding by the value of your
cookie?

upstream http://wiki.nginx.org/NginxHttpUpstreamModule#upstream
backend {
server http://wiki.nginx.org/NginxHttpCoreModule#server server1;
server http://wiki.nginx.org/NginxHttpCoreModule#server server2;
hash $customer_id;}