如何让FastAPI应用同时运行在多个端口上?
FastAPI同应用多端口监听解决方案
方案一:修改Python代码实现多端口绑定
原生uvicorn.run()不支持直接传入多端口列表,我们可以通过多线程启动多个Uvicorn服务实例,共用同一个FastAPI应用对象实现需求,代码如下:
from fastapi import FastAPI import uvicorn import threading app = FastAPI() @app.get("/healthcheck/") def healthcheck(): return 'Health - OK' def run_uvicorn_server(port: int): config = uvicorn.Config( app=app, host="0.0.0.0", port=port ) server = uvicorn.Server(config) server.run() if __name__ == "__main__": # 可自由调整需要监听的端口列表 listen_ports = [30000, 8443] server_threads = [] for port in listen_ports: thread = threading.Thread(target=run_uvicorn_server, args=(port,)) thread.start() server_threads.append(thread) # 阻塞主线程直到所有服务线程退出 for thread in server_threads: thread.join()
该方案下两个端口的请求都会由同一个FastAPI应用处理,完全兼容你现有的业务逻辑,Docker启动命令不需要修改,仍然可以使用CMD ["python3", "app.py"]。
方案二:调整Docker启动命令(无需修改Python代码)
生产环境更推荐使用Gunicorn作为进程管理器配合Uvicorn Worker实现多端口绑定,不需要修改原有Python代码,仅需调整依赖和Dockerfile即可:
- 首先在项目依赖文件(如requirements.txt)中新增gunicorn依赖:
fastapi uvicorn gunicorn - 修改Dockerfile的CMD指令:
# 原有构建步骤保持不变 CMD ["gunicorn", "-k", "uvicorn.workers.UvicornWorker", "-w", "1", "--bind", "0.0.0.0:30000", "--bind", "0.0.0.0:8443", "app:app"]
参数说明:
-w 1:指定工作进程数为1,可根据实际需求调整为更大值- 多个
--bind参数分别绑定需要监听的端口 - 末尾
app:app对应你的Python入口文件名(app.py)和FastAPI实例变量名(app)
内容的提问来源于stack exchange,提问作者Anirban Saha
相关产品推荐
相关产品推荐

