PHP Curl не удается подключиться к хосту на собственном сервере

#php #apache #curl #apache2

#php #apache #curl #apache2

Вопрос:

У меня есть PHP-скрипт, который использует cURL для доступа к файлу, также расположенному на моем сервере (установлена программа email-маркетинга). Я написал быстрый скрипт для тестирования моей установки cURL, и он завершается с ошибкой при указании на файл на моем собственном сервере. Скрипт:

 $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.mysite.com/test.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$contents = curl_exec($ch);

if($contents) {
    echo $contents;
} else {
    $err = curl_error($ch);
    echo $err;
}

curl_close($ch);
  

Когда я запускаю этот код, он возвращает ошибку: не удалось подключиться к хосту

Если я изменю URL на http://www.google.com или любой другой сайт, он работает просто отлично. Кроме того, когда я пытаюсь открыть определенную страницу через cURL на другом сервере, все работает так, как должно. Предположения, которые я делаю из этих тестов, заключаются в том, что PHP cURL установлен и (вроде как) работает, и что проблема не в странице, которую пытаются открыть.

Я подумал, что это может быть проблема с портом, поэтому я попытался указать порт с тем же результатом (не подключаясь к хосту). Я пытался как curl_setopt , так и http://www.mysite.com:80/ указать порт, который, как я знаю, открыт.

Это наводит меня на мысль, что проблема кроется в моей установке apache, но я не эксперт по apache и весь день безрезультатно бился головой о Google. Есть идеи, что может вызвать такой конкретный сбой cURL?

Комментарии:

1. Вы когда-нибудь решали это? У меня точно такая же проблема, скрипт на моем собственном сервере работает нормально, когда я получаю доступ через браузер, но когда я запускаю cURL для доступа к нему из поддомена, он завершается ошибкой 7.

Ответ №1:

Столкнулся с той же проблемой, когда мое доменное имя не разрешалось на сервере, что приводило к сбою CURL запросов к самому себе.

Моя проблема заключалась в том, что мой веб-сервер не мог разрешить проблему самостоятельно из-за некоторых правил брандмауэра (перед веб-сервером установлен балансировщик нагрузки, который блокировал трафик с сервера).

Другими словами, выполнив следующую команду на моем сервере

curl -I http://www.mywebserver.com в результате:

$ curl -I http://www.mywebserver.com
curl: (7) couldn't connect to host

Обновление файла /etc / hosts на сервере для сопоставления доменного имени с локальным IP-адресом решило проблему, и fopen и curl изнутри мои скрипты снова заработали.

Комментарии:

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

2. большое вам спасибо, спустя долгое время это сработало и у меня. У меня был тайм-аут cURL на wordpress каждый раз, когда он пытался получить доступ к api, но query monitor сообщал, что это какая-то ошибка ssl, хотя я мог скручивать URL-адреса https с терминала. Затем я решил попробовать свой собственный домен, и время ожидания также истекло, это было странно, поскольку я мог получить доступ к WP API просто отлично через браузер, оказывается, единственное, что нужно было добавить запись в файл hosts для домена с локальным IP. После этого все заработало.

Ответ №2:

Вы можете выполнить пинг www.mysite.com ?

Проверьте свой /etc/ hosts … возможно, для www.mysite.com указан неправильный IP.

Ответ №3:

Попробуйте открыть http://www.mysite.com/test.php в веб-браузере. Если это работает, то проблема в cURL. Если это не так, то проблема либо в вашей сети, либо в конфигурации apache.

Вы можете проверить конфигурацию вашего apache, убедившись, что он запущен в вашей системе. Затем попробуйте telnet <apache server ip> 80 из командной строки. После подключения попробуйте выполнить следующее:

 GET /test.php HTTP/1.1
Host: www.mysite.com
<2 line breaks>
  

Если вы получаете ответ от apache, то это звучит как проблема с сетью. Убедитесь, что mysite.com преобразуется в IP-адрес вашего сервера apache, и трафик с порта 80 может поступать на ваш сервер. Это также может быть проблема с обратной маршрутизацией, когда ваш маршрутизатор пытается отправить запрос на свой собственный ip-адрес (при условии, что ваш ящик apache находится за маршрутизируемым сетевым подключением, тем же подключением, что и вы).

Ответ №4:

Я также столкнулся с этим на удаленном веб-сервере. Запустив curl на этом компьютере, я не смог получить доступ к файлам, размещенным сервером apache на том же компьютере. Странно, что я мог получить доступ к файлу с помощью

 curl -O http://example.com/file1.txt
  

но

 curl -0 http://sub.example.com/file1.txt
  

не сработало.

Я решил проблему, добавив отсутствующую DNS-запись на DNS-сервер, работающий на компьютере. Похоже, nslookup etc сначала взгляните на локальный DNS-сервер, прежде чем спрашивать кого-то еще. И поскольку локальный DNS-сервер ответил «не удается найти», curl сдался.