我正在为具有 Web 前端和 Flask 后端的应用程序设置一个 nginx Web 服务器,每个都在 docker 容器中运行。以下是我的 nginx 配置:
events{}
http{
client_max_body_size 50M;
server {
listen 80;
location /api {
proxy_pass http://0.0.0.0:5000;
}
location / {
root /var/www/;
try_files $uri /index.html;
}
}
}
我可以正常访问我的前端localhost
。但是,我的后端无法访问。
例如,我可以使用正确的端口直接访问后端:localhost:5000/api/alive
给了我预期的响应,但是localhost/api/alive
给了我
502 Bad Gateway
nginx/1.23.4
并出现以下错误
172.27.0.1 - - [07/Apr/2023:21:22:12 +0000] "GET /api/alive HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
2023/04/07 21:22:12 [error] 108#108: *35 connect() failed (111: Connection refused) while connecting to upstream, client: 172.27.0.1, server: , request: "GET /api/alive HTTP/1.1", upstream: "http://0.0.0.0:5000/api/alive", host: "0.0.0.0"
如何才能正确路由我的请求?我是 nginx 新手,不明白错误消息。
答案1
0.0.0.0
不是有效的 IP 地址。这是绑定到所有地址的符号,用于配置应侦听的服务。
将您的配置更改为环回接口的 IP 地址。
location /api {
proxy_pass http://127.0.0.1:5000;
}
关于docker容器:你无法通过以下方式访问另一个容器上的端口localhost
。每个容器都有自己的网络命名空间,由主机分隔。要从一个容器访问另一个容器,您有三种可能:
- 主机网络
- 容器链接(遗留,将来可能会被删除)
- 定制网络
由于自定义网络是最可行的选择,所以我将重点关注这一点。
您需要创建一个网络,并在创建容器时引用它。
docker network create my-network
docker run --network my-network --name db mariadb:latest
docker run --network my-network --name app -p 80:8080 myimage
db
现在您可以从内部通过其名称引用容器app
。您不需要在 db 容器中发布端口,因为它们共享同一个网络。
使用 docker-compose 时,您不需要做任何特殊的事情,当涉及的所有容器都在同一个 yaml 文件中定义时,它会默认为容器创建一个网络。
如果您有多个 yaml 文件并想要共享一个容器,例如单个数据库实例,您可以在docker-compose.yml
.