使用 NGINX 反向代理到两个后端服务器

使用 NGINX 反向代理到两个后端服务器

我正在尝试学习如何配置 Nginx 代理。来自外部 (www.external.com) 的所有请求都应转到内部服务器 10.10.10.16:2080,但 www.external.com/nagios 请求除外,该请求应转到内部 10.10.10.18。

我的位置块如下所示:

    location ~* / {
        proxy_buffers 16 4k;
        proxy_buffer_size 2k;
        proxy_buffering off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Accept-Encoding "";
        proxy_pass http://10.10.10.16:2080;
        }       

    # # nagios server
    location  ~* /nagios/  {
        proxy_buffers 16 4k;
        proxy_buffer_size 2k;
        proxy_buffering off;
        # proxy_set_header Host $host;
        # proxy_set_header X-Real-IP $remote_addr;
        # proxy_set_header Accept-Encoding "";
        proxy_pass http://10.10.10.18;
        }

第一个位置似乎工作正常。但是,任何请求www.external.com/nagios让浏览器进入永恒的牧场。当然,10.10.10.18/nagios经过测试,运行良好。我遗漏了什么?

答案1

您应该了解 Nginx 如何处理位置。请参阅此内容旧维基或者新的一个或者这个博客

摘要:

位置规则有 4 种类型,并按以下优先级应用:

  1. 精确匹配:只能有一个完全匹配 - 线索就在名字里!例如:

    位置 = /foo/bar

  2. 高优先级前缀:可以有多个匹配,最长的匹配优先。例如:

    位置 ^~ /foo

  3. 正则表达式:可以有多个匹配项,第一个找到的匹配项优先。有两种变体

    位置〜.foo$(区分大小写的正则表达式)

    位置 ~* .foo$ (不区分大小写的正则表达式)

  4. 低优先级前缀:可以有多个匹配,最长的匹配优先。例如

    位置/foo

在您的情况下,这里是请求处理的逻辑伪代码:

if location begins with string /nagios:
    proxy_pass http://10.10.10.18;
else
    proxy_pass http://10.10.10.16:2080;

该逻辑可以用下面的方式转换为 nginx 配置。

编辑:根据 Tero Kilkanen 在下面的评论,我们可以在这种情况下删除正则表达式匹配,从而节省一些 CPU 资源。在这种情况下,我们只使用规则 Low priority prefix

location / {
    ...
    proxy_pass http://10.10.10.16:2080;
}

location /nagios {
    ...
    proxy_pass http://10.10.10.18;
}

相关内容