Вопрос или проблема
Среда:
- Mac OS X EL Capitan 64 bit
- Apache 2.4.25 (Unix)
ping
ping 127.0.0.1
возвращает:
>64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.081 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.111 ms
...
telnet:
telnet 127.0.0.1 80
возвращает:
>Попытка подключения к 127.0.0.1...
telnet: подключение к адресу 127.0.0.1 отказано
telnet: не удается подключиться к удаленному хосту
scutil:
scutil -r localhost
Возвращает:
Доступен
configtest:
apachectl configtest
Возвращает:
Синтаксис в порядке
$PATH
/usr/local/bin
/usr/bin
/bin
/usr/local/sbin
/usr/sbin
/sbin
Несколько apachectl restart
и полные перезапуски системы без успеха!
В чем проблема с моей установкой Apache?
Обновление 1
curl
curl -v http://127.0.0.1
Возвращает:
URL перестроен: http://127.0.0.1/
Попытка подключения к 127.0.0.1...
подключение к 127.0.0.1 порту 80 не удалось: подключение отказано
не удалось подключиться к 127.0.0.1 порту 80: подключение отказано
Закрытие соединения 0
curl: (7) Не удалось подключиться к 127.0.0.1 порту 80: подключение отказано
Обновление 2
lsof
lsof -i:80
Возвращает:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Google 349 peyman 126u IPv4 0x23528848eb5fe4db 0t0 TCP 192.168.1.102:49238->ec2-54-197-238-119.compute-1.amazonaws.com:http ( УСТАНОВЛЕНО)
Google 349 peyman 147u IPv4 0x23528848ec35769b 0t0 TCP 192.168.1.102:49286->151.101.193.69:http ( УСТАНОВЛЕНО)
Google 349 peyman 164u IPv4 0x23528848ebfa413b 0t0 TCP 192.168.1.102:49290->ec2-23-23-98-233.compute-1.amazonaws.com:http ( УСТАНОВЛЕНО)
Google 349 peyman 170u IPv4 0x23528848ebfa031b 0t0 TCP 192.168.1.102:49242->pixel.quantserve.com:http ( УСТАНОВЛЕНО)
Google 349 peyman 188u IPv4 0x23528848ec330dbb 0t0 TCP 192.168.1.102:49248->151.101.65.69:http ( УСТАНОВЛЕНО)
Google 349 peyman 189u IPv4 0x23528848ebe7185b 0t0 TCP 192.168.1.102:49308->ec2-23-21-110-0.compute-1.amazonaws.com:http ( УСТАНОВЛЕНО)
Google 349 peyman 208u IPv4 0x23528848ec35885b 0t0 TCP 192.168.1.102:49272->a72-247-178-186.deploy.akamaitechnologies.com:http ( УСТАНОВЛЕНО)
Я не вижу никаких свидетельств в том, что вы опубликовали, и что Apache даже слушает на порту 80; я вижу только исходящие подключения к порту 80 на других системах. Команда telnet 127.0.0.1 80
не показывает, что Apache доступен; вы увидите те же результаты, если используете порт 81, 85, 800 и т. д. Введите команду netstat -a | grep http | grep LISTEN
; вы должны увидеть строку с “*.http” и “LISTEN” в конце строки, если Apache действительно слушает соединения на порту 80. Например, см. Запуск веб-сервера Apache под OS X El Capitan.
Если вы не видите строки вывода, указывающей, что он слушает на порту 80, но просто возвращаетесь к подсказке Bash shell, то введите команду sudo apachectl start
, затем введите команду netstat снова. Если теперь вы видите, что процесс слушает порт 80, вы можете попробовать свою команду telnet снова. Если Apache отвечает на порту 80, вы должны увидеть Escape character is '^]'.
В этот момент вы можете ввести команду HEAD / HTTP/1.0
и затем нажать клавишу ввода несколько раз. Вы должны увидеть, что Apache отвечает с выводом, подобным следующему:
$ telnet 127.0.0.1 80
Попытка подключения к 127.0.0.1...
Подключено к localhost.
Escape character is '^]'.
HEAD / HTTP/1.0
HTTP/1.1 200 OK
Date: Sat, 11 Mar 2017 01:44:13 GMT
Server: Apache/2.4.18 (Unix) PHP/5.5.38
Last-Modified: Fri, 03 Feb 2017 21:44:57 GMT
ETag: "a8-547a7315f6840"
Accept-Ranges: bytes
Content-Length: 168
Connection: close
Content-Type: text/html
.
Ответ или решение
Теория
Причина, по которой Apache 2.4 может быть доступным, но отказывать в подключении, заключается в том, что веб-сервер Apache, вероятно, не слушает на порту 80, что предотвращает успешное подключение. Это может быть связано как с неправильно сконфигурированным Apache, так и с несоответствующим запуском службы. Другая причина может заключаться в конфликте с другой программой, которая использует порт 80.
Пример
В предоставленном описании проблемы вызов команды telnet 127.0.0.1 80
возвращает «Connection refused», что является признаком того, что на порту 80 не слушает никакая программа. Кроме того, команда lsof -i:80
не показывает никаких процессов, занимающих этот порт, а это подтверждает, что Apache не запущен или неправильно сконфигурирован.
Применение
Чтобы решить эту проблему, выполните следующие шаги:
-
Проверка статуса Apache: Убедитесь, что Apache запущен, используя команду
sudo apachectl start
. Это стартует Apache, если он не был запущен. -
Проверка прослушивания порта: Введите
netstat -a | grep http | grep LISTEN
, чтобы проверить, слушает ли Apache на порту 80. Должна появиться строка с*.http
иLISTEN
. -
Конфигурация Apache: Убедитесь, что конфигурационный файл Apache настроен для прослушивания на порту 80. Найдите файл
httpd.conf
и проверьте, содержится ли строкаListen 80
. -
Проверка наличия конфликтов портов: Убедитесь, что ни одна другая программа или служба не использует порт 80. Для этого снова используйте
lsof -i:80
и убедитесь, что нет других процессов.
Если указанные шаги решат проблему, telnet
или curl
должны успешно подключиться к 127.0.0.1
на порту 80, получая стандартный ответ Apache.