- 1 httpdコマンドとは?
- 2 検証環境
- 3 オプション一覧
- 4 Apatchのバージョンを確認する方法(-v)
- 5 設定ファイルをチェックする方法(-t)
- 6 ロードされているモジュールを調べる方法
- 7 ディレクティブを表示する方法(-L)
- 8 デバッグモードを有効にする方法(-X)
- 9 ビルドパラメータを表示する方法(-V)
- 10 その他(ログレベルの変更方法)
- 11 その他(dumpio_moduleモジュールの使い方)
- Z 参考情報
2 検証環境
CentOS版数は以下のとおりです。
[root@server ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
カーネル版数は以下のとおりです。
[root@server ~]# uname -r 3.10.0-1160.el7.x86_64
3 オプション一覧
オプション一覧を以下に示します。
[root@server ~]# httpd -h Usage: httpd [-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)
4 Apatchのバージョンを確認する方法(-v)
-vは、Apatchのバージョンを表示するオプションです。以下の実行結果より、Apatchのバージョンは、Apache/2.4.6であることがわかります。
[root@server ~]# httpd -v Server version: Apache/2.4.6 (CentOS) Server built: Jan 25 2022 14:08:43
5 設定ファイルをチェックする方法(-t)
-tは、設定ファイル(httpd.conf)の設定内容が正しいかどうかをチェックするオプションです。httpd.confのServerNameがデフォルトのままだと、下記メッセージが出力されます。
[root@server ~]# httpd -t AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::be28:682a:f1e:9786. Set the 'ServerName' directive globally to suppress this message Syntax OK
ServerNameにApacheがパケットの到着を待つインタフェースのIPアドレスを設定します。
[root@server ~]# cat /etc/httpd/conf/httpd.conf -snip- ServerName 192.168.2.100:80
httpdサービスを再起動します。
[root@server ~]# systemctl restart httpd.service
再度、httpdコマンドを実行します。httpdコマンドの実行結果がOKとなりました。
[root@server ~]# httpd -t Syntax OK
次に、1行目にTESTを追記して、誤りがある設定ファイルを作成します。
[root@server ~]# less -N /etc/httpd/conf/httpd.conf 1 TEST 2 # 3 # This is the main Apache HTTP server configuration file. It contains the -snip-
httpdコマンドを実行します。設定ファイルに誤りがあると、以下のようにエラーが表示されます。
[root@server ~]# httpd -t AH00526: Syntax error on line 1 of /etc/httpd/conf/httpd.conf: Invalid command 'TEST', perhaps misspelled or defined by a module not included in the server configuration
6 ロードされているモジュールを調べる方法
6.1 動的にロードされたモジュールを調べる方法(-M)
-Mは、ロードされているモジュールを表示するオプションです。sharedのモジュールは、/etc/httpd/conf.modules.d配下の定義ファイルを編集することで、モジュールをロードしたり、ロードしないようにすることができます。一方、staticはsharedのようにカスタマイズすることはできません。Apatcheに静的に組み込まれているモジュールです。
[root@server ~]# httpd -M Loaded Modules: core_module (static) so_module (static) http_module (static) access_compat_module (shared) actions_module (shared) alias_module (shared) -snip-
モジュールの定義ファイルは、/etc/httpd/conf.modules.d配下に格納されています。
[root@server ~]# ls -l /etc/httpd/conf.modules.d 合計 28 -rw-r--r--. 1 root root 3739 1月 14 02:38 00-base.conf -rw-r--r--. 1 root root 139 1月 8 01:08 00-dav.conf -rw-r--r--. 1 root root 41 1月 8 01:08 00-lua.conf -rw-r--r--. 1 root root 742 1月 14 02:38 00-mpm.conf -rw-r--r--. 1 root root 957 1月 14 02:38 00-proxy.conf -rw-r--r--. 1 root root 88 1月 8 01:08 00-systemd.conf -rw-r--r--. 1 root root 451 1月 8 01:08 01-cgi.conf
上記定義ファイルにLoadModuleディレクティブが定義されています。たとえば、00-base.confは以下のようになっています。
[root@server ~]# cat /etc/httpd/conf.modules.d/00-base.conf # # This file loads most of the modules included with the Apache HTTP # Server itself. # LoadModule access_compat_module modules/mod_access_compat.so LoadModule actions_module modules/mod_actions.so LoadModule alias_module modules/mod_alias.so -snip-
LoadModuleディレクティブの書式は、以下のとおりです。httpd -Mはモジュール名を表示しています。
LoadModule モジュール名 共有オブジェクトファイル名
そして、モジュールの実体(共有オブジェクトファイル)は、/usr/lib64/httpd/modulesにあります。たとえば、access_compat_moduleモジュールの共有オブジェクトファイル名はmod_access_compat.soです。
[root@server ~]# ls -l /usr/lib64/httpd/modules/mod_access_compat.so -rwxr-xr-x. 1 root root 11232 1月 25 23:09 /usr/lib64/httpd/modules/mod_access_compat.so
access_compat_moduleがロードされているかどうかを確認します。access_compat_moduleがロードされていることがわかります。
[root@server ~]# httpd -M|grep access_compat_module access_compat_module (shared)
6行目の行頭に#を挿入して、access_compat_moduleの定義を無効化してみます。
[root@server conf.modules.d]# less -N 00-base.conf 1 # 2 # This file loads most of the modules included with the Apache HTTP 3 # Server itself. 4 # 5 6 #LoadModule access_compat_module modules/mod_access_compat.so -snip-
httpdを再起動します。
[root@server ~]# systemctl restart httpd
access_compat_moduleの定義を無効にしたことで、httpd -Mを実行してもaccess_compat_moduleモジュール名が表示されなくなったことがわかります。
[root@server ~]# httpd -M|grep access_compat_module [root@server ~]#
6.2 静的に組み込まれたモジュールを表示する方法(-l)
[root@server ~]# httpd -l Compiled in modules: core.c mod_so.c http_core.c
7 ディレクティブを表示する方法(-L)
-Lは、ディレクティブを表示するオプションです。ディレクティブとは、Apacheに対するコマンドのことです。
[root@server ~]# httpd -L -snip- DocumentRoot (core.c) Root directory of the document tree Allowed in *.conf only outside <Directory>, <Files>, <Location>, or <If> ErrorDocument (core.c) Change responses for HTTP errors Allowed in *.conf anywhere and in .htaccess when AllowOverride includes FileInfo -snip-
LoadModuleディレクティブを表示してみます。
[root@server ~]# httpd -L|grep LoadModule LoadModule (mod_so.c)
LogLevelディレクティブを表示してみます。
[root@server ~]# httpd -L|grep LogLevel LogLevel (core.c)
8 デバッグモードを有効にする方法(-X)
デバッグモードを有効にすると、httpdプロセスが1つだけ起動されます。たとえば、並列処理のためにプロセスをforkして複数プロセスを起動するような設定にしていると、要求が来たときにどのプロセスが処理しているのかわかりません。そのような時、本オプションを有効にして、デバッグ対象のプロセスを1つに絞り込みことができます。まず、デバッグモード無効時の状態を確認してみます。複数のhttpdプロセスが起動していることがわかります。
[root@server ~]# ps -C httpd -o comm,pid,ppid,args COMMAND PID PPID COMMAND httpd 1948 1 /usr/sbin/httpd -DFOREGROUND httpd 1949 1948 /usr/sbin/httpd -DFOREGROUND httpd 1950 1948 /usr/sbin/httpd -DFOREGROUND httpd 1951 1948 /usr/sbin/httpd -DFOREGROUND httpd 1952 1948 /usr/sbin/httpd -DFOREGROUND httpd 1953 1948 /usr/sbin/httpd -DFOREGROUND
次にデバッグモードを有効にしてみます。/etc/sysconfig/httpdファイルのOPTIONSに-Xを指定します。
[root@server ~]# cat /etc/sysconfig/httpd -snip- #OPTIONS= OPTIONS=-X
httpdを再起動します。
[root@server ~]# systemctl restart httpd
プロセスを確認してみます。デバッグモード有効時は、httpプロセスが1つだけ起動していることがわかります。
[root@server ~]# ps -C httpd -o comm,pid,ppid,args COMMAND PID PPID COMMAND httpd 2029 1 /usr/sbin/httpd -X -DFOREGROUND
9 ビルドパラメータを表示する方法(-V)
[root@server ~]# httpd -V Server version: Apache/2.4.6 (CentOS) Server built: Jan 25 2022 14:08:43 Server's Module Magic Number: 20120211:24 Server loaded: APR 1.4.8, APR-UTIL 1.5.2 Compiled using: APR 1.4.8, APR-UTIL 1.5.2 Architecture: 64-bit Server MPM: prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=256 -D HTTPD_ROOT="/etc/httpd" -D SUEXEC_BIN="/usr/sbin/suexec" -D DEFAULT_PIDLOG="/run/httpd/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd.conf
10 その他(ログレベルの変更方法)
ログレベルの変更をしてみます。ログレベルは、以下のものがあります。デフォルトのログレベルはwarnです。これをdebugに変更してみます。
debug, info, notice, warn, error, crit, alert, emerg(緊急度高)
[root@server ~]# cat /etc/httpd/conf/httpd.conf #LogLevel warn LogLevel debug -snip-
httpdを再起動します。
[root@server ~]# systemctl restart httpd
error_logを確認すると、debugレベルのログが出力されていることがわかります。以下の例では、proxy:debugがdebugレベルのログです。
[root@server ~]# cat /var/log/httpd/error_log -snip- [Wed Mar 23 21:20:22.128938 2022] [lbmethod_heartbeat:notice] [pid 2060] AH02282: No slotmem from mod_heartmonitor [Wed Mar 23 21:20:22.128971 2022] [core:warn] [pid 2060] AH00098: pid file /run/httpd/httpd.pid overwritten -- Unclean shutdown of previous Apache run? [Wed Mar 23 21:20:22.129653 2022] [proxy:debug] [pid 2060] proxy_util.c(1843): AH00925: initializing worker proxy:reverse shared [Wed Mar 23 21:20:22.129678 2022] [proxy:debug] [pid 2060] proxy_util.c(1888): AH00927: initializing worker proxy:reverse local [Wed Mar 23 21:20:22.129688 2022] [proxy:debug] [pid 2060] proxy_util.c(1939): AH00931: initialized single connection worker in child 2060 for (*)
11 その他(dumpio_moduleモジュールの使い方)
dumpio_moduleモジュールを使うと、httpdプロセスの入出力をデバッグすることができます。まず、dumpio_moduleモジュールがロードされているかどうか確認します。私の環境では、デフォルトでロードされていました。
[root@server ~]# httpd -M|grep dumpio_module dumpio_module (shared)
httpd.confを編集します。LogLevelディレクティブにdumpio:trace7を追加します。
[root@server ~]# cat /etc/httpd/conf/httpd.conf LogLevel warn LogLevel dumpio:trace7
次に、/etc/httpd/conf.d配下に任意のファイルを作成します。ここでは、debug.confという名前のファイルを作成しました。そして、debug.confに下記設定を定義しました。DumpIOOutputもしくはDumpIOInputだけを有効にすることも可能です。
[root@server ~]# vi /etc/httpd/conf.d/debug.conf [root@server ~]# cat /etc/httpd/conf.d/debug.conf DumpIOOutput On DumpIOInput On
httpdを再起動します。
[root@server ~]# systemctl restart httpd
ブラウザやcurlでhttpdにアクセスすると、下記ログが出力されることがわかります。公式サイト(mod_dumpio - Apache HTTP Server Version 2.4)の情報によると、ロギングされる情報は、TLS暗号化前/TLS複合後の情報が記録されるようです。
[root@server ~]# tail -f /var/log/httpd/error_log -snip- [Wed Mar 23 21:32:14.014299 2022] [dumpio:trace7] [pid 2091] mod_dumpio.c(140): [client 192.168.2.101:54672] mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Wed Mar 23 21:32:19.020195 2022] [dumpio:trace7] [pid 2091] mod_dumpio.c(151): [client 192.168.2.101:54672] mod_dumpio: dumpio_in - 70007 [Wed Mar 23 21:32:19.020344 2022] [dumpio:trace7] [pid 2091] mod_dumpio.c(164): [client 192.168.2.101:54672] mod_dumpio: dumpio_out [Wed Mar 23 21:32:19.020362 2022] [dumpio:trace7] [pid 2091] mod_dumpio.c(63): [client 192.168.2.101:54672] mod_dumpio: dumpio_out (metadata-FLUSH): 0 bytes [Wed Mar 23 21:32:19.020371 2022] [dumpio:trace7] [pid 2091] mod_dumpio.c(63): [client 192.168.2.101:54672] mod_dumpio: dumpio_out (metadata-EOC): 0 bytes
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