AWS EC2上Docker部署FastAPI无法访问问题排查求助
AWS EC2 Docker运行FastAPI无法外部访问的排查与解决
初始问题排查(显示Nginx欢迎页时)
当EC2控制台显示Uvicorn在http://0.0.0.0:80运行,但访问公网IP或EC2本地localhost显示Nginx默认页,需排查以下内容:
- Docker端口映射:确认启动容器时是否添加端口映射参数,比如
docker run -p 80:80 你的镜像名。若未映射,EC2主机的80端口会被Nginx占用,导致访问走Nginx而非容器内的FastAPI服务。 - 端口占用检查:执行
ss -tulpn | grep :80,查看80端口被哪个进程占用。如果结果显示nginx,说明容器未正确映射80端口,或映射到了其他端口。 - 容器运行状态:执行
docker ps,确认容器处于运行状态,且PORTS列显示正确的端口映射(如0.0.0.0:80->80/tcp)。
Nginx反向代理简便配置
若需保留Nginx做反向代理,可使用以下简化配置:
- 创建Nginx配置文件(如
/etc/nginx/sites-available/fastapi.conf):
server { listen 80; server_name 你的EC2公网IP; location / { proxy_pass http://localhost:主机映射端口; # 例如容器映射到主机8000,则填写http://localhost:8000 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
- 创建软链接到启用目录:
ln -s /etc/nginx/sites-available/fastapi.conf /etc/nginx/sites-enabled/ - 重启Nginx生效:
nginx -s reload
注意:此时容器需映射到主机非80端口(如8000),避免与Nginx的80端口冲突。
停用Nginx后本地无法访问的排查
停用Nginx后EC2内部可访问,但本地笔记本无法访问,且已检查安全组、sudo ufw status返回inactive(即防火墙未启用),需排查:
- Docker端口映射有效性:再次确认启动容器时的端口映射参数,比如
docker run -p 80:80 你的镜像名,必须确保容器内的端口映射到EC2主机的0.0.0.0(而非仅localhost)。 - 主机端口监听状态:执行
ss -tulpn | grep 你的映射端口,确认主机在监听该端口(比如映射80的话,应看到docker-proxy监听0.0.0.0:80)。 - AWS网络ACL配置:检查EC2所在子网的网络ACL,确保允许入站的目标端口(如80)流量,同时允许出站的响应流量(一般允许所有出站即可)。
- 公网IP正确性:确认访问的是EC2的公网IP/弹性IP,而非私有IP,且EC2已成功分配公网IP。
- 端口连通性测试:在本地执行
telnet 你的EC2公网IP 映射端口或nc -zv 你的EC2公网IP 映射端口,判断是否能建立连接,定位是网络阻塞还是服务问题。
内容的提问来源于stack exchange,提问作者breakshooter
相关产品推荐
相关产品推荐

