目录

  • 问题描述
  • 项目背景
  • 排查方向
  • 解决方案
  • 不需要密码认证
  • 需要密码认证
  • 总结



ps:排查方向很长,可以直奔解决方案

问题描述

项目背景

  1. 因为公司有安全要求所有的应用都要接入阿里云的负载均衡,所以部署了nginx文件服务器后又接入到负载均衡给系统调用了
  2. 开发来反馈说上传大于512KB的文件就报错“java.net.SocketException: Connection reset”,无法上传文件

排查方向

  1. . 我的第一想法就是nginx配置文件限制了文件的大小,所以修改了“ client_body_buffer_size”“client_header_buffer_size”等等跟大小相关的配置文件。(这里我要为自己的鲁莽干一杯,毕竟尝试了两天,修改了若干nginx)
  2. . 然后我想起来看日志报错才是明智的选择,所以配置了nginx日志。发现日志报错401 日志如下
1. :{ “@timestamp”: “29/Apr/2022:17:27:21 +0800”, “@fields”: { “uri”:“/abcd/20220429/4214/c54f8176040249cf8eeedaf806106bc2.png”,“url”:“/abcd/20220429/4214/c54f8176040249cf8eeedaf806106bc2.png”,“upstream_addr”:“-”,“remote_addr”: “10.97.134.68”, “remote_user”: “-”, “body_bytes_sent”: “179”, “http_Authorization”:“-”,“host”:“www.abcd.com.cn”,“server_addr”:“10.211.129.109”,“request_time”: “0.003”, “request_time”:“0.003”,“status”:“401”,“request”: “PUT /abcd/20220429/4214/c54f8176040249cf8eeedaf806106bc2.png HTTP/1.1”, “request_method”: “PUT”, “size”:179,“upstream_time”:“-”“http_referrer”: “-”, “body_bytes_sent”:“179”, “http_x_forwarded_for”: “10.190.0.17”, “http_user_agent”: “Jakarta Commons-HttpClient/3.1” } }
  1. 度了一下,nginx401报错是因为安全认证不通过,需要注释“auth_basic”和“auth_basic_user_file”,重启nginx。项目不需要密码认证的同学可以按照这个方案操作,然后下课了。
  2. 因为我的项目是需要密码认证的,所以我还需要继续排查,先检查客户端的请求头发现是带了认证信息的(很伤心,本来想帅锅给开发的)
  3. nginx 返回body nginx 返回401_linux

  4. 不能放弃啊,继续排查检查到阿里云的负载均衡了,这里提一嘴:七层负载是可以看日志的(嘻嘻)
  5. 发现不对劲的地方了,一个请求返回两次状态码,盲猜401是后端nginx返回的,那么400就是负载均衡返回的了。
  6. nginx 返回body nginx 返回401_nginx 返回body_02

  7. 这时候我不得不怀疑是负载均衡吃掉了请求头,所以我把文件服务器从域名改成了后端地址,结果大文件竟然上传成功了。至于为啥负载均衡会吃掉请求头这点就不研究了,本酸菜鱼只想解决问题。附上成果图
  8. nginx 返回body nginx 返回401_linux_03


  9. nginx 返回body nginx 返回401_nginx 返回body_04

解决方案

不需要密码认证

vim nginx.conf
# 注释这两行
	                # auth_basic "auth needed";
                   # auth_basic_user_file /opt/project/nginx/conf/passwd.conf;

# 重启服务
../../sbin/nginx -t
../../sbin/nginx  -s reload

nginx 返回body nginx 返回401_nginx 返回body_05

需要密码认证

如果你跟我一样nginx前面还加了一层负载均衡,可以尝试去掉负载均衡,直接调用文件服务器

nginx 返回body nginx 返回401_nginx_06


nginx 返回body nginx 返回401_nginx 返回body_07

总结

文件服务器上传大文件失败不一定是后端nginx的限制了文件大小的原因,这次主要的原因是401 authorization required,以后先看日志,再思考排查方向。嗨害嗨。

nginx 返回body nginx 返回401_linux_08