在AWS EC2上使用Docker和Nginx部署Angular失败求助
我来帮你一步步排查这个网站访问超时的问题,先把你的环境和操作梳理清楚:
环境与操作梳理
Docker文件夹结构
. ├── default.conf ├── dist │ ├── 3rdpartylicenses.txt │ ├── favicon.ico │ ├── index.html │ ├── main.814148b8a52c3996d8f6.js │ ├── polyfills.c72d3210425a88b28b6d.js │ ├── runtime.6afe30102d8fe7337431.js │ └── styles.914f038ddd792d8e3589.css └── Dockerfile
Nginx配置文件(default.conf)
server { listen 80; server_name localhost; root /usr/share/nginx/html; charset utf-8; location / { try_files $uri /index.html; } }
Dockerfile内容
FROM nginx:1.13.3-alpine COPY default.conf /etc/nginx/conf.d/ RUN rm -rf /usr/share/nginx/html/* COPY dist/ /usr/share/nginx/html/ CMD ["nginx", "-g", "daemon off;"]
已执行的操作
- 构建镜像:
docker build -t nanda_image . - 启动容器:
docker run --rm --name nanda_container -p 80:80 nanda_image
当前状态
docker container ls显示容器处于正常运行状态(Up状态)netstat -nlp显示80端口已被docker-proxy监听
但访问EC2公网IP时出现响应超时,接下来我们逐一排查可能的问题:
排查步骤
1. 优先检查EC2安全组配置(最常见原因)
外部请求超时大概率是安全组没开放对应端口:
- 登录AWS控制台,找到你的EC2实例,进入安全组设置页面
- 确保入站规则中添加了
HTTP(80)端口的允许规则:- 来源可暂时设为
0.0.0.0/0(测试用,后续可按需缩小范围)或你当前的公网IP - 协议选择
TCP,端口范围填80
- 来源可暂时设为
如果安全组未开放80端口,外部请求根本无法到达EC2实例,必然会超时。
2. 验证EC2实例内部能否访问容器服务
SSH登录到EC2实例,执行以下命令测试本地访问:
curl http://localhost:80
- 如果能返回
dist/index.html的内容,说明容器内的Nginx服务正常,问题出在外部网络层面(安全组/网络ACL) - 如果curl也超时,需要检查容器本身:
- 查看容器日志:
docker logs nanda_container,确认Nginx是否有启动报错 - 进入容器验证配置:
docker exec -it nanda_container /bin/sh,然后执行nginx -t检查Nginx配置是否合法
- 查看容器日志:
3. 检查子网的网络ACL配置
如果安全组没问题,再检查EC2所在子网的网络ACL:
- 网络ACL是无状态的,需确保入站规则允许80端口的TCP流量,同时出站规则允许响应流量(至少允许80端口的回包)
- 若ACL规则限制了流量,也会导致外部请求无法正常连通
4. 确认访问的是EC2公网IP
- 检查你访问的IP是否为EC2实例的公网IP(而非私有IP)
- 可在EC2内部执行
curl http://169.254.169.254/latest/meta-data/public-ipv4获取公网IP,确认和你访问的地址一致
5. 排除本地网络限制
- 尝试切换网络(比如用手机流量访问),排除本地防火墙、代理对80端口请求的拦截
- 也可以用在线端口检测工具,输入EC2公网IP和80端口,验证端口是否能被外部连通
建议先从安全组开始排查,这是此类问题的高发点。如果还有疑问,可以把docker logs nanda_container的输出贴出来,方便进一步分析。
内容的提问来源于stack exchange,提问作者Mars Lee
相关产品推荐
相关产品推荐

