Автор Тема: [p8] Apache не запускается после перезагрузки компа  (Прочитано 2168 раз)

Оффлайн Lblss

  • Начинающий
  • *
  • Сообщений: 13
Последовательность сперва была такая.
$ sudo service httpd2 restart
Job for httpd2.service failed because a timeout was exceeded.
See "systemctl status httpd2.service" and "journalctl -xe" for details.

В журнале полезного не видно, но вот в логе /var/log/httpd2/error_log есть строчка [fcgid:emerg] [pid 4092:tid 140148164847488] (2)No such file or directory: mod_fcgid: Can't create shared memory for size 1200712 bytes

Отлично, лезем в конфиг /etc/httpd2/conf/mods-enabled/fcgid.conf и видим всего пару строк с упоминанием файлов или директорий:    FcgidIPCDir /var/run/mod_fcgid/fcgid_sock                                                                                           
    FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm                                                                                 

Проверяем$ sudo ls /var/run/mod_fcgid
ls: невозможно получить доступ к '/var/run/mod_fcgid': Нет такого файла или каталога   

Опс! Ладно, как и в прошлый и в позапрошлый раз...
$ sudo mkdir /var/run/mod_fcgid
И запускаем$ sudo service httpd2 restartВот теперь полет нормальный.

Всё бы ничего, но почему каждый раз нужно ручками создавать директорию и куда она вообще девается? Другие то директории в /var/run на месте...
« Последнее редактирование: 02.05.2017 21:45:01 от Lblss »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Каталоги в /var/run создаются динамически, во время работы системы (и находятся на tmpfs).  По идее, их должны создавать стартовые скрипты, связанные с пакетом.
Если посмотреть changelog пакета, то можно увидеть:
https://packages.altlinux.org/en/Sisyphus/srpms/apache2-mod_fcgid/spec
Цитировать
* Mon Oct 24 2016 Sergey Y. Afonin <asy at altlinux.ru> 2.3.9-alt2
- Added init script for check subdirectories in %%_runtimedir
- Changed configuration for new directives (from git of misha at altlinux)
- Added some files to %%doc

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 099
Каталоги в /var/run создаются динамически,
Правильнее "могут создаваться, в зависимости от дистрибутива". :-)
https://packages.altlinux.org/en/Sisyphus/srpms/apache2-mod_fcgid/spec
Цитировать
* Mon Oct 24 2016 Sergey Y. Afonin <asy at altlinux.ru> 2.3.9-alt2
- Added init script for check subdirectories in %%_runtimedir
Было дело. Но так как я systemd не использую на серверах, не подскажу. Может быть, этот init-скрипт спасёт и в случае systemd, но не знаю.
« Последнее редактирование: 03.05.2017 09:29:14 от asy »

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 099
Всё бы ничего, но почему каждый раз нужно ручками создавать директорию и куда она вообще девается? Другие то директории в /var/run на месте...
Попробуйте выполнить "chkconfig mod_fcgid on".

Оффлайн Lblss

  • Начинающий
  • *
  • Сообщений: 13
Ага, уже понятнее стало. У меня установлена как раз версия apache2-mod_fcgid-2.3.9-alt2. В стартовом скрипте /etc/init.d/mod_fcgid

# mod_fcgid No service.
#
# chkconfig: - 03 99
# description: check subdirectory in /var/run \
# must start before Apache
# processname: mod_fcgid

И как раз там есть код создания директорий. Только не вполне понятна пара вещей.
1. Имя директории прописано жестко, а не из конфига модуля читается. Ну это ладно, "партийная дисциплина", конфиги руками не трогаем :).
2. Понятно, что этот инит-скрипт должен выполниться раньше запуска Апача. Но не понятно, почему он не привязан к старту Апача явно. В центре управления системой acc не видно его, ибо mod_fcgid в данном случае и не служба вовсе. И тогда практически единственным рабочим вариантом будет chkconfig --add mod_fcgid.

Ну, так и сделал. Перезагружу комп - отпишусь о результате.

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Но не понятно, почему он не привязан к старту Апача явно.
Потому, что не привязан к systemd, а расчитан на SysVinit. А в SysVinit такой возможности нет -можно указать только номер - (03).
А в systemd все скрипты SysVinit запускаются в самом конце
« Последнее редактирование: 03.05.2017 10:38:32 от ruslandh »

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 099
2. Понятно, что этот инит-скрипт должен выполниться раньше запуска Апача. Но не понятно, почему он не привязан к старту Апача явно.
А как привязать ? Апач может быть, а fcgid может не быть. В инит-скрипт Апача писать запуск всего, что только возможно ? Можно, конечно, договориться о каком-нибудь каталоге в /etc/httpd2 с симлинками на необходимое, но это надо прорабатывать.
В центре управления системой acc не видно его, ибо mod_fcgid в данном случае и не служба вовсе. И тогда практически единственным рабочим вариантом будет chkconfig --add mod_fcgid.

Ну, так и сделал. Перезагружу комп - отпишусь о результате.
В спеке есть %post_service mod_fcgid, так что --add должно происходить автоматом, надо именно chkconfig mod_fcgid on. Почему его acc не видит, не знаю пока - скрипт как скрипт. Или --add не выполнился на самом деле ?

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 099
А в systemd все скрипты SysVinit запускаются в самом конце
Хм. Тогда init-скрипт не поможет. Разве что грохнуть httpd2.service. Ну или написать mod_fcgid.service. Если кто-нибудь этот mod_fcgid.service напишет, могу в пакет добавить, но без проверки. Впрочем, в ACL там Eve R. Ybody есть, так что надо только доступ к сборочнице иметь.

Оффлайн Lblss

  • Начинающий
  • *
  • Сообщений: 13
