英文:
FastAPI + NGINX + Docker connection refused
问题
我试图创建一个简单的Docker Compose,其中包括启动两个容器,一个是下面所示的应用容器:
from fastapi import APIRouter
router = APIRouter()
@router.get("/")
async def root():
return {"message": "This is a Test"}
from fastapi import FastAPI
import uvicorn as uvicorn
from routers import test
app = FastAPI()
app.include_router(test.router)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
另一个容器是NGINX,其配置如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
proxy_pass http://0.0.0.0:8000;
}
}
}
我的Docker Compose 如下:
version: "3.7"
services:
web:
build: nginx
ports:
- "80:80"
depends_on:
- app
container_name: tensor_nginx
app:
build: app
ports:
- "8000:8000"
container_name: test
当我启动一切都正常,可以通过访问0.0.0.0:8000/docs连接到FastAPI创建的Swagger,并且端点返回了代码中定义的字符串。
但如果我尝试使用NGINX端口连接,它会显示连接失败的消息:
[error] 30#30: *5 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://0.0.0.0:8000/", host: "127.0.0.1"
我在配置中漏掉了什么?
英文:
I'm trying to create a simple docker-compose that would launch 2 containers one for the app as seen below:
from fastapi import APIRouter
router = APIRouter()
@router.get("/")
async def root():
return {"message": "This is a Test"}
from fastapi import FastAPI
import uvicorn as uvicorn
from routers import test
app = FastAPI()
app.include_router(test.router)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
The other for NGINX with the configuration:
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
proxy_pass http://0.0.0.0:8000;
}
}
}
My docker-compose is as followed:
version: "3.7"
services:
web:
build: nginx
ports:
- "80:80"
depends_on:
- app
container_name: tensor_nginx
app:
build: app
ports:
- "8000:8000"
container_name: test
When i fire up everything starts fine and I can connect to the Swagger created by FastAPI by going 0.0.0.0:8000/docs and the endpoint returns the string defined in the code.
But if I try to connect using nginx port it says connection failed.
[error] 30#30: *5 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://0.0.0.0:8000/", host: "127.0.0.1"
What am I missing in the configurations?
答案1
得分: 0
nginx
配置中的proxy_pass http://0.0.0.0:8000;
这行没有意义(因为nginx
部署在容器内,地址0.0.0.0
无法解析),在这里,您需要在最终设备或域名之前指定完整的地址。在您的情况下,您可以使用Docker Compose文件中的域名,例如:
proxy_pass http://app:8000;
或者手动设置主域名
app:
build: app
hostname: my-fastapi-app
ports:
- "8000:8000"
和
proxy_pass http://my-fastapi-app:8000;
英文:
The line proxy_pass http://0.0.0.0:8000;
of nginx conf does not make sense (since nginx is deployed inside a container, address 0.0.0.0 cannot be resolved), here you need to specify the full address before the end device or domain name. In your case, you can use the domain name from the docker compose file such as
proxy_pass http://app:8000
or set domain main manually
app:
build: app
hostname: my-fastapi-app
ports:
- "8000:8000"
and
proxy_pass http://my-fastapi-app:8000;
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论