【发布时间】:2020-02-24 05:34:57
【问题描述】:
我成功地使用了 Nginx 作为负载均衡器和反向代理,但是这个看起来很简单的问题却让我大吃一惊。我花了几个小时尝试配置 Nginx 但失败了。
我有一组动态的服务器/主机名(因为使用了 docker),比如 service2、service3、service5。我只是想将 nginx 配置为基于 URL 代理到这些。这样做的目的是让我可以从单个端点访问服务,而不是全部公开。
这是我正在尝试使用的代理类型
- http://localhost:8009/service2 => http://service2:80
- http://localhost:8009/service5/home => http://service5:80/home
- http://localhost:8009/service5/home?action=something => http://service5:80/home?action=something
如果我指定所有端点,它仍然有效,尽管仍然只适用于初始页面,所以 http://localhost:8009/service2 代理到 http://service2/ 但是 http://localhost:8009/service2/home 只是失败,但这是因为它无法匹配位置。如果我只是做定位/它可以工作,那么我只能将所有请求反向代理到单个服务器。
server {
listen 80;
server_name localhost;
location /service2 {
proxy_pass http://service2/;
}
location /service5 {
proxy_pass http://service5/;
}
}
这可能是我将 url 正则表达式变为动态的最佳示例,但这只是错误,因此假设它对 nginx 无效。
server {
listen 80;
server_name localhost;
location ~ (?<myhost>.*)/(?<myuri>.*)$ {
proxy_pass http://$myhost/$myuri;
}
}
【问题讨论】:
-
@CalumHalpin Nginx 支持命名捕获就好了。
-
我不确定 Nginx 如何解析
service2和service5名称。如果它需要使用 DNS,您可能需要在使用带有变量的proxy_pass时定义一个resolverdirective。您捕获的内容不包括查询字符串(因为它们不存在于location正则表达式中),但您可以使用proxy_pass http:/$request_uri;代替,因为该变量已经包含字符串/serviceX/...。 -
@RichardSmith 我已经添加了解决方法,请参见下面的答案,但仍然存在问题。它确实稍微改变了行为,所以它检测到了一些东西,但仍然不太正确。
标签: docker nginx nginx-location nginx-reverse-proxy nginx-config