Время ожидания запроса в nginx

Я получаю 499 на стороне сервера моего приложения (на nginx) и 504 на стороне клиента. Время ожидания по умолчанию для клиентской стороны составляет 5000 секунд, а ответ, который я получаю, ровно через 60 секунд.

Ниже nginx.conf для моего приложения.

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

events {
        worker_connections 768;
        # multi_accept on;
}

http {
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        underscores_in_headers on;
        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;
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
    }

gunicorn config является:

bind = '127.0.0.1:8001'
backlog = 2048
workers = 8
worker_class = 'sync'
worker_connections = 1000
timeout = 300
keepalive = 2
spew = False
daemon = False
pidfile = None
umask = 0
user = None
group = None
tmp_upload_dir = None
errorlog = 'gunicorn_error.log'
loglevel = 'info'
accesslog = 'gunicorn_access.log'
proc_name = None
def post_fork(server, worker):
    server.log.info("Worker spawned (pid: %s)", worker.pid)

def pre_fork(server, worker):
    pass

def pre_exec(server):
    server.log.info("Forked child, re-executing.")

def when_ready(server):
    server.log.info("Server is ready. Spawning workers")

def worker_int(worker):
    worker.log.info("worker received INT or QUIT signal")

    ## get traceback info
    import threading, sys, traceback
    id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
    code = []
    for threadId, stack in sys._current_frames().items():
        code.append("\n# Thread: %s(%d)" % (id2name.get(threadId,""),
            threadId))
        for filename, lineno, name, line in traceback.extract_stack(stack):
            code.append('File: "%s", line %d, in %s' % (filename,
                lineno, name))
            if line:
                code.append("  %s" % (line.strip()))
    worker.log.debug("\n".join(code))

def worker_abort(worker):
    worker.log.info("worker received SIGABRT signal")

Может кто-нибудь сказать мне точно, почему это происходит? Также, как я могу исправить это.

1 ответ

У меня была та же проблема с долго выполняющейся командой. Я исправляю это с помощью аналогичного конфига для корневой конечной точки в конфиге nginx:

location / { 
    proxy_pass http://127.0.0.1:8001; 
    ...
    proxy_connect_timeout 5000s; 
    proxy_read_timeout 5000s; 
}

Обрати внимание на proxy_connect_timeout а также proxy_read_timeout,

Также может быть полезно вернуть пользователю быстрый ответ, такой как "Обработка..." или "Загрузка...", и запустить основную задачу в фоновом режиме.

Другие вопросы по тегам