504 Тайм-аут шлюза - два экземпляра EC2 с балансировщиком нагрузки

Это может быть невозможной проблемой. Я все пробовал. Я чувствую, что там где-то есть парень в коммутаторе, закручивая усы.

Проблема:

У меня Amazon EC2 работает приложение. Он работает без проблем, когда есть только один экземпляр и нет балансировки нагрузки.

Но в моей рабочей среде у меня есть два идентичных экземпляра, которые работают за одним балансировщиком нагрузки и при выполнении определенных задач, таких как функция, которая создает PDF файл и прикрепляет его к электронной почте, ничего не происходит вообще и при использовании инструментов Google Developer с вкладкой "Сеть" я получаю сообщение об ошибке "504 Gateway Timeout" после того, как тайм-аут (я установил его на 30 секунд).

Моя база данных является внешней, на Amazon RDS.

Я думаю... Если бы я мог заставить клиента оставаться на связи с их начальным сервером, в который они вошли, эта проблема будет решена, потому что я понимаю, что время ожидания шлюза 504 происходит, когда экземпляр-1 пытается обратитесь к экземпляру-2, чтобы выполнить задачу.

Это происходит ТОЛЬКО КОГДА, используя балансировку нагрузки, но никогда не подключаясь прямо к одному из моих двух серверов.

Настройки балансировки нагрузки:

  • У балансира нагрузки есть CRECORD на моем регистраторе, так что app.myapplication.com указывает на myloadbalancerDNSname.elb.amazonaws.com
  • Балансировщик нагрузки имеет 2 здоровых экземпляра, каждый в одном регионе, но они находятся в разных зонах доступности.
  • Балансировщик нагрузки использует те же группы безопасности, что и экземпляры (разрешить ВСЕ IP-адреса на портах 22, 80 и 443)
  • Балансировщик нагрузки включил балансировку нагрузки в поперечнике.
  • CORS (в Amazon S3) имеет возможность GET, POST, PUT, DELETE from * to * (я не знаю, как это связано с моими экземплярами, но в любом случае я сделал это в соответствии с инструкциями)
  • У балансировщика нагрузки есть настроенные слушатели:
    • Протокол балансировки нагрузки: порт балансировки нагрузки HTTP: 80 Протокол экземпляра: порт HTTP-экземпляра: 80
    • Протокол балансировки нагрузки: порт балансировки нагрузки HTTPS: 443 Протокол экземпляра: порт HTTP-экземпляра: 80 (шифр выбран правильно для моего поставщика сертификатов, а поля SSL - 100%, верно).

Еще несколько идей:

Говоря, я не тестирую HTTPS, но вместо этого обычный HTTP. Я не уверен, что SSL настроен правильно, хотя мой поставщик сертификатов сказал, что это так. Причина, по которой я подозрительна, заключается в том, что когда я пытаюсь ввести https://app.myapplication.com, я получаю сообщение об ошибке "(неудачно) net:: ERR_CONNECTION_CLOSED" в Инструменты разработчика Google, на вкладке Сеть. Но это должно быть неприменимым, потому что у меня проблема даже при использовании обычного HTTP. Я могу устранить неисправность SSL позже.

Итак, чтобы повторить, моя проблема связана с проблемой "504 Gateway Timeout" при использовании некоторых функций, но также иногда случайным образом, а не загрузкой страницы (но редко). Эта проблема 504 происходит ТОЛЬКО КОГДА, используя балансировку нагрузки, но никогда не подключаясь прямо к одному из моих двух экземпляров.

Я не знаю, на какой вопрос спросить, потому что я следил за каждым документом в T, double и triple проверял все предложения по всему Интернету и НИЧЕГО.

Ответы

Ответ 1

Какой веб-сервер вы используете? У меня была очень похожая проблема с балансировкой нагрузки nginx и AWS. я добавил keepalive_timeout 75s; в http-блок в моем файле конфигурации nginx и не вижу проблемы с тех пор.

Убедитесь, что вы перезапустили nginx после добавления и сохранения этой строки (на ubuntu sudo service nginx restart. В Redhat остановите nginx /path/to/nginx/executable -s stop, затем /path/to/nginx/executable, чтобы запустить nginx)

Это исправление было рекомендовано AWS на странице справки Устранение неисправностей балансировки нагрузки AWS

Ответ 2

Во-первых, каков тайм-аут ожидания для вашего ELB? Вы найдете его в самом низу вкладки "Описание" для балансировки нагрузки. Подробнее о тайм-ауте простоя вы можете узнать здесь в документации ELB. Значение по умолчанию - 60 секунд. Вы также должны рассмотреть возможность установки или увеличения Keep-alive на своем веб-сервере. Как вы это сделаете, это зависит от того, какой веб-сервер вы используете.

Во-вторых, если вы считаете, что это связано с переключением клиента с одного экземпляра на другой, вы должны включить липкость сеанса в ELB. Это гарантирует, что клиент всегда будет перенаправлен на тот же внутренний экземпляр с помощью балансировки нагрузки. Чтобы включить это, снова перейдите на вкладку "Описание", затем нажмите ссылку "Редактировать" рядом с каждой записью в разделе "Конфигурация порта". Вероятно, вы захотите выбрать вариант "Включить балансировку балансировки нагрузки", поскольку это скажет ELB о том, чтобы управлять всеми аспектами липкости.

Ответ 3

В моем случае выясняется, что с балансировщиком нагрузки не было проблем. Окончательное решение в конечном итоге является файлом Ubuntu hosts, в котором была необъяснимая запись для маршрутизации трафика с некоторого тайного IP-адреса на мое имя хоста приложения. Таким образом, во время создания PDF файла пути переписывались генератором PDF, чтобы указать на тайный сервер и, следовательно, проблемы с тайм-аутом шлюза. Я понятия не имею, почему это время от времени работало и не проваливалось.

127.0.0.1 localhost
127.0.1.1 ubuntu-server
42.139.126.191 app.myapp.com

Вот как это выглядело, поэтому я удалил эту третью линию, и все шестерни начали снова поворачиваться.: P

Ответ 4

Мы используем экземпляры Amazon EC2 за ELB Amazon, и мы получаем ошибки 504 GATEWAY_TIMEOUT. Мы используем Apache и PHP на веб-серверах Ubuntu.

В нашем случае ошибка возникла из-за нехватки памяти на сервере. Мы не видели "из памяти" в наших журналах ошибок Apache. В журналах доступа Apache была запись в 504 строк. Мы подтвердили "из памяти", просмотрев файл syslog (/var/log/syslog) и исправили проблему с памятью.

Это разрешило нам ошибку 504.

Ответ 5

Проверьте настройки групп безопасности. Порт 80 может быть ограничен доступом.