docker - Nginx 与 docker,未找到与斜线不同的位置
问题描述
概括
我创建了这个简单的示例来纠正和检查我在另一个更复杂的项目中遇到的错误。所以我有一个 docker-compose 文件,其中包含 1 个 Web 服务器和 2 个应用程序以及一个 nginx conf 文件。
请注意,我正在使用 Docker Quick Start Terminal 对其Windows 10 Home Edition
进行测试,但我什至已经进行Ubuntu 18.04
了测试,结果是相同的。
结果
前往:http: //192.168.99.100
:8080/默认输出:
有用!
这里唯一的问题是 app2,因为我无法访问 app2。
去http://192.168.99.100:8080/app2。
错误:
未找到
在此服务器上找不到请求的 URL。
我不明白为什么我不能这样做,错误在哪里。
我试过的
- 切换位置顺序,所以
location /app2
之后location /
,但没有任何改变 - 将 的位置更改
location /app2
为location /foo
,即使这里的结果相同。 - 更改与上一个示例相关的路径,任何不同的
location /
都不起作用。(例如location /bar
location /foobar
location /test
) 更改
location /
以引用 app2 而不是 app1,它可以工作,但这样我无法访问 app1。location / { proxy_pass http://app2:80; }
location /app1 { proxy_pass http://app1:80; }
代码
docker-compose.yml
version: "3.7"
services:
web:
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
ports:
- 8080:80
networks:
- app1_net
- app2_net
app1:
image: httpd:latest
networks:
- app1_net
app2:
image: httpd:latest
networks:
- app2_net
networks:
app1_net:
app2_net:
nginx.conf
events {}
http {
server{
listen 80;
listen [::]:80;
server_name localhost;
location /app2 {
proxy_pass http://app2:80;
}
location / {
proxy_pass http://app1:80;
}
}
}
解决方案
这是正确的方法,使用正则表达式允许子文件夹导航和 /app2 上的完美匹配来重定向http://app2上的流量:
location ~ ^/app2/(.*)$ {
proxy_pass http://app2/$1;
}
location = /app2 {
proxy_pass http://app2/;
}
location / {
proxy_pass http://app1;
}