Nginx обратный прокси и латентность - PullRequest
0 голосов
/ 24 января 2019

У меня есть приложение, работающее за 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;
        }
    }


}

1 Ответ

0 голосов
/ 18 мая 2019

Есть ли причина, по которой вы используете реверс прокси?Насколько я вижу, единственный способ сократить время между cccc и bbbb - это вывести прокси как можно больше.Это может быть сделано, в зависимости от того, как вы обслуживаете ваши файлы, конечно.nginx обслуживает файлы напрямую, только с использованием кеширования, довольно хорошо в наши дни.Я хотел бы проверить, если вы можете сделать прокси в VLAN на AWS.Но если вы не можете обслуживать напрямую из AWS, возможно, вместо этого перейдите на использование haproxy.

...