Есть ли способ сохранить живой запрос дольше 60 секунд в экземпляре EC2?

Всем привет Я пытался запустить наше приложение django на amazon aws ec2 instance. Все работает хорошо, за исключением запросов длиннее 60s. Эти запросы автоматически получают 504 Gateway Time-out. Я настроил все необходимые порты в Security Groups для моего экземпляра EC2. Мы используем nginx, и мой nginx.conf выглядит следующим образом:


user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  3600s;

    client_max_body_size 500M;
    client_body_timeout 86400s;
    client_header_timeout 86400s;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    proxy_connect_timeout 86400s;
    proxy_send_timeout 86400s;
    proxy_read_timeout 86400s;
    send_timeout 86400s;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Я пытался играть с keepalive_timeout, как советуют многие сообщения, но это не работает. Есть также много сообщений, упоминающих конфигурацию балансировщика нагрузки, но я даже не использую балансировщик нагрузки, так что это не должно быть связано с ним.

Как мне управлять моим экземпляром для обработки запросов длиннее 60 секунд?

Я бы предложил сначала привести в порядок ваш конфиг; вы устанавливаете некоторые значения, не понимая, для чего они на самом деле нужны, затем включаете еще один файл конфига, затем устанавливаете еще несколько, а затем включаете еще один конфиг.

Измените его так, чтобы вы делали свои включения и then override со значениями, которые вы хотите.

Я аннотировал различные настройки, чтобы вы могли видеть, для чего они нужны; эти настройки часто копируются в надежде, что они сработают. Единственное, что реально должно быть похоже на 86400s (24 часа!), это proxy_read_timeout:

Я подозреваю, что происходит то, что один из файлов conf в /etc/nginx/conf.d/*.conf имеет настройку 60s (или 1m) для proxy_read_timeout, и хотя вы задали гораздо большее значение, вы снова вызываете include, который перезаписывает вашу настройку.

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

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

    client_max_body_size 500M;    # Don't allow uploads larger than 500MB

    client_body_timeout 86400s;   # Defines a timeout for reading client
                                  # request body. The timeout is set only
                                  # for a period between two successive read
                                  # operations, not for the transmission of
                                  # the whole request body
    
    client_header_timeout 86400s; # Defines a timeout for reading client
                                  # request header; ie. the client's initial
                                  # HEAD, GET or POST

    proxy_connect_timeout 86400s; # Time to *open* a connection to the proxy
                                  # before we give up

    proxy_send_timeout 86400s;    # Timeout for transmitting a request *to*
                                  # the proxied server

    proxy_read_timeout 86400s;    # Timeout for reading a response from the
                                  # proxied server - did it send back 
                                  # anything before this has expired

    send_timeout 86400s;          # Timeout for sending a response to the
                                  # requesting client - note this isn't 
                                  # proxy_send_timeout, but the time between 
                                  # two successive write operations to the 
                                  # requesting client (ie. browser)
}
Вернуться на верх