Назад | Перейти на главную страницу

При перезапуске службы httpd в RHEL возвращается сообщение «Остановка httpd: [FAILED]». Как это исправить?

Это мое первое указание на проблему:

$ 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, когда вы этого не хотите.