问题出现
第一次发现这个问题的时候是我在做其他的一个新增功能,然后我发现素材不够,我就想额外在新增点素材,就要需要使用上传文件这个功能,上传一点素材,结果发现就报以下错误
<html>
<head>
<title>500 Internal Server Error</title>
</head>
<body>
<center>
<h1>500 Internal Server Error</h1>
</center>
<hr>
<center>nginx/1.27.0</center>
</body>
</html>
排查问题
当时看到这个的第一反应是 500 的话就是服务器的问题,那么就是后端出问题了,所以我就各种排查,但都没得到解决。于是我就使用postman进行测试,先是直接进行后端发起请求
结果发现请求能走通,我又把请求路径换成前端发起的
postman也是报500,那么这样就能排除后端是没问题的,问题肯定是出在了网关和nginx之间。因为我们都知道,真实的请求的流程如图所示
那么开始怀疑网关,但如果是网关的话,我因为该网关下的所有请求都会进行拦截然后判断,但是我看网关微服务并没有任何拦截,也没有任何请求走到了网关,所以网关也排除了。
解决方法
接下来就是nginx,但因为前端的项目通过nginx做反向代理,我其它的功能都没问题,证明nginx启的前端服务是没问题,那么问题就出现在nginx本身上,查了很多资料发现是因为nginx去访问临时文件目录的时候没有权限导致的,将权限放开即可
sudo chown -R www-data:www-data /usr/local/var/run/nginx/client_body_temp/
sudo chmod -R 755 /usr/local/var/run/nginx/client_body_temp/
需要根据系统和Nginx用户调整 www-data 为适当的用户
还要确保 client_body_temp 目录存在。如果不存在,可以手动创建它:
sudo mkdir -p /usr/local/var/run/nginx/client_body_temp/
重启nginx即可,这个时候一定要注意,重启nginx的时候一定要加上 sudo 这个指令,这样才能给nginx足够的权限,否则依然会报500
目前这个问题只出现在了Mac版本的nginx上,windows版本的nginx暂时没发现过这个问题,不过有些文件太大的nginx做了限制,如果由于文件太大导致无法上传,可以配置nginx.conf