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
쉘 스크립트는 먼저 구성 파일에서 추가 매개변수를 얻고 -M
httpd 바이너리를 실행할 때 이러한 매개변수를 앞에 추가합니다.
이 논의의 목적을 위해 나는 다음을 언급할 것이다.아파치 자식 미러및 템플릿 스크립트apachectl.in
. 물론 아파치 버전마다 차이는 있지만 공통점은 apachectl
스크립트가 서버 모듈의 위치를 포함할 수 있는 구성 설정을 확인한다는 점이다. 현재 버전의 템플릿에서는 주석 아래에 있습니다.
# pick up any necessary environment variables
이러한 변수를 설정하지 않고 직접 실행하면 httpd-prefork
제대로 작동하지 않습니다. 이는 모듈이 로드되지 않았다고 보고하는 이유를 설명합니다. 출력이 없으면 grep
더 유익한 보고서를 얻을 수 있습니다. 예를 들어 목록이 전혀 없을 수도 있습니다.