我正在尝试学习如何配置 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 种类型,并按以下优先级应用:
精确匹配:只能有一个完全匹配 - 线索就在名字里!例如:
位置 = /foo/bar
高优先级前缀:可以有多个匹配,最长的匹配优先。例如:
位置 ^~ /foo
正则表达式:可以有多个匹配项,第一个找到的匹配项优先。有两种变体
位置〜.foo$(区分大小写的正则表达式)
位置 ~* .foo$ (不区分大小写的正则表达式)
低优先级前缀:可以有多个匹配,最长的匹配优先。例如
位置/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;
}