NGINX 服务器反向代理导致上传错误问题

nginx2011

折腾一晚上,问题终于解决。是 nginx 反向代理配置所导致的。至于解决问题的详细过程,我在后面会贴出地址或者大家可以自行搜索。

我主要想分享解决 BUG 的思路,在苦苦折腾了一夜,运用了各种搜索利器,百度、谷歌、必应无果后,我真是身心疲惫。

一直在搜索出现具体问题的解决方法,可这样往往就像钻进套子里的人。只死死地盯到眼前。

这次我最大的收获是“如何学会用放大镜查找问题”的方法,这个是难能可贵的。往往比找到解决具体问题的方法还值得和大家分享。

每个BUG可能会因为各种各样的问题所导致。那就没有必要盯在一处,应该把目光移开的远一点。

比如我这次的问题是, WordPress 在上传附件的时候,提示 HTTP 错误。我就一直搜索 WordPress 上传附件 HTTP 错误的解决方法,结果找了一晚上也没有找到。

到天亮的时候,走在路上。我突然想到,既然这个 WordPress 网站有问题,那同服务器的其他 WordPress 网站呢, 甚至除了 WordPress 其他程序的网站呢?

结果经过测试,同服务器中其他网站依然出现相同的错误。 (WordPress 网站和 Drupal 网站)只是他们的报错方式不一样。但应该属于同一个问题所引起的。

WordPress 提示 HTTP 错误 ,而 Drupal 提示500错误 。那就应该不是程序本身的问题。所以扩大搜索范围。经过分析,可能是 nginx 服务器的相关配置问题。

于是改变搜索方向,搜索关键字:nginx 服务器上传文件返回500错误 。结果就很容易找到了解决办法。

当一条路走不通时,应该调头或者停下来休息一下再走。

相关技术:nginx反向代理

导致上传文件失败原因:

  1. client_body_buffer_size 配置请求缓存区大小
  2. client_body_temp_path 设置临时文件存放路径。
  3. client_max_body_size 设置上传文件的最大值。

我在 nginx.conf 没有配置 client_body_buffer_size 的大小,client_body_buffer_size 系统默认 8K (32位)或者16K(64位),没有创建 client_body_temp_path 临时目录。如果上传超过16K的文件会提示失败。

工作原理:如果上传文件大小超过client_body_buffer_size 默认值就把会文件放到client_body_temp_path 设置的临时目录中。

延伸:至于 client_body_buffer_size 到底设置多大合适,我又搜索了半天没有找到相关文章。基本设置都在128k 或者 256k 居多,具体原因也不得而知。至于临时目录一定要给写入权限。

这是我最后的配置:

client_max_body_size 20m;
client_body_buffer_size 256k;
client_body_temp_path /etc/nginx/proxy_temp;

相关网址:

http://blog.csdn.net/zhenxino8/article/details/38981833

http://nginx.org/en/docs/http/ngx_http_core_module.html

发布者

rockts

喜欢技术,乐于开源! 乐可开源,想改变的也只有世界!

11 thoughts on “NGINX 服务器反向代理导致上传错误问题”

  1. 请问一下,你用到了upload module吗?使用nginx代理时上传文件一定要用到它吗?我的其它请求都正常,只有长传文件的时候返回502或者400,不知道为什么?谢谢指点。

    1. 还没有,请问你的那三条语句加在了哪里啊?
      在nginx.conf里:
      http{
      …a
      server{
      …b
      location / {
      …c
      }
      }
      }
      是a、b还是c那里啊?

        1. 我试过了,还是不行。我的程序在本地可以成功,放到服务器经过nginx代理就不行了,我的请求参数类型是multipart/form-data。参数包括一个图片和几个string类型的普通参数。

  2. 我放到了server下面,但还是不行。

    server {
    client_max_body_size 20m;
    client_body_buffer_size 256k;
    client_body_temp_path /etc/nginx/proxy_temp;
    server_name http://www.sharemybook.store;
    listen 80;
    listen 443 ssl;
    ssl_certificate 1_www.sharemybook.store_bundle.crt;
    ssl_certificate_key 2_www.sharemybook.store.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
    proxy_pass http://www.sharemybook.store:5050;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection “Upgrade”;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $server_name;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_cache_bypass $http_upgrade;
    }
    }

      1. 我解决了,我更改了一个配置语句:我把proxy_set_header Connection “upgrade”改成了proxy_set_header Connection $http_connection.
        还是谢谢你的答复。

发表评论

电子邮件地址不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.