Установить Nginx Тайм-аут и по умолчанию JSON Ответ - PullRequest
1 голос
/ 27 мая 2020

У меня есть простой API-интерфейс Falcon REST для запроса POST, который принимает отформатированное тело JSON: { "Input": "input string request" } и возвращает: { "Output: "output string response" }

Может быть полезно отметить, что в производстве все запросы будут поступать от одного клиента, и эта служба должна быть способна обрабатывать 50 запросов в секунду c со средним временем отклика менее 200 мс. В идеале эти запросы должны выполняться партиями, но, к сожалению, из-за нескольких факторов это нужно делать именно так.

Я обнаружил, что Бьорн (по сравнению с Gunicorn) может обслуживать мое приложение как быстрее всего, так и обрабатывать большую часть нагрузки, прежде чем вызывать тайм-ауты. Вдобавок ко всему это работает Nginx, и мои почти стандартные конфигурации вставлены ниже.

Проблема, с которой я сталкиваюсь, заключается в том, что я вижу около 2% тайм-аута запросов (определяется с помощью инструмента командной строки Linux wrk), и я думаю, что это связано с загрузкой.

Мне интересно, могу ли я настроить Nginx, чтобы установить лимит времени для ответа клиенту (допустим, 500 мс), и если вышестоящий сервер достигает этого лимита времени до ответа, отправьте значение по умолчанию JSON ответ с пустым JSON ответ: { "Output": "" }

Возможно ли, чтобы все запросы возвращались за указанный максимальный промежуток времени?

Заранее благодарим за уделенное время! :)

/ etc / nginx / nginx .conf:

worker_processes    auto;

error_log   /app/logs/nginx_error.log    warn;
pid         /var/run/nginx.pid;

events {
    worker_connections  1024;   # max connections per worker process

    multi_accept        on;     
    use                 epoll;  # efficient connection processing method for linux
}

http {
    include         /etc/nginx/mime.types;
    default_type    application/octet-stream;

    log_format  main  '[$time_local] resp_status=$status req_time=$request_time '
                      'upstream_header_time=$upstream_header_time';
    access_log      /app/logs/nginx_access.log   main    buffer=500k    flush=5m;

    sendfile    on;
    tcp_nopush  on;
    tcp_nodelay on;

    #keepalive_timeout   65;   # how long to keep an idle connection alive
    #keepalive_requests  50;

    # proxy_connect_timeout   400ms;
    # proxy_send_timeout      400ms;
    # proxy_read_timeout      400ms;
    # send_timeout            500ms;

    #gzip    on;

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

/ etc / nginx / conf.d / app.conf

upstream app_servers {
    server 0.0.0.0:5000;
}

server {
    listen          8000;
    server_name     localhost;

    location / {
        proxy_pass      http://app_servers;

        # error_page      502  timeout_502;
        # error_page      504  timeout_502;
    }

    # location timeout_502 {
    #     #default_type    application/json;
    #     return          204  '{"Output": ""}';
    # }
}
...