我正在尝试学习如何configurationNginx代理。 所有来自外部(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已经过testing,工作正常。 我错过了什么?
您应该了解Nginx如何处理位置。 看到这个旧的维基或新的或这个博客 。
摘要:
定位规则有4种types,适用于以下优先级:
完全匹配:只能有一个完全匹配 – 线索就是名字! 例如:
location = / foo / bar
高优先级前缀:可以有多个匹配,最长优先。 例如:
位置^〜/ foo
正则expression式:可以有多个匹配,第一个匹配优先。 有两个变种
位置〜.foo $(区分大小写的正则expression式)
位置〜* .foo $(不区分大小写的正则expression式)
低优先级前缀:可以有多个匹配,最长优先。 例如
位置/美孚
在你的情况下,这里请求处理的逻辑伪代码:
if location begins with string /nagios: proxy_pass http://10.10.10.18; else proxy_pass http://10.10.10.16:2080;
该逻辑可以转换为下面的nginxconfiguration。
编辑:基于以下来自Tero Kilkanen的评论,我们可以在这种情况下删除正则expression式匹配,从而节省一些CPU资源。 在这种情况下,我们只使用 Low priority prefix
location / { ... proxy_pass http://10.10.10.16:2080; } location /nagios { ... proxy_pass http://10.10.10.18; }