我正在尝试docker
在一台机器上设置多个具有相同映像的容器,并将所有应用程序托管在同一个域上,并以路径分隔。目的是将每个客户隔离到自己的容器中。即mydomain.com/aaa
……mydomain.com/bbb
等等。
我将其用作nginx
反向代理,并遵循了网上的各种示例。我的 nginx 配置如下:
server {
listen ...;
...
location / {
proxy_pass http://127.0.0.1:8080;
}
location /aaa {
proxy_pass http://127.0.0.1:8181;
}
location /bbb {
proxy_pass http://127.0.0.1:8282;
}
...
}
我注意到该应用程序期望托管在根目录下/
,但目前结果为 404。有没有一种巧妙的方法可以根据请求的来源将它们重写到它自己的路径中,而无需修改应用程序本身?
我知道使用子域名可能会更容易,但我想避免在客户来来去去时添加和删除子域名。
答案1
简单回答是不。
您需要考虑至少三个方面来强制应用程序远离根目录。
- 将基于根目录的 URL 映射到新位置 -这很容易,
proxy_pass
或者rewrite
- 映射重定向响应(301、302 等)-这很容易
proxy_redirect
- 映射资源 URL 和嵌入的超链接
最后一点并不容易。期望驻留在根目录中的应用程序通常会访问相对于根目录的资源,这意味着它们在反向代理中命中了错误的位置。
Apache 有一个模块可以重写 HTML 文档中嵌入的 URL,但对我来说这似乎效率不高。
首选解决方案是更改应用程序,使其资源和超链接 URL 成为路径相对或以相同的自定义路径为前缀。
答案2
我正在尝试进行相同的设置,因此遇到了相同的问题。在我看来,实际上必须更改后端应用程序,正如 Richard Smith 所描述的那样。对 nginx 使用不同的“外部”端口是一种解决方法,但并不优雅。