Есть ли способ сохранить живой запрос дольше 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)
}