Intereting Posts
Насколько безопасно sudo при запуске от root для запуска приложения в качестве менее привилегированного пользователя? Одиночная команда для проверки наличия файла и печати (настраиваемого) сообщения для stdout? Круговой журнал в linux Есть ли инструмент командной строки для обработки изображений? IBM DB2 для Linux AMD64 не устанавливается на Debian Jessie, журнал установки предлагает проблему с поставляемым IBM libdb2ure.so Разрешить пользователям, не являющимся root, монтировать кеперизованную долю CIFS только в своем доме Установленный Linux Mint в системе с двойной загрузкой. Не удается загрузить Windows 7 Как читать IP-адрес назад? Настройки gedit выделены серым цветом Правильное поведение ловушек EXIT и ERR при использовании `set -eu` Насколько быстро / часто происходят измерения памяти процесса в ядре? Захват зашифрованного паролем CenttOS 7 в Windows Как добавить дополнительный ключ управления? Связывание одного ключа (например, «F1») с несколькими клавишами (например, «Ctrl + C») в Gnome полный rootfs на большом жестком диске, установка или обновление программного обеспечения невозможно

почему httpd сообщает менее активные модули, чем apachectl?

Я пытаюсь включить mod-nss-модуль в Apache2. Поэтому, выполняя то, что необходимо, я пытаюсь проверить, действительно ли модуль загружен.

Запрашивать apachectl

# apachectl -M | grep nss nss_module (shared) 

Спросить самого демона:

 /usr/sbin/httpd-prefork -M | grep nss -> No output 

Итак, я получаю два разных выхода:

  • apachectl утверждает, что модуль mod_nss загружен.
  • httpd утверждает, что модуль mod_nss не загружен.

После этого я решил перечислить модули для обоих (а не только для grep-ing для определенного), сортировать выходные данные и затем сравнивать их.

 # diff -Nur httpd_sorted_modules apachectl_sorted_modules --- httpd_sorted_modules 2016-09-01 13:59:16.297139860 +0200 +++ apachectl_sorted_modules 2016-09-01 13:59:26.680985223 +0200 @@ -15,11 +15,15 @@ expires_module (shared) http_module (static) include_module (shared) + info_module (shared) log_config_module (shared) mime_module (shared) mpm_prefork_module (static) negotiation_module (shared) + nss_module (shared) + php5_module (shared) reqtimeout_module (shared) + rewrite_module (shared) setenvif_module (shared) so_module (static) socache_shmcb_module (shared) 

Как вы можете видеть, apachectl показывает 4 дополнительных модуля в отличие от httpd. Почему это происходит? И на кого я должен доверять?

Я попытался понять, в чем разница между ними, но я потерпел неудачу. Вот некоторые из моих выводов:

apachectl кажется автономным двоичным

 # ls -l `which apachectl` -rwxr-xr-x 1 root root 3548 Aug 23 13:11 /usr/sbin/apachectl 

что происходит от apache pkg:

 # rpm -qf `which apachectl` apache2-2.4.16-12.1.x86_64 

который фактически используется для облегчения контроля над httpd. По-видимому, есть разница в использовании его с SystemD или SySVinit. Вот цитата с страницы man apachectl:

При работе в сквозном режиме apachectl может принимать все аргументы, доступные для бинарного файла httpd.

  apachectl [ httpd-argument ] 

При действии в режиме инициализации SysV apachectl принимает простые команды с одним словом, определенные ниже.

  apachectl command 

