Не удалось разрешить хост - Не удается заставить cURL работать с php на nginx

У меня есть капля приложения Digitalocean LEMP, настроенная для размещения моего веб-сайта (приложение PHP — CodeIgniter), я использую Nexmo SMS API в своем приложении, и до сегодняшнего дня все работало хорошо. Внезапно теперь, когда я пытаюсь отправить смс, у меня появляется эта ошибка «Не удалось разрешить хост: rest.nexmo.com». Похоже, что cURL не работает, но когда я проверил, установлен ли он, он есть, и мой phpinfo также показывает это. Я перезапускал nginx, php5-fpm, пробовал разные настройки curl в своем коде, но всегда получал эту ошибку.

Когда я попытался запустить простой скрипт следующим образом:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.google.com/');
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'read_body');
curl_exec($ch);
if ($error = curl_error($ch)) {
    echo "Error: $error<br />\n";
}
function read_header($ch, $string)
{
    $length = strlen($string);
    echo "Received $length bytes<br />\n";
    return $length;
}

результат по-прежнему «Ошибка: не удалось разрешить хост: www.google.com», поэтому я думаю, что проблема в cURL, а не в коде моего приложения (я использую библиотеку NEXMO CodeIgniter).

Я перепробовал все, что пришло мне в голову, и теперь у меня заканчиваются идеи, поэтому любая помощь приветствуется. Есть ли какие-то специальные настройки/вещи, которые нужно сделать, чтобы подключить/заставить cURL работать с nginx, которых мне не хватает? Может быть, что-то в файлах nginx.conf, или мне нужно открыть какие-то порты и т. д.?


person Community    schedule 12.03.2015    source источник


Ответы (1)


Обратите внимание, что ошибка «Не удалось разрешить хост». Это указывает не на curl, а на библиотеку системного преобразователя. Curl сам по себе не выполняет поиск DNS, а вместо этого использует стандартные методы системы, обычно используя libresolv. Если вы используете утилиту трассировки системных вызовов, такую ​​как strace, вы увидите, что распознаватель затем управляется файлами /etc/nsswitch.conf, /etc/host.conf и /etc/resolv.conf. Ваша первая точка вызова должна быть там. Вы можете проверить, что это система, а не curl, используя стандартный вызов файла PHP, например:

$web_content = file_get_contents("http://www.google.com/");

Это должно вернуть тело, если оно может разрешить хост.

person ajdonnison    schedule 13.03.2015
comment
Вы также можете проверить, что разрешение имен работает непосредственно с сервера. ping www.google.com должен помочь. - person Kevin Schwerdtfeger; 13.03.2015
comment
Вы оба правы, когда я пытаюсь использовать file_get_contents, я получаю следующее: file_get_contents(): php_network_getaddresses: getaddrinfo failed: Имя или служба неизвестны, и когда я пингую google.com, результат тот же: Не удалось разрешить хост. Я подумал, что это ошибка cURL, потому что в журнале ошибок моего приложения было: [Nexmo] Ошибка Curl: не удалось разрешить хост: rest.nexmo.com, поэтому я пытался исправить только cURL. Итак, как мне это исправить? В моем etc/resolv.conf есть только это: nameserver 127.0.0.1. В файле host.conf указан порядок хостов, привязка мульти включена. А в nsswitch.conf есть еще кое-что. - person ; 13.03.2015