2015-02-25 3 views
3

У меня проблема с моей колбой + uwsgi + Nginx приложения, просто я не могу скачать файл больше, то ~ 1GiB (размер differend каждый раз на несколько байт)колбы + Nginx + uwsgi_response_sendfile_do() TIMEOUT

  • у меня есть много свободной оперативной памяти на сервере
  • у меня есть много свободного места на жестком диске на сервере
  • Я тестировал его в 3-х различных клиентов, поэтому его не проблема клиента
  • я могу загрузить большие файлы при использовании статических псевдонимов в nginx (см./cache & &/хранилище в Nginx app.conf)
  • Файлы под 1 GiB работает отлично
  • Я использую flask.send_file функцию для отправки файлов (см app.py)

Только ошибки я мог бы найти является:

/var/log/uwsgi/app/updates.example.com.log

Wed Feb 25 15:48:31 2015 - uwsgi_response_sendfile_do() TIMEOUT !!! 
IOError: write error 
[pid: 22385|app: 0|req: 1/1] 94.113.167.6() {42 vars in 961 bytes} [Wed Feb 25 16:19:22 2015] GET /download/file/63ac9e2a5952c1fbdccb143eec8769b6 => generated 0 bytes in 5606 msecs via sendfile() (HTTP/1.1 200) 6 headers in 261 bytes (3582 switches on core 0) 

Все остальное вроде бы нормально

Куда уловить? Мне не хватает конфигурации chache/timeout ???

Thx за любую помощь

Nginx app.conf:

server { 
    listen 80; 
    server_name updates.example.com; 
    root /home/user/updates.example.com; 
    access_log /home/user/updates.example.com/logs/access.log; 
    error_log /home/user/updates.example.com/logs/error.log; 

    location /doc { 
      index index.htm index.html; 
      alias /home/user/updates.example.com/site; 
    } 

    #Testing static download dirs 
    location /cache 
    { 
      alias /home/user/updates.example.com/cache; 
    } 

    location /repository 
    { 
      alias /home/user/updates.example.com/repository; 
    } 

    location/{ 
      uwsgi_pass unix:///home/user/updates.example.com/server.sock; 
      include uwsgi_params; 
    } 
} 

nginx.conf:

user www-data; 
worker_processes 4; 
pid /run/nginx.pid; 

events { 
    worker_connections 768; 
    # multi_accept on; 
} 

http { 

    ## 
    # Basic Settings 
    ## 
    sendfile on; 
    tcp_nopush on; 
    tcp_nodelay on; 
    keepalive_timeout 65; 
    types_hash_max_size 2048; 
    # server_tokens off; 

    # server_names_hash_bucket_size 64; 
    # server_name_in_redirect off; 

    include /etc/nginx/mime.types; 
    default_type application/octet-stream; 

    ## 
    # SSL Settings 
    ## 

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE 
    ssl_prefer_server_ciphers on; 

    ## 
    # Logging Settings 
    ## 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log; 

    ## 
    # Gzip Settings 
    ## 

    gzip on; 
    gzip_disable "msie6"; 

    # gzip_vary on; 
    # gzip_proxied any; 
    # gzip_comp_level 6; 
    # gzip_buffers 16 8k; 
    # gzip_http_version 1.1; 
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; 

    ## 
    # Virtual Host Configs 
    ## 

    include /etc/nginx/conf.d/*.conf; 
    include /etc/nginx/sites-enabled/*; 
} 

app.py (упрощенный, например)

from flask import Flask, jsonify, request, url_for, send_file, redirect 

import os 

app = Flask(__name__) 

@app.route('/download/<string:sum>') 
def download(sum): 
    download_path = os.path.join(app.config['CACHE_DIR'], sum) 

    if os.path.isfile(download_path): 
    #everything seems to be ok 
    #!FIXME this cannot be used, download crashes when file reaches 1Gib> using direct path in client now and special config in nginx 
    return send_file(download_path, attachment_filename=sum) 


    return jsonify({ 'message': 'Task failed'}), 500 

if __name__ == '__main__': 
    app.run() 

uwsgi app.ini

[uwsgi] 
uid = user 
logto = /home/user/updates.example.com/logs/uwsgi.log 
master = true 
chdir = /home/user/updates.example.com/ 
socket = server.sock 
module = app 
callable = app 
plugins = python 

#Fix for DB connection coruption 
lazy = true 
lazy-apps = true 
+0

Это может быть следующим: http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_max_temp_file_size – Selcuk

+0

@Selcuk И вы выигрываете первую цену «** Спасибо **» за первый правильный ответ! Это он, спасибо еще раз :) – Salamek

ответ

1

Вы должны установить настройку uwsgi_max_temp_file_size согласно documentation:

Когда буферизация ответов от сервера uwsgi включена, и весь ответ не вписываются в буферы, установленные директивами uwsgi_buffer_size и uwsgi_buffers, часть ответа может быть сохранена во временном файле. Эта директива устанавливает максимальный размер временного файла. Размер данных, записанных во временный файл за раз, задается директивой uwsgi_temp_file_write_size.

Значение по умолчанию для этого параметра - 1024 МБ.

Смежные вопросы