por que o httpd relata módulos menos ativos que o apachectl?

2

Estou tentando ativar o módulo mod-nss no Apache2. Então, depois de fazer o que é necessário, estou tentando validar que, de fato, o módulo está carregado.

Pedindo apachectl

# apachectl -M | grep nss
 nss_module (shared)

Perguntando ao daemon:

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

Então, eu recebo duas saídas diferentes:

  • O apachectl afirma que o módulo mod_nss está carregado.
  • link

Depois disso, decidi listar os módulos para ambos (em vez de apenas grep-ing para um específico), classificar a saída e depois compará-los.

# 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)

Como você pode ver, o apachectl mostra 4 módulos extras em contraste com o httpd. Por que isso está acontecendo? E em qual devo depositar minha confiança?

Eu tentei ver qual é a diferença entre eles, mas falhei. Aqui estão algumas das minhas descobertas:

o apachectl parece ser um binário independente

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

que vem do apache pkg:

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

que é realmente usado para facilitar o controle sobre o httpd. Aparentemente, há diferença em usá-lo com o SystemD ou o SySVinit. Aqui está uma citação da página man apachectl:

When acting in pass-through mode, apachectl can take all the arguments available for the httpd binary.

   apachectl [ httpd-argument ]

When acting in SysV init mode, apachectl takes simple, one-word commands, defined below.

   apachectl command

Então, se eu solicitar a opção de ajuda -h:

 # 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)

Parece que está usando o /usr/sbin/httpd-prefork ou pelo menos o que está escrito.

Mas vamos tentar ver o que o 'httpd' está usando em segundo plano:

# which httpd
/usr/sbin/httpd

que parece ser um link simbólico:

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

então usa o /usr/sbin/httpd-prefork que é o mesmo que o apachectl parece usar. Por exemplo, se eu pedir ajuda -h, recebo:

# /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)

que é idêntico ao que recebo com apachectl -h .

No entanto, este vem de outro pacote:

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

Além disso, não consigo pensar em uma razão pela qual recebo uma saída diferente quando procuro os módulos carregados: /

Para aqueles que gostariam de saber, estou usando o OpenSUSE Leap 42.1 como minha distribuição Linux e executo o Apache com o Prefork MPM.

    
por drpaneas 02.09.2016 / 11:02

1 resposta

0

Com base na sua listagem:

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

é improvável que seu apachectl seja um "binário independente" (é muito pequeno: um binário plausível seria 10 a 20 vezes maior). Na verdade, é um script de shell. Quando você executa

apachectl -M

o shell script primeiro obtém parâmetros adicionais de seus arquivos de configuração e os coloca antes do -M ao executar o binário httpd.

Para fins de discussão, vou me referir ao espelho git do Apache e ao script de modelo apachectl.in . Diferentes versões do Apache diferem, é claro, mas uma coisa comum às variações de apachectl é que o script verifica as configurações que podem incluir a localização dos módulos do seu servidor. Na versão atual do modelo, logo abaixo de um comentário

# pick up any necessary environment variables

Se você executar httpd-prefork diretamente sem definir essas variáveis, elas não funcionarão corretamente. Isso explica por que relatou que o módulo não foi carregado. Você pode receber um relatório mais informativo se não tiver grep da saída, por exemplo, pode não haver nenhuma listagem.

    
por 02.09.2016 / 23:39