You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EC2实例Docker部署FastAPI端口连接拒绝问题求助

问题原因分析

1. Docker容器端口未映射到宿主机

你的容器启动命令仅使用了--expose 8383,这个参数只是在Docker镜像/容器层面声明要暴露的端口,不会将容器内部的8383端口绑定到EC2宿主机的任何端口。这就导致宿主机的localhost:8383实际上没有被监听,Nginx的反向代理请求自然会失败,外部访问也就无法正常响应。

2. 外部访问路径的误解

你提到外部主机访问时出现Failed to connect to localhost port 8383的错误,这说明你可能直接在外部主机尝试访问localhost:8383(这只会访问外部主机自身的端口,而非EC2实例),或者是Nginx在转发请求到宿主机localhost:8383时失败,因为宿主机端口未被容器绑定。

3. 安全组配置隐患(补充检查点)

即使端口映射正确,如果EC2安全组没有开放80(HTTP)和443(HTTPS)端口,外部也无法通过域名访问你的服务。


解决方法

1. 修正Docker启动命令,添加端口映射

将容器的8383端口绑定到EC2宿主机的8383端口,使用-p参数:

docker run --rm -p 8383:8383 <my-image>
  • -p 宿主机端口:容器端口:完成宿主机与容器的端口绑定,这样宿主机的localhost:8383就会转发到容器内部的8383端口。
  • 不需要再单独加--expose,因为你的Dockerfile里已经通过EXPOSE ${PORT}声明了端口,启动时-p会自动处理端口暴露。

2. 验证端口映射是否生效

执行以下命令检查宿主机是否在监听8383端口:

netstat -tulpn | grep 8383

如果看到类似0.0.0.0:8383的监听记录,说明映射成功。

3. 检查Nginx配置与状态

  • 确保Nginx服务正常运行:
    sudo systemctl status nginx
    
  • 验证Nginx配置语法是否正确:
    sudo nginx -t
    
  • 如果配置有修改,重新加载Nginx:
    sudo systemctl reload nginx
    

4. 确认EC2安全组配置

登录AWS控制台,检查EC2实例的安全组规则:

  • 添加入站规则:允许0.0.0.0/0(或指定的IP范围)访问80(TCP)和443(TCP)端口。
  • 不需要开放8383端口给外部,因为外部是通过Nginx的80/443端口访问,8383只需要在宿主机内部被Nginx访问即可。

5. 正确的外部访问方式

外部主机应通过你的域名https://mydomain.com访问服务,而不是直接访问EC2实例的8383端口。如果需要测试,在外部主机执行:

curl https://mydomain.com

内容的提问来源于stack exchange,提问作者e-e

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:05:23