Или --add не выполнился на самом деле ?
Насколько понимаю, выполнился только ручками.

Было:$ sudo chkconfig --list mod_fcgid

Внимание: в выводе отображены только SysV службы (нативные службы systemd отсутствуют)
      конфигурация SysV  может быть сброшена нативной
      конфигураией systemd.

сервис mod_fcgid поддерживает chkconfig, но не используется ни на одном уровне выполнения (запустите 'chkconfig --add mod_fcgid')

После ручного --add последняя строчка стала такой:
mod_fcgid       0:выкл  1:выкл  2:выкл  3:вкл   4:вкл   5:вкл   6:выкл
« Последнее редактирование: 03.05.2017 11:34:04 от Lblss »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Если кто-нибудь этот mod_fcgid.service напишет,
Где-то даже видил скрипт, который генерит иниты по файлам rc.d/.. ;-)

Но возможно, это обман памяти ;-)

Оффлайн Lblss

  • Начинающий
  • *
  • Сообщений: 13
И тогда практически единственным рабочим вариантом будет chkconfig --add mod_fcgid.

Ну, так и сделал. Перезагружу комп - отпишусь о результате.
Перезагрузил. Апач стартовал успешно.

Однако, непонятки остались.
Раз уж рабочие директории в /var/run создаются автоматически по мере необходимости запуска сервисов, тогда не ясно, каким образом появляется директория /var/run/httpd2. В стартовых скриптах не нашел, где она создается. Однако, в /etc она так или иначе упоминается в именах файлов:
# grep -rn /var/run/httpd2 /etc/
/etc/rc.d/init.d/htcacheclean2:58:pidfile=/var/run/httpd2/${prog}.pid
/etc/rc.d/init.d/httpd2:9:# pidfile: /var/run/httpd2/httpd.pid
/etc/tmpfiles.d/apache2.conf:1:d /var/run/httpd2 0775 root apache2 -
/etc/httpd2/conf/mods-available/cgid.conf:7:    Scriptsock /var/run/httpd2/cgisock
/etc/httpd2/conf/extra-available/httpd-mpm.conf:12:     PidFile "/var/run/httpd2/httpd.pid"
Может, тут строчка "# pidfile: /var/run/httpd2/httpd.pid" - это не камент, а инструкция, по которой в том числе выполняется подготовка директории? Подобного рода "каменты" используется в стартовых скриптах на FreeBSD для управления последовательностью запуска сервисов, например.
Или в данном случае работает другой какой-то механизм? Растолкуйте пожалуйста технологию, если не сложно.



Цитата: Lblss от Сегодня в 09:33:36

    2. Понятно, что этот инит-скрипт должен выполниться раньше запуска Апача. Но не понятно, почему он не привязан к старту Апача явно.

А как привязать ? Апач может быть, а fcgid может не быть. В инит-скрипт Апача писать запуск всего, что только возможно ? Можно, конечно, договориться о каком-нибудь каталоге в /etc/httpd2 с симлинками на необходимое, но это надо прорабатывать.
Сдается мне, дополнительный каталог - это уже перебор. :-)
Список загружаемых модулей /etc/httpd2/conf/mods-enabled/*.load может как-то можно использовать? Например, для попытки запустить соответствующий init-скрипт при его наличии. Или в *.load прописать что-то с необходимостью дополнительной инициализации модуля. Хотя, думаю, это тоже перебор и усложнение. 

Подумалось. Может, проще перекинуть /var/run/mod_fcgid/fcgid_sock и /var/run/mod_fcgid/fcgid_shm в директорию /var/run/httpd2 - вроде, они близкие родственники. Тогда и скрипт для инициализации может не понадобится (тут могу ошибаться, не владею тонкостями вопроса). Или это к бардаку приведет или к каким-то проблемам?

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 099
Может, тут строчка "# pidfile: /var/run/httpd2/httpd.pid" - это не камент, а инструкция, по которой в том числе выполняется подготовка директории?
Возможно, но вряд ли.
Или в данном случае работает другой какой-то механизм? Растолкуйте пожалуйста технологию, если не сложно.
Я бы предположил, что это делает systemd в соответствии с написанным в /lib/systemd/system/httpd2.service, но я systemd не использую. И /var/run на tmpfs у меня нет пока. Сейчас проверил, у меня /var/run/httpd2 не создаётся, так что 99.99%, что у Вас это systemd делает.

UPD: А systemd делает это в соответствии с /etc/tmpfiles.d/apache2.conf, похоже.
« Последнее редактирование: 04.05.2017 08:54:28 от asy »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Немного не в тему, но:

https://habrahabr.ru/post/275645/
Цитировать
Особо понравилось, широко не афишируемое:
При остановке programming.target почему-то нижележащие apache2.service и mysqld.service не останавливались. Почитав как следует man page, я нашел проблему: systemd останавливает сервисы “лениво” — если никто не требует запущенный сервис, и он не был запущен явным образом, а как зависимость для какого-то другого сервиса, то systemd остановит его только при одном из 3 обстоятельств:

    Запустится какой-то другой сервис, который в своей декларации указывает, что он конфликтует с нашим сервисом.
    Выполнится systemctl isolate some-another.target или systemctl stop this.service.
    Наш сервис может запросить в своей декларации останавливать себя не ленивым образом, а активным, добавив вот такую строку в [Unit] секцию: StopWhenUnneeded=true

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
А systemd делает это в соответствии с /etc/tmpfiles.d/apache2.conf, похоже.

Мне тоже так показалось:
https://wiki.archlinux.org/index.php/Apache_HTTP_Server#Error:_PID_file_.2Frun.2Fhttpd.2Fhttpd.pid_not_readable_.28yet.3F.29_after_start