Итак, если я запрошу вариант -h help:

  # apachectl -h Usage: /usr/sbin/httpd-prefork [-D name] [-d directory] [-f file] [-C "directive"] [-c "directive"] [-k start|restart|graceful|graceful-stop|stop] [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X] Options: -D name : define a name for use in <IfDefine name> directives -d directory : specify an alternate initial ServerRoot -f file : specify an alternate ServerConfigFile -C "directive" : process directive before reading config files -c "directive" : process directive after reading config files -e level : show startup errors of level (see LogLevel) -E file : log startup errors to file -v : show version number -V : show compile settings -h : list available command line options (this page) -l : list compiled in modules -L : list available configuration directives -t -D DUMP_VHOSTS : show parsed vhost settings -t -D DUMP_RUN_CFG : show parsed run settings -S : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG -t -D DUMP_MODULES : show all loaded modules -M : a synonym for -t -D DUMP_MODULES -t : run syntax check for config files -T : start without DocumentRoot(s) check -X : debug mode (only one worker, do not detach) 

Похоже, что он использует /usr/sbin/httpd-prefork или, по крайней мере, то, что он говорит.

Но давайте попробуем посмотреть, что 'httpd' использует в фоновом режиме:

 # which httpd /usr/sbin/httpd 

который, по-видимому, является символической ссылкой:

 # ls -l `which httpd` lrwxrwxrwx 1 root root 23 Aug 25 13:28 /usr/sbin/httpd -> /usr/sbin/httpd-prefork 

поэтому он использует /usr/sbin/httpd-prefork который является тем же самым, что и apachectl. Например, если я запрашиваю -h help, я получаю:

 # /usr/sbin/httpd-prefork -h Usage: /usr/sbin/httpd-prefork [-D name] [-d directory] [-f file] [-C "directive"] [-c "directive"] [-k start|restart|graceful|graceful-stop|stop] [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X] Options: -D name : define a name for use in <IfDefine name> directives -d directory : specify an alternate initial ServerRoot -f file : specify an alternate ServerConfigFile -C "directive" : process directive before reading config files -c "directive" : process directive after reading config files -e level : show startup errors of level (see LogLevel) -E file : log startup errors to file -v : show version number -V : show compile settings -h : list available command line options (this page) -l : list compiled in modules -L : list available configuration directives -t -D DUMP_VHOSTS : show parsed vhost settings -t -D DUMP_RUN_CFG : show parsed run settings -S : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG -t -D DUMP_MODULES : show all loaded modules -M : a synonym for -t -D DUMP_MODULES -t : run syntax check for config files -T : start without DocumentRoot(s) check -X : debug mode (only one worker, do not detach) 

который идентичен тому, что я получаю с apachectl -h .

Однако это происходит из другого пакета:

 # rpm -qf /usr/sbin/httpd-prefork apache2-prefork-2.4.16-12.1.x86_64 

Кроме того, я не могу думать о причине, по которой я получаю разные выходные данные, когда я запрашиваю загруженные модули: /

Для тех, кто хотел бы знать, я использую OpenSUSE Leap 42.1 в качестве своего дистрибутива Linux, и я запускаю Apache с помощью Prefork MPM.

Учитывая ваш список:

 # ls -l `which apachectl` -rwxr-xr-x 1 root root 3548 Aug 23 13:11 /usr/sbin/apachectl 

маловероятно, что ваш apachectl является «автономным двоичным» (он слишком мал: правдоподобный двоичный файл будет в 10-20 раз больше). Фактически, это сценарий оболочки. Когда вы выполняете

 apachectl -M 

сценарий оболочки сначала получает дополнительные параметры из своих файлов конфигурации и помещает их перед -M при выполнении бинарного файла httpd.

В целях обсуждения я буду ссылаться на git-зеркало Apache и на скрипт-скрипт apachectl.in . Разумеется, разные версии Apache отличаются друг от друга, но одна вещь, общая для вариантов apachectl заключается в том, что скрипт проверяет параметры конфигурации, которые могут включать расположение модулей вашего сервера. В текущей версии шаблона это чуть ниже комментария

 # pick up any necessary environment variables 

Если вы запустите httpd-prefork напрямую, не устанавливая эти переменные, он не будет работать должным образом. Это объясняет, почему он сообщил, что модуль не загружен. Вы можете получить более информативный отчет, если вы не сделали grep вывод, например, вообще не может быть никакого листинга.