使用两个并行位置配置nginx proxy_pass

mar*_*mes 2 nginx

假设我们有以下几项最低要求nginx.conf

server {
  listen 443 default ssl;

  location /api/v1 {
    proxy_pass http://127.0.0.1:8080;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试将nginx自身用作事件源。我系统中的另一个组件应该知道有任何HTTP请求传入,而理想情况下不会在此第一个proxy_pass指令上阻止流量。

是否有可能proxy_pass在完全忽略该转发请求的结果的同时,将HTTP请求“转发”到另一个组件?

编辑:为了更清楚地陈述需求:我想要实现的是,将相同的 HTTP请求发送到两个不同的后端服务器,其中只有一个真正按照nginx处理连接。另一个应该只是一个“事件ping”,以通知其他服务已经有一个请求。

Day*_*ayo 6

这可以使用第三方Nginx Echo Module的echo_location指令(或类似的,浏览指令)来完成。您将需要使用此模块编译Nginx或使用Openresty,后者与Nginx捆绑在一起,例如有用的东西。

大纲代码:

server {
    [...]

    location /main {
        echo_location /sub;
        proxy_pass http://main.server:PORT;
    }
    location /sub {
        internal;
        proxy_pass http://alt.server:PORT;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在还有未记录的post_action指令,它不需要第三方模块:

server {
    [...]

    location /main {
        proxy_pass http://main.server:PORT;
        post_action @sub;
    }
    location @sub {
        proxy_pass http://alt.server:PORT;
    }
}
Run Code Online (Sandbox Code Playgroud)

在主请求完成后,这将触发一个子请求。这是我建议使用的一个旧答案:NGinx-对特定URL模式的Count请求

但是,此伪指令已从Nginx文档中删除,现在可以用作警告购买者。从我给出答案的2012年开始的四年后,我不建议您使用此答案。


小智 6

我知道这已经完成了,但我想用新的、更新的答案来回答,因为它在 3 年后出现在搜索中。镜子模块工作得非常好。我从 nginx 文档中得到了这个,所以我认为它是官方的并且可用。

server {
    [...]

    location /main {
        mirror /mirror
        proxy_pass http://main.server:PORT;
    }
    location /mirror {
        proxy_pass http://alt.server:PORT;
    }
}
Run Code Online (Sandbox Code Playgroud)