Multer本地运行正常但生产环境失效问题排查求助
问题:Multer处理multipart请求在生产环境挂起,Nginx报连接拒绝
开发环境功能正常,但部署到生产环境后出现异常:
- 未添加Multer时,接口能接收请求,但multipart form-data格式的请求体为空:
server.post('/something', async (req, res) => { console.log('start') console.log(req.body, res.body) res.sendStatus(200) })
- 添加Multer中间件后,请求直接挂起,Nginx提示连接超时:
server.post('/something', upload.any(), async (req, res) => { console.log('start') console.log(req.body, res.body) res.sendStatus(200) })
- 当前Multer配置:
const upload = multer()
- 测试差异:用Postman发送纯文本raw请求可正常响应,发送form-data请求时必挂起
已尝试的排查操作
- 给Multer添加
dest磁盘存储配置 - 为Node服务器设置超时参数
- 移除限流插件
- 在Nginx中调整超时配置
完整Nginx配置
worker_processes auto; #Check the concnections events { worker_connections 1024; multi_accept on; } http { client_max_body_size 15m; proxy_read_timeout 300; proxy_connect_timeout 300; proxy_send_timeout 300; upstream ip{ least_conn; server app:4000 weight=10 max_fails=3 fail_timeout=30s; } server { listen 8080; # ssl; server_name ip; # ssl on; location / { proxy_pass http://ip/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_ssl_server_name on; } } }
Nginx错误日志
*3 connect() failed (111: Connection refused) while connecting to upstream, client: ip, server: ip, request: "POST /something HTTP/1.1", upstream: "http://172.0.0.4:4000/something", host: "ip:8080"
排查建议
- 容器连通性验证:日志显示Nginx无法连接到
172.0.0.4:4000,先确认Node服务容器的实际IP是否为此地址,或者在Nginx容器内执行curl http://172.0.0.4:4000/something测试连通性;同时检查upstream中的app主机名是否能正确解析到Node容器IP。 - Multer存储方式调整:默认的内存存储可能在处理较大文件时导致Node服务内存溢出崩溃,改成磁盘存储测试:
const upload = multer({ dest: '/tmp/uploads/' })
- Nginx代理配置修正:全局设置的
Connection "upgrade"可能干扰普通form-data请求,针对/something接口单独覆盖配置:
location /something { proxy_pass http://ip/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header Connection ""; # 取消upgrade连接头 }
- Node服务日志排查:检查Node服务的运行日志,确认处理form-data请求时是否存在未捕获异常、内存不足等崩溃情况。
- 上传大小限制对齐:确保Node服务端也设置了对应大小的限制,比如给Multer添加
limits参数:
const upload = multer({ limits: { fileSize: 15 * 1024 * 1024 } // 和Nginx的client_max_body_size保持一致 })
内容的提问来源于stack exchange,提问作者JoseGE
相关产品推荐
相关产品推荐

