AWS EC2上MERN应用出现504 Gateway错误求助
排查与解决MERN应用EC2部署的504 Gateway超时问题
一、深挖关键日志
虽然你提到Nginx和pm2日志无异常,但可以针对性排查以下日志:
- Nginx错误日志:默认路径为
/var/log/nginx/error.log,搜索504、timeout、proxy关键字。若未发现线索,可临时将Nginx日志级别改为debug(修改/etc/nginx/nginx.conf中error_log行),复现问题后改回warn/error。 - EC2系统日志:通过AWS控制台EC2实例的「监控」→「系统日志」,查看是否有内存/CPU耗尽、进程被OOM Killer终止的记录——EC2免费层仅1G内存,极易被MERN栈+Nginx+MongoDB连接池占满。
- MongoDB云日志:登录MongoDB控制台,查看数据库连接数、慢查询日志。免费版有连接数限制(通常50个),并发请求可能导致连接池耗尽,进而卡住API请求。
- Node.js进程错误输出:用
pm2 logs [api-app-name] --err单独查看API服务的错误日志,pm2默认日志可能遗漏异步错误或未处理的Promise拒绝。
二、排查性能瓶颈
1. 数据库查询优化
只读搜索场景下,慢查询是超时核心诱因:
- 给搜索字段加索引:例如针对关键词字段执行
db.collection.createIndex({ searchField: "text" }),用explain()分析查询计划,确认索引是否生效。 - 限制返回数据量:用
limit()+skip()实现分页,避免一次性返回大量数据,减少传输与处理耗时。 - 对齐区域部署:若EC2与MongoDB云服务器不在同一AWS区域,跨区域延迟会放大查询耗时,尽量将二者部署在同一区域。
2. Node.js/Express优化
- 清理冗余中间件:移除不必要的全局拦截器、日志类中间件,减少请求处理链路的耗时。
- 配置合理连接池:在Mongoose配置中设置
poolSize: 10(根据EC2内存调整,不宜过大),避免每次请求新建数据库连接。 - 开启Cluster模式:利用EC2多核CPU(免费层为1核,但Cluster模式可提升并发能力),通过
pm2 start api.js -i max启动多进程。
三、补充Nginx配置优化
你已添加超时配置,可进一步优化:
- 在
location /api/块内明确写入超时参数,避免全局配置未生效:
location /api/ { proxy_connect_timeout 600s; proxy_send_timeout 600s; proxy_read_timeout 600s; send_timeout 600s; # 原有配置保留... }
- 增加缓冲区配置,避免大响应导致超时:
proxy_buffers 8 16k; proxy_buffer_size 32k;
- 移除WebSocket升级配置:只读搜索应用无需WebSocket,删除
proxy_set_header Upgrade $http_upgrade;与proxy_set_header Connection 'upgrade';,减少Nginx处理逻辑。
四、EC2资源限制排查
EC2免费层资源有限,需重点监控:
- 实时查看资源占用:用
top/htop命令监控CPU、内存、Swap使用情况。若内存占用常超80%,可开启Swap分区:
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
- 控制进程数量:用
ps aux | grep node查看pm2启动的进程数,过多进程会占用内存,适当减少Cluster进程数。
五、并发请求模拟测试
用ab工具模拟并发请求,同时监控资源状态:
ab -n 100 -c 6 http://你的EC2公网IP/api/search?query=测试关键词
另开终端用htop(监控EC2资源)、mongostat(监控MongoDB状态)实时观测,定位是CPU、内存还是数据库连接的问题。
内容的提问来源于stack exchange,提问作者Sohil
相关产品推荐
相关产品推荐

