У меня есть приложение, работающее за nginx, за AWS ELB.Сервер запускает около 30 экземпляров приложения.
Часть приложения обрабатывает загруженные файлы изображений, отправленные через HTTP POST, в запросах типа multipart / form-data.
Работает, но при пиковой загрузкезадержка увеличивается примерно до 120 секунд (измеряется балансировщиком нагрузки ELB).Загрузка обычно занимает от 2 до 7 секунд, и при обычной загрузке время отклика конечного пользователя примерно одинаково.
При запуске нескольких экземпляров приложения серверу не хватает памяти, поэтому на этом этаперешение состоит в том, чтобы запускать дополнительные экземпляры EC2 только во время пиковой нагрузки.
Однако время обработки заявки по запросу составляет около 0,2 секунды, даже во время пиковой нагрузки.Может показаться, что Nginx в качестве обратного прокси-сервера должен иметь возможность кэшировать запросы приложений и перенаправлять их работнику приложений только после получения всей полезной нагрузки.Но кажется, что nginx обрабатывает или, возможно, получает только один запрос от ELB на одного работника приложения.
Есть ли способ приблизить время ответа конечного пользователя к фактическому времени запроса, показанному ниже:
197.229.3.57 - [24/Jan/2019:11:13:51 +0000] "POST /v1/schools/69a787fc-3fde-46b1-a258-f0a1954c9abe/children/cf14ac79-9e33-434c-b5e2-8cf51d856e6f/mediamessages HTTP/1.1" RC=202 Sz=388787/388160/574 "-" Times=0.254/0.254/6.252 "client 1.1.35" zip="-" "127.0.0.1:7087"
197.229.3.68 - [24/Jan/2019:11:14:15 +0000] "POST /v1/schools/69a787fc-3fde-46b1-a258-f0a1954c9abe/children/16ced012-1c7d-41f2-969a-21ad28c80361/mediamessages HTTP/1.1" RC=202 Sz=316182/315555/574 "-" Times=0.235/0.235/3.435 "client 1.1.35" zip="-" "127.0.0.1:5085"
197.229.3.68 - [24/Jan/2019:11:14:26 +0000] "POST /v1/schools/69a787fc-3fde-46b1-a258-f0a1954c9abe/children/df5b4919-b3a9-495a-95b7-40c4b9abf523/mediamessages HTTP/1.1" RC=202 Sz=335840/335213/574 "-" Times=0.241/0.241/2.241 "client 1.1.35" zip="-" "127.0.0.1:7086"
197.229.3.68 - [24/Jan/2019:11:14:41 +0000] "POST /v1/schools/69a787fc-3fde-46b1-a258-f0a1954c9abe/children/16666420-34b3-4582-95dc-001972eb6b43/mediamessages HTTP/1.1" RC=202 Sz=229735/229108/574 "-" Times=0.216/0.216/3.956 "client 1.1.35" zip="-" "127.0.0.1:5086"
В журнале значения для Times = aaaaa / bbbb / cccc Где:
- aaaa - это upstream_header_time
- bbbb - это upstream_response_time
- cccc - это request_time
Соответствующие части файла nginx.conf:
worker_processes 1;
#errors_log logs/error.log notice;
events {
worker_connections 1024;
}
http {
server_tokens off;
log_format echo_log_format '$http_x_forwarded_for - [$time_local] '
'"$request" RC=$status Sz=$request_length/$http_content_length/$body_bytes_sent "$http_referer" '
'Times=$upstream_header_time/$upstream_response_time/$request_time '
'"$http_user_agent" zip="$gzip_ratio" "$upstream_addr"' ;
sendfile on;
client_body_temp_path /spool/nginx/client_temp 1 2;
#client_body_in_file_only on;
client_body_in_file_only clean;
real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;
keepalive_timeout 10m;
client_body_timeout 20m;
client_header_timeout 10m;
send_timeout 10m;
proxy_read_timeout 600;
client_max_body_size 300M;
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 500;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/xml text/css
text/comma-separated-values
text/javascript
application/x-javascript
application/atom+xml;
# Expires map
map $sent_http_content_type $expires {
default max;
text/html epoch;
text/css max;
application/javascript max;
~image/ max;
}
map $status $invalid {
~^400 1;
default 0;
}
map $request $logpostdata {
~devices 1;
default 0;
}
map $request $multimedia {
~multimedia 1;
default 0;
}
# ELB HEALTH CHECK
server {
# Running port
listen 80;
location /ping {
access_log off;
return 200 "pong";
add_header Content-Type text/plain;
}
}
upstream prod_api_workers {
server 127.0.0.1:5081;
server 127.0.0.1:5082;
server 127.0.0.1:5083;
server 127.0.0.1:5084;
server 127.0.0.1:5085;
server 127.0.0.1:5086;
server 127.0.0.1:5087;
server 127.0.0.1:5088;
server 127.0.0.1:5089;
# NOTE port 6081 is in use by nginx
server 127.0.0.1:6082;
server 127.0.0.1:6083;
server 127.0.0.1:6084;
server 127.0.0.1:6085;
server 127.0.0.1:6086;
server 127.0.0.1:6087;
server 127.0.0.1:6088;
server 127.0.0.1:6089;
server 127.0.0.1:7081;
server 127.0.0.1:7082;
server 127.0.0.1:7083;
server 127.0.0.1:7084;
server 127.0.0.1:7085;
server 127.0.0.1:7086;
server 127.0.0.1:7087;
server 127.0.0.1:7088;
server 127.0.0.1:7089;
}
# RESERVE PROXY FOR PROD (test)
server {
access_log /var/log/nginx/testapi_access.log echo_log_format;
error_log /var/log/nginx/testapi_error.log;
listen 6081;
server_name _;
client_max_body_size 0;
location / {
#proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://prod_api_workers;
}
}
}