使用Angular HttpClient上传视频至AWS生产服务器遇net::ERR_CONNECTION_RESET错误
这种情况我之前帮不少开发者排查过,net::ERR_CONNECTION_RESET本质是连接在传输过程中被主动中断了,结合你仅MP4上传失败的现象,大概率是AWS端的配置限制在“搞鬼”,咱们一步步来定位解决:
1. 优先检查AWS负载均衡(ALB/ELB)的超时设置
MP4文件通常比图片、音频、PDF大很多,AWS负载均衡默认的**空闲超时(Idle Timeout)**是60秒,如果MP4上传耗时超过这个时间,负载均衡会主动断开连接,就会出现你看到的错误。
解决步骤:
- 登录AWS控制台,找到你的ALB/ELB实例
- 进入「属性」页面,修改「空闲超时」为300秒(5分钟)甚至更长,根据你最大的MP4文件大小调整
- 保存设置后重新测试MP4上传
2. 验证API Gateway的Payload大小限制
如果你的上传请求经过AWS API Gateway,它默认允许的最大Payload是10MB,大部分MP4文件都会超过这个阈值,直接触发连接中断。
解决步骤:
- 打开API Gateway控制台,找到对应的API
- 进入「设置」页面,找到「Maximum payload size」选项,调整到你需要的大小(最大支持10GB)
- 同时要确保后端服务(比如ECS、Lambda)也配置了对应的文件大小限制,避免后端截断请求
3. 检查服务器反向代理(Nginx/Apache)的配置
如果你的AWS服务器上部署了Nginx或Apache作为反向代理,它们也有默认的文件上传大小和超时限制,MP4超标就会被强制断开连接。
Nginx配置调整:
在Nginx的站点配置文件里添加或修改以下参数:
client_max_body_size 100M; # 允许100MB的文件上传 proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s;
修改后重启Nginx:sudo systemctl restart nginx
Apache配置调整:
在Apache的配置文件(比如httpd.conf或站点.conf)里添加:
LimitRequestBody 104857600 # 100MB(单位是字节) Timeout 300
重启Apache生效:sudo systemctl restart httpd
4. 排查AWS WAF的拦截规则
AWS WAF可能配置了针对请求大小或特定文件类型的拦截规则,不小心把MP4的上传请求给阻断了,导致连接重置。
解决步骤:
- 进入AWS WAF控制台,找到关联你的应用的Web ACL
- 检查所有规则,看看有没有「限制请求大小」或「拦截特定文件扩展名」的规则
- 可以临时禁用可疑规则,测试MP4是否能正常上传,确认后调整规则放行MP4格式
5. 微调Angular HttpClient的请求配置
虽然开发环境没问题,但生产环境网络延迟更高,前端请求超时设置太短也可能导致主动断开连接,或者检查MP4的请求头是否正确。
在你的上传请求里添加超时设置,并确保Content-Type正确:
import { HttpClient, HttpHeaders } from '@angular/common/http'; // 示例上传代码 const uploadFile = (file: File) => { const formData = new FormData(); formData.append('file', file); const headers = new HttpHeaders({ // 不要手动设置Content-Type为multipart/form-data,浏览器会自动处理边界 'Accept': '*/*' }); return this.http.post('/api/upload', formData, { headers: headers, timeout: 300000, // 设置5分钟超时 reportProgress: true }); };
6. 检查服务器磁盘空间与文件权限
极端情况:AWS服务器的磁盘空间不足,或者MP4上传的目标目录没有写入权限,服务器会主动断开连接。
解决步骤:
- 登录服务器,用
df -h命令检查磁盘剩余空间 - 用
ls -l /path/to/upload/dir查看目标目录的权限,确保运行后端服务的用户有写入权限
总结
先从负载均衡超时和API Gateway payload限制入手,这两个是AWS环境下大文件上传最常见的问题。你可以先传一个几MB的小MP4测试,如果能成功,基本可以锁定是超时或大小限制的问题。
内容的提问来源于stack exchange,提问作者Ashutosh Jha

