Home > Enterprise >  Nginx: Is it possible to resolve to different services based on a regexp over the URL and method?
Nginx: Is it possible to resolve to different services based on a regexp over the URL and method?

Time:01-29

I searched and I couldnt' find any way to do this, so I am wondering if it is possible.

I have a service running that accepts requests and everything works fine. However, I'd like to answer some of these requests with a different service running on the same machine. These requests are the ones going to some/path/{variable}/etc and method POST.

So I would like to know if it possible to do this directly from nginx without adding any overhead.

My first solution was creating a different API that receives all the requests and if it is not the one I want to incercept, just did a proxy request to the origianl service. But this added between 200 and 500ms to every response, which is not acceptable in our use case.

So I thought that doing this through nginx would resolve much faster, but I couldn't find a way or even find out if it is possible.

Any help would be highly appreciated. If you have any other idea or alternative that I could test or implement, it would be welcome as well.

Edit: Per request by Ivan's comment.

We have already nginx running, serving all the requests by service1.

What we would like to do is:

if request.path is in the form of /path/{variable}/etc and request.method==POST:
      serve using service2
else:
      serve using service1

CodePudding user response:

Assuming you services hosted on the same server and differs in access ports, using a chain of the map blocks should do the trick:

map $uri $service_by_uri {
    ~^/path/[\w\d] /etc  127.0.0.1:10002; # service 2
    default              127.0.0.1:10001; # service 1
}
map $request_method $service {
    POST                 $service_by_uri; # select service according to the request URI
    default              127.0.0.1:10001; # service 1
}
server {
    ...
    proxy_pass           http://$service;
    ...
}
  •  Tags:  
  • Related