AWS EC2, Apache, PHP: php_network_getaddresses: не удалось получить addrinfo

Вопрос или проблема

Работая с PHP 5.6 на экземпляре EC2 с Apache 2.4.18, я время от времени вижу ошибки в журнале при попытке подключения к базе данных RDS:

PDO::__construct(): php_network_getaddresses: getaddrinfo failed: No address associated with hostname

Проблема, похоже, специфична для php_network_getaddresses внутри Apache. Все, что вне Apache, может разрешить хост без проблем, и тестовый PHP-скрипт, работающий внутри Apache и использующий gethostbyname, также успешно выполняет DNS-запрос.

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

Я видел, что другие пользователи задавали тот же вопрос, как на SF, так и на форумах AWS и в других местах, но “решение”, похоже, состоит в том, чтобы время от времени перезапускать Apache. Однако я нахожу это очень неудовлетворительным, поэтому мне интересно, есть ли лучшие, каноничные решения для этого?

Согласно AWS, AWS устанавливает лимит скорости на DNS-запросы, чтобы защититься от эффектов “шумного соседа”. Таким образом, они могут обеспечить стабильную производительность до этого предела, в отличие от отсутствия лимита с риском нестабильной производительности.

Настройка локального DNS-кэша на экземпляре или использование внешнего DNS-сервера, такого как Google Public DNS, решает проблему. В вашем случае вы можете добавить следующие строки в файл /etc/resolv.conf в качестве временного решения: nameserver 8.8.8.8 и nameserver 8.8.4.4

Ответ или решение

Решение проблемы "php_network_getaddresses: getaddrinfo failed" на AWS EC2 с использованием Apache и PHP

Введение

При развертывании веб-приложения на базе AWS EC2, Apache и PHP, могут возникнуть проблемы с разрешением DNS-имен. Одна из наиболее распространенных проблем — получение ошибки php_network_getaddresses: getaddrinfo failed: No address associated with hostname, когда PHP пытается установить соединение с базой данных RDS. В данной статье мы рассмотрим причины появления этой ошибки и предложим возможные решения.

Причины проблемы

  1. Ограничение на запросы DNS в AWS: AWS применяет ограничения на количество DNS-запросов, приходящих с одного экземпляра, чтобы избежать негативного влияния «соседей по облаку» на производительность. Это означает, что если вы делаете слишком много запросов за короткий промежуток времени, ваш экземпляр может временно блокировать DNS-запросы.

  2. Кэширование DNS внутри Apache: В Apache и PHP могут существовать проблемы с кэшированием DNS, которые могут вызывать временные сбои в разрешении имен. Вам может показаться, что внешние скрипты или утилиты разрешают имена без проблем, но это может не относиться к среде, исполняемой через Apache.

  3. Проблемы с конфигурацией сети: Неправильная настройка сетевых параметров или ошибок в файлах конфигурации может создавать дополнительные сложности при выполнении DNS-запросов.

Решения

  1. Использование внешнего DNS-сервера: Добавление публичных DNS-серверов, таких как Google Public DNS (8.8.8.8 и 8.8.4.4), может помочь избежать ограничений AWS. Для этого необходимо отредактировать файл /etc/resolv.conf и добавить в него следующие строки:

    nameserver 8.8.8.8
    nameserver 8.8.4.4
  2. Настройка кэширования DNS на стороне экземпляра: Развертывание DNS-кэша на вашем EC2-инстансе также может существенно снизить нагрузку на DNS и устранить возникающие ошибки. Это можно сделать, установив DNS-кэш, такой как dnsmasq.

  3. Мониторинг и управление RDS: Если вы подозреваете, что проблема связана с окном обслуживания Amazon RDS, рассмотрите возможность планирования задач, зависящих от базы данных, вне этого окна. Это может помочь минимизировать количество ошибок, связанных с временной недоступностью базы данных.

  4. Перезагрузка Apache как временное решение: Хотя это и не является идеальным решением, периодическая перезагрузка Apache может временно устранить проблемы с кэшированием DNS. Однако, это должно рассматриваться лишь как временная мера.

  5. Обновление программного обеспечения: Рассмотрите возможность обновления версии PHP до более новой, так как более свежие версии могут иметь улучшенную обработку сетевых запросов и лучшее управление кэшированием.

  6. Логи и отладка: Включите расширенное логирование ошибок для Apache и PHP, чтобы лучше понять, когда и почему возникают проблемы. Это поможет вам проанализировать ситуации, когда сбои происходили, и выявить закономерности.

Заключение

Проблема с ошибкой php_network_getaddresses: getaddrinfo failed на AWS EC2 может возникать по целому ряду причин. Однако с помощью правильной диагностики и настройки — использование внешнего DNS-сервера, кэширования DNS и мониторинга RDS — можно минимизировать исчезновения подключения к базе данных. Важно постоянно следить за логами и производительностью вашего приложения. Помните, что стабильность системы зависит от правильного управления ресурсами, и советы, приведенные в этой статье, помогут вам создать надежную инфраструктуру для вашего веб-приложения.

Оцените материал
Добавить комментарий

Капча загружается...