Сервер за балансировщиком нагрузки GCP иногда получает ошибку сервера 502, «failed_to_connect_to_backend» - PullRequest
0 голосов
/ 06 августа 2020

Наш балансировщик нагрузки GCP иногда возвращает 502 для некоторых запросов с «failed_to_connect_to_backend». Бывает периодически. При поиске в Google и переполнении стека я нашел эту ссылку: https://cloud.google.com/load-balancing/docs/https#timeouts_and_retries. Я также просмотрел несколько статей, касающихся тайм-аутов проверки активности на балансировщике нагрузки GCP.

Мои серверы в Kubernetes используют нехватку ресурсов ЦП, поэтому не похоже, что серверная часть слишком загружена.

Вот пример кода, который я использую для настройки Http Server:

    server := &http.Server{
        Addr:              addr,
        Handler:           handler,
        ReadHeaderTimeout: 20 * time.Second,
        ReadTimeout:       1 * time.Minute,
        WriteTimeout:      2 * time.Minute,
        IdleTimeout:       time.Duration(tcpKeepAliveTimeout) * time.Second,
    }
    if e := listenAndServe(server, 620); e != nil && e != http.ErrServerClosed {
     return err
    }
func listenAndServe(srv *http.Server, tcpKeepAliveTimeout int) error {
    addr := srv.Addr
    if addr == "" {
        addr = ":http"
    }
    lc := net.ListenConfig{
        KeepAlive: 620 * time.Second,
    }

    ln, err := lc.Listen(context.Background(), "tcp", addr)
    if err != nil {
        return err
    }

    defer ln.Close()

    if err != nil {
        return err
    }
    return srv.Serve(ln)
}

Я устанавливаю тайм-аут 620 секунд для TCP Keep-Alive (рекомендуется в документации Google), но это не так. t помочь, и я все еще получаю 502s. Что я делаю не так?

1 Ответ

0 голосов
/ 06 августа 2020

502 Код ответа HTTP генерируется, когда GFE не может sh установить соединение с серверным экземпляром.

Общие причины ошибок 502 следующие, и я рекомендую вам проверить их на ваша сторона:

  • Брандмауэр (либо правила брандмауэра GCP, либо программное обеспечение брандмауэра, работающее на самом экземпляре), блокирующее трафик c
  • Программное обеспечение веб-сервера не запущено на внутреннем экземпляре
  • Программное обеспечение веб-сервера неправильно настроено на внутреннем экземпляре Ресурсы сервера исчерпаны и не принимают подключения:
  • Использование ЦП слишком велико для ответа
  • Использование памяти слишком велико, процесс остановлен или не может выполнить mallo c ()
  • Максимальное количество установленных TCP-соединений
  • Максимальное количество порожденных воркеров и все заняты (подумайте о mpm_prefork в Apache)
  • Плохо написанная реализация сервера испытывает трудности под нагрузкой или без -стандартное поведение
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...