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

8
假设我们有以下非常简单的nginx.conf配置文件:
server {
  listen 443 default ssl;

  location /api/v1 {
    proxy_pass http://127.0.0.1:8080;
  }
}

现在,我正在尝试将nginx本身用作事件源。 我系统中的另一个组件应该知道任何HTTP请求的到来,同时最好不阻塞第一个proxy_pass指令上的流量。
是否有可能有第二个proxy_pass,它“只是”将HTTP请求转发给另一个组件,同时完全忽略该转发请求的结果?
编辑:为了更清楚地说明要求:我想实现的是相同的HTTP请求发送到两个不同的后端服务器,其中只有一个真正处理与nginx相关的连接。 另一个应该只是一个“事件ping”,以通知其他服务已经有一个请求。

你是怎么做到的?我有一个类似的场景,需要向两个服务器(A和B)发送请求,并且只需要考虑来自服务器A的响应。一旦从服务器A收到响应,我想立即将接收到的响应发送回客户端。下面给出的答案可能不再适用于最新版本的nginx。 - user
3个回答

9
这可以使用第三方Nginx Echo Moduleecho_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;
    }
}

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

server {
    [...]

    location /main {
        proxy_pass http://main.server:PORT;
        post_action @sub;
    }
    location @sub {
        proxy_pass http://alt.server:PORT;
    }
}

这将在主请求完成后触发子请求。这是我以前推荐使用它的答案链接:NGinx - Count requests for a particular URL pattern。然而,该指令已被从Nginx文档中删除,进一步使用现在是买方自负的情况。从2012年我提供答案到现在四年过去了,我不建议使用这个。

正是我所需要的,感谢您的解释和提供的替代方案! - markusthoemmes
@Dayo 鉴于答案有些陈旧,根据您的看法,最佳实现方式是什么?场景:我需要向两个服务器(A和B)发送请求,并且只需考虑来自服务器A的响应。一旦从服务器A收到响应,我希望将接收到的响应立即发送回客户端。 - user
@user 你测试过建议的 Echo 模块选项并发现它无效吗?还有一个 Mirror 模块,它可以复制旧的 post_action 指令。 - Dayo

6

我知道这个问题已经得到解决,但我想给出更新后的答案,因为它在3年后的搜索结果中出现了。mirror模块效果非常好。我从nginx文档中获得了这个信息,所以我认为它是官方提供的,并且可用。

server {
    [...]

    location /main {
        mirror /mirror
        proxy_pass http://main.server:PORT;
    }
    location /mirror {
        proxy_pass http://alt.server:PORT;
    }
}

0

这是nginx的一个巨大优势:您可以从多个后端服务器提供服务。您只需要包含一个更多的位置,由另一个方向引用即可。这里是我的sites-available/default的示例,它可以从fastcgi(monodevelop)、glassfish(java)、静态内容和特殊错误处理中提供服务。希望对您有所帮助。

   #fastcgi
    location ~* \.(aspx)$ {
            root /home/published/;
            index Default.aspx;
            fastcgi_index Default.aspx;
            fastcgi_pass 127.0.0.1:9000;
            include /etc/nginx/fastcgi_params;
    }

    #Glassfish
    location /GameFactoryService/   {

            index index.html;

            add_header Access-Control-Allow-Origin $http_origin;

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-NginX-Proxy true;
            proxy_ssl_session_reuse off;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:18000/GameFactoryService/;
    }

    #static content
    location / {
            root /usr/share/nginx_static_content;
    }

    error_page 500 501 502 503 504 505 506 507 508 509 510 511 /50x.html;

    #error
    location = /50x.html {

      add_header Access-Control-Allow-Origin $http_origin;          
      internal;          
    }

这正是我不想要的。我正在研究将请求发送到一个位置上的两个后端。编辑问题以更精确地描述。 - markusthoemmes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接