前端使用 Nuxt.js 打包为 SPA ,使用 docker + Nginx 部署,生产环境有个文件上传接口报错, 接口使用 Nginx 反代到 Java 服务 报错信息为: { "message": "An unexpected error occurred", "request_id": "b7aa8b336db52027b752634d9fba3b47" } 接口是传统的 POST + FormData 形式,此时 nginx 日志里也没有这个请求 在添加手动添加 heade 头 Content-Type: multipart/form-data 后报错会消失,但此时后台没有接收到 body 同时使用 postman 可以调通,nginx 也有日志信息 Nginx 关于文件上传相关的配置应该都配置上了,测试环境正常访问, 怀疑是 https 的问题, 之前部署过的项目都是上传请求都是 http1.1 ,这个是 h2
人麻了
1
oneisall8955 3 天前
nginx 的过敏配置贴一下
|
2
nxgh OP |
3
Suaxi 2 天前 via Android
此时 nginx 日志里也没有这个请求
但此时后台没有接收到 body 同时使用 postman 可以调通 看描述有点乱,建议分别贴一下 nginx 的配置,error log ,java 服务端有报错的全量栈信息也可以贴一下 ps: 1. postman/swagger 等等直接调接口能调通,检查一下前端的统一请求拦截(一般文件上传和普通的 crud 接口要分开处理一下) 2. 如果服务端正确收到了请求(请求顺利通过网关等转发到了对应的服务),但是上传失败,一般在报错的栈信息那就能找到问题 3. nginx 配置这里一般就是 request_body_size 大小的设置,内部的 http 已经被反代为了 https ,和是否 https 没有太大关系 |
4
evan1 2 天前
postman 能调通的话应该是前端调用的问题。
把 postman 的 console 打开看看请求详细信息,request head 、body 等等,对比下前端发起的请求的 head 、body 看看有什么区别。 |
5
nxgh OP @Suaxi 原本应该有换行的;
使用浏览器访问就会返回 [An unexpected error occurred] 没有其他的信息, 此时 nginx 没有关于这个接口的日志,error_log 等级已经设置为 debug 了 前端请求方式应该啥没问题,测试环境过了而且在报错后试过好几种方式。Nuxt.js 的 $fetch 、和默认的 fetch XHR axios 等 在不让浏览器自动生成 boundary 参数,手动添加 Content-Type 时,接口能访问通,ngxin 可以看到日志。但是服务端拿不到请求体。 |
9
majunbo 2 天前
既然是 https ,你 nginx 不应该有 443 的端口配置吗?你上面只有 80 呀。
|
13
GGbeng1 2 天前
你这个配置不是生产的配置吧,看着配置没啥问题
http2 默认只能在 https 下生效,需要 ssl 后面加个 http2 会不会是文件大小问题 |