Interfejs API REST naszej aplikacji jest obsługiwany przez Gunicorn ( nie za Nginx) działający na instancjach AWS EC2 z typową konfiguracją automatycznego skalowania / równoważenia obciążenia. Limit czasu bezczynności modułu równoważenia obciążenia wynosi 60 sekund, a limit czasu utrzymania Gunicorn - 2 sekundy. Sporadycznie 504 Gateway Timeout
reagowaliśmy na tę konfigurację. Według dokumentów Amazon może to być spowodowane tym, że limit czasu podtrzymania serwera jest krótszy niż limit czasu bezczynności modułu równoważenia obciążenia:
Przyczyna 2: Zarejestrowane instancje zamykają połączenie z elastycznym równoważeniem obciążenia.
Rozwiązanie 2: Włącz ustawienia utrzymywania aktywności w instancjach EC2 i ustaw limit czasu podtrzymania na wartość większą lub równą ustawieniom limitu czasu bezczynności modułu równoważenia obciążenia.
W Nginx domyślnie keepalive_timeout
jest 75 sekund, co najwyraźniej działa dobrze z domyślnymi ustawieniami ELB. Jednak doktorzy Gunicorn zalecają keepalive
ustawienie w zakresie 1-5 sekund.
Czy sensowne jest podbicie podtrzymywalności Gunicorna do 75 sekund, czy też jest dobry powód, aby utrzymywać go poniżej 5 sekund, mimo że nie używamy odwrotnego proxy przed nim?
źródło