基于源IP的Nginx TCPstream路由

我已将nginxconfiguration为TCP(非http)stream的反向代理。 我想对特定的源IP地址应用不同的路由 – 可以这样做,以及如何? 我知道使用if伪指令的http模块的推荐,但似乎不适用于这些stream。

现有configuration:

stream { server { listen 8000; proxy_pass staging; } } upstream staging { server 1.2.3.4:8000; } 

期望的configuration(不工作):

 stream { server { listen 8000; proxy_pass staging1; if ( $remote_addr ~* 4.5.6.7 ) { proxy_pass staging2; } } } upstream staging1 { server 1.2.3.4:8000; } upstream staging2 { server 1.2.3.44:8000; } 

这给错误“24314#24314:”如果“指令不允许在这里”,因为它不适用于stream模块 – 是否有任何其他function,我怎么能达到类似的结果?

您可以使用指令map来执行此操作。 像这样(未经testing)。

 upstream staging1 { server 1.2.3.4:8000; } upstream staging2 { server 1.2.3.44:8000; } map $remote_addr $upstream { 4.5.6.7 staging2; default staging1; } stream { server { listen 8000; proxy_pass $upstream; } }