httpd가 apachectl보다 더 적은 수의 활성 모듈을 보고하는 이유는 무엇입니까?

httpd가 apachectl보다 더 적은 수의 활성 모듈을 보고하는 이유는 무엇입니까?

Apache2에서 mod-nss 모듈을 활성화하려고 합니다. 그래서 필요한 작업을 수행한 후 실제로 모듈이 로드되었는지 확인하려고 합니다.

아스카파텍틀

# apachectl -M | grep nss
 nss_module (shared)

데몬 자체에 물어보십시오.

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

따라서 두 가지 다른 출력을 얻습니다.

  • apachectl은 mod_nss 모듈이 로드되었다고 주장합니다.
  • httpd는 mod_nss 모듈이 로드되지 않았다고 주장합니다.

그 후, 나는 두 개의 모듈을 나열하고(단순히 특정 모듈을 검색하는 대신) 출력을 정렬하고 비교하기로 결정했습니다.

# 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은 httpd에 비해 4개의 추가 모듈을 보여줍니다. 왜 이런 일이 발생합니까? 어느 쪽을 믿어야 할까요?

나는 그들 사이의 차이점이 무엇인지 보려고 노력했지만 실패했습니다. 내가 찾은 결과 중 일부는 다음과 같습니다.

apachectl은 독립형 바이너리인 것 같습니다.

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

아파치 패키지에서:

# 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 배포판으로 사용하고 Prefork MPM을 사용하여 Apache를 실행합니다.

답변1

귀하의 목록이 주어지면 :

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

귀하의 바이너리가 "독립 실행형 바이너리"일 가능성은 거의 없습니다 apachectl(너무 작습니다. 합리적인 바이너리는 10-20배 더 클 것입니다). 사실 이것은 쉘 스크립트입니다. 당신이 실행할 때

apachectl -M

쉘 스크립트는 먼저 구성 파일에서 추가 매개변수를 얻고 -Mhttpd 바이너리를 실행할 때 이러한 매개변수를 앞에 추가합니다.

이 논의의 목적을 위해 나는 다음을 언급할 것이다.아파치 자식 미러및 템플릿 스크립트apachectl.in. 물론 아파치 버전마다 차이는 있지만 공통점은 apachectl스크립트가 서버 모듈의 위치를 ​​포함할 수 있는 구성 설정을 확인한다는 점이다. 현재 버전의 템플릿에서는 주석 아래에 있습니다.

# pick up any necessary environment variables

이러한 변수를 설정하지 않고 직접 실행하면 httpd-prefork제대로 작동하지 않습니다. 이는 모듈이 로드되지 않았다고 보고하는 이유를 설명합니다. 출력이 없으면 grep더 유익한 보고서를 얻을 수 있습니다. 예를 들어 목록이 전혀 없을 수도 있습니다.

관련 정보