Django-Filebrowser(Mezzanine)无法在nginx生产服务器上加载大型Amazon S3目录

时间:2014-11-24 22:08:43

标签: python django nginx amazon-s3 mezzanine

我在使用Django-Filebrowser时遇到了一些问题,而且从我可以看出它们似乎与Nginx有关。我遇到的主要问题是Django-Filebrowser无法在夹层管理员中加载包含大量Amazon S3文件的目录。我在S3上托管了400多个大型音频文件(每个几百MB)的多个目录,当我尝试加载夹层管理/媒体库时,我的服务器返回一个nginx 500(坏网关)错误。在目录开始变大之前,我没有遇到任何问题。

可能值得一提的是:

  1. 此项目建立在使用修改后的django-filebrowser软件包的Mezzanine CMS上
  2. 我只使用Amazon S3为项目提供媒体文件,所有静态文件都通过nginx在本地提供。
  3. 所有django-filebrowser功能在实际加载的目录中都能正常工作。
  4. 我创建了一个包含1000个小文件的测试目录,正确加载了django-filebrowser。
  5. 在下面列出的nginx.conf设置中(代理缓冲区大小,proxy_connect_timeout等),我已多次测试多个值,并且我永远无法让页面始终加载。
  6. 我已经尝试在我的nginx配置中为" admin / media-library /"添加一个额外的位置增加了超时,以及我尝试过的其他设置......但是nginx仍然没有正确加载这些大目录。
  7. 我认为我的主要问题是,大型S3目录未在admin中加载,是一个nginx问题,因为我在没有nginx的本地环境中加载这些目录没有问题。我的nginx错误日志会引发以下错误:

    2014/11/24 15:53:25 [error] 30816#0: *1 upstream prematurely closed connection while reading response header from upstream, client: xx.xxx.xxx.xxx, server: server, request: "GET /admin/media-library/browse/ HTTP/1.1", upstream: "http://127.0.0.1:8001/admin/media-library/browse/", host: "server name, referrer: "https://example/admin/"
    

    我已经研究过这个错误,导致我将这些行添加到我的nginx配置文件中。

    proxy_buffer_size       128k;
    proxy_buffers 100       128k;
    proxy_busy_buffers_size 256k;
    proxy_connect_timeout   75s;
    proxy_read_timeout      75s;
    client_max_body_size    9999M;
    keepalive_timeout       60s;
    

    尽管尝试了多个nginx超时配置,但我仍然完全停留在我开始的地方。我的生产服务器不会通过django-filebrowser从Amazon S3加载大型目录。

    以下是相关设置/配置文件中的其他一些行。

    Settings.py

    DEFAULT_FILE_STORAGE = 's3utils.S3MediaStorage'
    AWS_S3_SECURE_URLS = True     # use http instead of https
    AWS_QUERYSTRING_AUTH = False     # don't add complex authentication-related query parameters for requests
    AWS_PRELOAD_METADATA = True
    AWS_S3_ACCESS_KEY_ID = 'key'     # enter your access key id
    AWS_S3_SECRET_ACCESS_KEY = 'secret key' # enter your secret access key
    AWS_STORAGE_BUCKET_NAME = 'bucket'
    AWS_S3_CUSTOM_DOMAIN = 's3.amazonaws.com/bucket'
    S3_URL = 'https://s3.amazonaws.com/bucket/'
    MEDIA_URL = S3_URL + 'media/'
    MEDIA_ROOT = 'media/uploads/'
    FILEBROWSER_DIRECTORY = 'uploads'
    

    /etc/nginx/sites-enabled/production.conf

        upstream name {
            server 127.0.0.1:8001;
        }
    
        server {
            listen 80;
            server_name www.example.com;
            rewrite ^(.*) http://example.com$1 permanent;
        }
    
        server {
    
            listen 80;
             listen 443 default ssl;
            server_name example.com;
            client_max_body_size 999M;
            keepalive_timeout    60;
    
            ssl on;
            ssl_certificate      /etc/nginx/ssl/cert.crt;
            ssl_certificate_key  /etc/nginx/ssl/key.key;
            ssl_session_cache    shared:SSL:10m;
            ssl_session_timeout  10m;
            ssl_ciphers RC4:HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers on;
    
            location / {
                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-Protocol    $scheme;
                proxy_pass          http://example;
                add_header          X-Frame-Options         "SAMEORIGIN";
                proxy_buffer_size       128k;
                proxy_buffers 100       128k;
                proxy_busy_buffers_size 256k;
                proxy_connect_timeout   75s;
                proxy_read_timeout      75s;
                client_max_body_size    9999M;
                keepalive_timeout       60s;
            }
    
            location /static/ {
                root            /path/to/static
            }
    
            location /robots.txt {
                root            /path/to/robots;
                access_log      off;
                log_not_found   off;
            }
    
            location /favicon.ico {
                root            /path/to/favicon;
                access_log      off;
                log_not_found   off;
        }
    
    }
    

    这甚至是一个nginx问题吗?如果是这样,有没有人有任何解决此错误的建议?如果没有,我错过了哪些会导致仅在这些大型目录上超时?

    有没有比我目前的设置更好的方法来解决这个问题?

    非常感谢任何帮助。

    由于

0 个答案:

没有答案