Это мое первое указание на проблему:
$ sudo /sbin/service httpd restart
Stopping httpd: [FAILED]
Starting httpd: no listening sockets available, shutting down
Unable to open logs
[FAILED]
Я знаю, что httpd запущен
$ ps -ef | grep httpd | grep -v grep
apache 9619 20181 0 07:08 ? 00:00:03 /usr/sbin/httpd
apache 10092 20181 0 Jan24 ? 00:00:07 /usr/sbin/httpd
apache 13086 20181 0 06:09 ? 00:00:00 /usr/sbin/httpd
apache 13717 20181 0 Jan25 ? 00:00:01 /usr/sbin/httpd
apache 14730 20181 0 07:13 ? 00:00:01 /usr/sbin/httpd
apache 16359 20181 0 09:54 ? 00:00:00 /usr/sbin/httpd
root 20181 1 0 2011 ? 00:00:01 /usr/sbin/httpd
apache 21450 20181 0 09:55 ? 00:00:00 /usr/sbin/httpd
и он использует порты 80 и 443
$ sudo netstat -lnp | grep :80
tcp 0 0 :::80 :::* LISTEN 9619/httpd
$ sudo netstat -lnp | grep :443
tcp 0 0 :::443 :::* LISTEN 9619/httpd
поэтому я предполагаю, что получаю сообщение «нет доступных сокетов для прослушивания», потому что httpd не может прекратить освобождать порты 80 и 443.
Я использую RHEL версии 5.7:
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.7 (Tikanga)
Я вижу несколько процессов, запущенных для httpd:
$ pgrep httpd
9619
10092
13086
13717
14730
16359
20181
21450
Что могло помешать остановке httpd? Если я убью процессы для httpd, смогу ли я запустить httpd без проблем?
Функция остановки в /etc/init.d/httpd использует pidfile:
killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd
Возможно, файл pidfile /var/run/httpd.pid
устарел или отсутствует (могли ли вы запускать httpd в прошлом, не используя /etc/init.d
сценарий или service
?). Вы можете проверить этот файл (и его содержимое) с помощью ps -ef |grep http
.
Мех, просто sudo kill 20181
. Затем запустите службу, как обычно. Затем попробуйте перезапустить после этого.
Если это произойдет снова, вам, вероятно, следует выяснить, почему файл pid не работает с таблицей процессов.
Сделайте то же самое на centos6 с ispconfig3 и Apache. Сообщение cjc помогло мне найти ответ на мой. (спасибо!) Оказывается, путь PID в /etc/httpd/conf/httpd.conf по какой-то причине отличался от пути в /etc/init.d/httpd. Как только я сделал их такими же (я решил отредактировать httpd.conf, оставив только сценарий init.d), затем убил httpd, используя PID, указанный в ps -ef, затем снова запустил httpd с помощью /etc/init.d/httpd start и вуаля, он работает как должно. service httpd status / stop / restart / start все работает, как ожидалось.
Я подозреваю, что файл http.conf, возможно, был заменен из резервной копии centos5 или, возможно, он был отредактирован в какой-то момент, если значение по умолчанию не было неправильным, хотя это кажется маловероятным.
/etc/httpd/conf/httpd.conf
Before:
PidFile run/httpd.pid
After:
PidFile run/httpd/httpd.pid
/etc/init.d/httpd дал намек на то, что это должно было быть:
# pidfile: /var/run/httpd/httpd.pid
В моем статусе было указано «Остановлено», хотя httpd явно показывал, что работает в ps. stop выдал ошибку, start выдал порты, которые уже используются. Оглядываясь назад, сейчас это имеет смысл, но я хотел опубликовать это, если кто-то еще столкнется с тем же. stop также давал httpd мертв, но иногда subys блокировался.
Пример ошибки, которую я получал:
Stopping httpd: [FAILED]
Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
Вы должны иметь возможность убивать процессы HTTP - текущие соединения, конечно, будут прерваны, и если кто-то в настоящее время отправляет вам данные (например, отправляет форму), они могут быть потеряны. Но в целом да, это нормально. То же самое произойдет с service httpd restart
. Возможно, вам придется очистить файл блокировки в / var / lock / subsys / httpd (удалить этот файл).
Я бы тогда побежал service httpd configtest
чтобы убедиться, что ваша конфигурация apache хотя бы загружается. Тогда попробуйте начать с service httpd start
Вы правы в том, что ошибки, связанные с используемыми портами, связаны с тем, что httpd все еще работает, и поэтому они используют эти порты. Точно так же и ошибка журнала.
Еще одно - не нужно бежать sudo
использовать ps
или netstat
. Возьмите за привычку использовать только sudo
для вещей, которые в этом нуждаются. Это избавит вас от неприятностей позже, когда вы избежите выполнения деструктивной команды с привилегиями root, когда вы этого не хотите.