Python中django + nginx + uwsgi上传图片超过10k出现500 Internal Server Error错误如何解决?

django +nginx +uwsgi 上传 图片超过 10k 就出现 500 Internal Server Error nginx/1.10.2 错误? 在本机环境上没有问题。一上服务器就出现这问题?

是 nginx 哪里需要设置?
Python中django + nginx + uwsgi上传图片超过10k出现500 Internal Server Error错误如何解决?

27 回复

看 nginx 的 error_log


这个问题通常是因为Nginx的默认client_max_body_size配置太小导致的。默认值是1MB,但你的10KB限制更严格,可能是其他地方设置了更小的值。

解决方案:

  1. 首先检查Nginx配置: 在Nginx的配置文件中(通常是/etc/nginx/nginx.conf或站点配置文件),添加或修改以下配置:

    http {
        # 设置全局最大请求体大小
        client_max_body_size 20M;
        
        server {
            # 或者针对特定server设置
            client_max_body_size 20M;
            
            location / {
                # 或者针对特定location设置
                client_max_body_size 20M;
            }
        }
    }
    
  2. 检查uWSGI配置: 在uWSGI配置中(uwsgi.ini或命令行参数),确保设置了足够大的buffer:

    [uwsgi]
    buffer-size = 65535
    post-buffering = 8192
    
  3. Django设置检查: 确保Django的settings.py中文件上传设置合理:

    # settings.py
    DATA_UPLOAD_MAX_MEMORY_SIZE = 10485760  # 10MB
    FILE_UPLOAD_MAX_MEMORY_SIZE = 10485760  # 10MB
    

排查步骤:

  1. 先检查Nginx错误日志:/var/log/nginx/error.log
  2. 检查uWSGI日志,看是否有相关错误信息
  3. 临时将Nginx配置中的client_max_body_size设大一些测试

修改配置后记得重启服务:

sudo nginx -t  # 测试配置
sudo systemctl restart nginx
sudo systemctl restart uwsgi

一句话总结:主要检查Nginx的client_max_body_size配置是否足够大。

proxy_temp 目录权限是不是有问题?

直接用 python manager.py runserver 运行是否有这样的问题?
如果没有,在上 nginx 代理,看看有没有出现问题?
如果没有,那就是 uwsgi 的问题了。
LZ 可以试试看把 uwsgi 的线程数增加到 8 看看情况怎么样。



有这个错误:

2017/08/20 19:20:16 [crit] 1323#0: *11 open() “/var/lib/nginx/tmp/client_body/0000000002” failed (13: Permission denied), client: 112.227.240.138, server: aaabbb.com, request: “POST /user/user_change/sdut/ HTTP/1.1”, host: “aaabbb.com”, referrer: "http://aaabbb.com/user/user_change/sdut/"
2017/08/20 19:24:40 [crit] 1323#0: *33 open() “/var/lib/nginx/tmp/client_body/0000000003” failed (13: Permission denied), client: 112.227.240.138, server: aaabbb.com, request: “POST /user/user_change/admin/ HTTP/1.1”, host: “www.aaabbb.com”, referrer: "http://www.aaabbb.com/user/user_change/admin/"
2017/08/20 19:27:54 [crit] 1323#0: *47 open() “/var/lib/nginx/tmp/client_body/0000000004” failed (13: Permission denied), client: 112.227.240.138, server: aaabbb.com, request: “POST /user/user_change/admin/ HTTP/1.1”, host: “www.aaabbb.com”, referrer: "http://www.aaabbb.com/user/user_change/admin/"
2017/08/20 19:28:03 [crit] 1323#0: *48 open() “/var/lib/nginx/tmp/client_body/0000000005” failed (13: Permission denied), client: 112.227.240.138, server: aaabbb.com, request: “POST /user/user_change/admin/ HTTP/1.1”, host: “www.aaabbb.com”, referrer: "http://www.aaabbb.com/user/user_change/admin/"

我在 /var/lib/nginx/tmp/执行:
chmod -vR 777 client_body

好像不管用。还是出这提示



你好。
proxy_temp 这个目录在哪里? 是不是 /var/lib/nginx/tmp



nginx 代理 这个怎么看?新手不太明白。不好意思


我在 vps 上操作的。用 putty

# maximum number of worker processes
processes = 8
这样改了还是老样子

你的修改 /var/lib/nginx/tmp 权限。

最简单办法是配置文件里指定 user root

检查一下 tmp 目录磁盘是不是满了



在 /var/lib/nginx/: 下
chmod -R 777 tmp
这样吗?


nginx.conf 的配置里

还是 uwsgi.ini 里?


刚重装的云服务器.里面就几个文件.

这个目录存在不存在? /var/lib/nginx/tmp/client_body/

当然是 nginx.conf 了
要么把 nginx 的用户设置成 root,要么把那个目录的 owner 设置成 nginx 的用户

nginx 的配置里要配置缓冲区大小


存在的
这是 /var/lib/nginx/tmp/下面的文件
client_body fastcgi proxy scgi uwsgi

所以最简单的就是设置下 nginx 启动的用户
要么是改下 nginx 配置里的 proxy_buffers,官方文档里都有的
只不过改 proxy_temp_file_write_size 和 proxy_max_temp_file_size 没有直接改用户来得方便,而且说不定你设了个值后面又超了


谢谢.
那就在 nginx.conf 里设置  user root; 这样设置算了

做好别给 nginx 这么高的权限 你想的是方便 如果你的应用有漏洞 被别人黑进了你的应用 那么不用提权就是 root 了 别人怕是要笑死了 岂不美滋滋 新手不要养成这样的习惯 要注意安全问题

user root 之后,
以后再想改回来又会遇到一堆权限问题 !O!
日志轮转可能突然权限不够了

Permission deny 就是目录没有写入权限咯

每次遇到权限问题就一帮人 chmod 777 摊手


我的应用基本不用上传图片,就一个头像需要.大于 10K 就提示上面的那些权限错误.
小于 10K 就没事.
如果在 nginx.conf 用 
user nginxuser
需要给 /var/lib/nginx/tmp/client_body/ 它设上可读写等权限? 还是要怎么做?

是的,这是个问题
所以现在最好解决
在 nginx.conf 用 
user nginxuser
时 /var/lib/nginx/tmp/client_body/  权限不够的问题.

都看一下吧:

<br>/var/<br>/var/lib/<br>/var/lib/nginx/<br>/var/lib/nginx/tmp/ ---- 以上目录 nginxuser 可读访问<br>/var/lib/nginx/tmp/client_body/ ---- nginxuser 可写<br>

谢谢,按照此方法修改权限成功了

回到顶部