REST API нашего приложения обслуживается Gunicorn (не за Nginx), работающими на инстансах AWS EC2 с типичной настройкой автоматического масштабирования / балансировки нагрузки. Тайм-аут простоя балансировщика нагрузки составляет 60 секунд, а время ожидания проверки активности Gunicorn составляет 2 секунды. Мы наблюдали спорадические 504 Gateway Timeout
ответы от этой конфигурации. В соответствии с Документы Amazon, это может быть связано с тем, что время ожидания проверки активности сервера ниже, чем значение времени ожидания простоя балансировщика нагрузки:
Причина 2: зарегистрированные экземпляры закрывают соединение с Elastic Load Balancing.
Решение 2. Включите параметры проверки активности на экземплярах EC2 и установите время ожидания проверки активности больше или равное параметрам простоя балансировщика нагрузки.
В Nginx по умолчанию keepalive_timeout
составляет 75 секунд, что, по-видимому, хорошо работает с настройками ELB по умолчанию. Тем не мение, Документы Gunicorn рекомендовать keepalive
установка в диапазоне 1-5 секунд.
Имеет ли смысл увеличивать время активности Gunicorn до 75 секунд, или есть веская причина держать его ниже 5 секунд, даже если мы не используем обратный прокси-сервер перед ним?
Вы почти наверняка захотите поднять таймер поддержки активности в соответствии с рекомендацией ELB, потому что ELB повторно использует соединения. Он будет удерживать их, пока не истечет время ожидания, и если другой запрос поступит в ELB, он часто будет использовать одно из уже открытых соединений, чтобы отправить его вам.
504 Gateway Timeout
является странной ошибкой для этого условия, но похоже, что именно это возвращает ELB, когда повторное использование соединения совпадает с преждевременным закрытием серверной части.
5-секундная рекомендация может иметь смысл, если браузеры напрямую связываются с серверной частью, но это не относится к ELB, который сам по себе является правильным обратным прокси-сервером при работе в режиме HTTP.