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 может быть ограничен доступом.