Nginx:是否可以根据 URL 和方法的正则表达式解析不同的服务?

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

我搜索过但找不到任何方法,所以我想知道是否可行。

我有一个接受请求的服务 运行,一切正常。但是,我想在同一台机器上用不同的服务 运行 来回答其中一些请求。这些请求将发送给 some/path/{variable}/etc 和方法 POST

所以我想知道是否可以直接从 nginx 执行此操作而不增加任何开销。

我的第一个解决方案是创建一个不同的 API 来接收所有请求,如果它不是我想要拦截的请求,则只向原始服务发送代理请求。但这为每个响应增加了 200 到 500 毫秒,这在我们的用例中是不可接受的。

所以我认为通过nginx来解决会更快,但是我找不到方法甚至不知道是否可行。

如有任何帮助,我们将不胜感激。如果您有任何其他我可以测试或实施的想法或替代方案,也将受到欢迎。

编辑:根据 Ivan 的评论请求。

我们已经有 nginx 运行,通过 service1 处理所有请求。

我们想做的是:

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

假设您的服务托管在同一台服务器上并且访问端口不同,使用 map 块链应该可以解决问题:

map $uri $service_by_uri {
    ~^/path/[\w]+/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;
    ...
}