nginx使用Django Rest框架返回500用于POST图像请求

时间:2019-08-03 16:30:25

标签: django nginx file-upload django-rest-framework image-uploading

前言

我已经为解决类似问题进行了大量研究,但仍未解决我遇到的这个主要问题。作为最后的选择,由于很多情况似乎是特定于应用程序的,所以我决定在此处创建一个包含我的配置的帖子,以期希望有人看到可能的解决方案。

框架

Django 2.1.7
nginx/1.14.2
djangorestframework==3.9.2

问题

在具有上述框架的服务器本地设置中,可以通过客户端应用程序(特别是react-native应用程序,可能不是重要信息)发布映像。 但是,当尝试向我的远程服务器发出具有相同图像和URL路径的相同POST请求时,它会返回以下500错误(从Google Chrome控制台调试器快照)

Snapshot of 500 nginx response

我强烈推断nginx是仅图像上传的罪魁祸首,因为远程服务器的django日志没有迹象表明它甚至已经像本地服务器一样收到了POST请求。 正常的POST请求而无需上传图片,但是在远程服务器和本地服务器上都可以正常使用。

我尝试过的东西

正如其他帖子中所发现的那样,我将client_max_body_size中的nginx.conf增加到了2000M。我还设置了以下django设置:

FILE_UPLOAD_PERMISSIONS = 0o777

FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440000

DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440000

这些提议的解决方案都没有奏效。

我的配置

nginx.conf

user                        www;
worker_processes            auto;

events { worker_connections 1024; }
daemon off;

http {
    server_tokens off;
    sendfile      on;
    include       mime.types;

    default_type  application/octet-stream;

    gzip              on;
    gzip_http_version 1.0;
    gzip_proxied      any;
    gzip_min_length   500;
    gzip_disable      "MSIE [1-6]\.";
    gzip_types        text/plain text/xml text/css
                    text/comma-separated-values
                    text/javascript
                    application/x-javascript
                    application/atom+xml;

    # List of application servers
    upstream app_server {
        server 127.0.0.1:9090;
    }

    # PRODUCTION (also default)
    server {
        # Using an alias, not the actual server name
        server_name my-remote-server.com;

        # Running port
        listen 8080 default_server;
        client_max_body_size 100M;
        keepalive_timeout    15;

        # Principle difference between production
        if ($http_x_forwarded_proto = "http") {
            return 301 https://$host$request_uri;
        }

        # Don't serve .py files
        location ~ (\.py$|\.pyc$) {
            return 403;
        }

        # Static assets served directly
        location /static/ {
            alias           /var/app/myserver/src/site/static/;
            access_log      off;
            log_not_found   off;
        }

        location /media/ {
            alias           /var/app/myserver/src/myserver/media/;
            access_log      off;
            log_not_found   off;
        }

        # Proxying the connections
        location / {
            proxy_pass              http://app_server;
            proxy_redirect          off;
            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;
        }
    }
}

大问题

  1. nginx为什么会返回500错误?
  2. 是否可以从nginx获取更详细的错误消息,以了解为什么返回500错误?
  3. 我的配置/设置是以我应该期望上传图像的方式进行设置的,还是可以进行改进或缺失来解决此问题?

任何想法或反馈将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

经过大量的研究和尝试/错误尝试,我找到了适合自己情况的解决方案。

System.out.println对象的nginx.conf中,设置以下属性:

http

根据nginx文档// nginx.conf ... http { ... client_max_body_size 50M; // this can be whatever max size you want client_body_temp_path /tmp/client_body_temp; ... } ... (参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_temp_path)。请求变大后(即通过上传图片),nginx服务器在处理整个请求时需要缓冲的位置。显然,我的服务器没有默认临时路径client_body_temp_path defines a directory for storing temporary files holding client request bodies的权限,,因此我手动创建了一个具有client_body_temp权限的路径/tmp/client_body_temp的文件夹,服务器最终以HTTP响应200。({chmod 744的附加好处是经过一定时间后会自动清理自身)。

注意:更改/tmp文件后,您将需要运行nginx.conf来刷新具有新配置的服务器(事先使用nginx -s reload来检查其格式是否正确)。

绝对希望这能对人们有所帮助,这对我来说是一个巨大的安慰!