hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

httpdコマンドの使い方



1 httpdコマンドとは?

Apacheデバッグに使うコマンドです。

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

ブラウザやcurlhttpdにアクセスすると、下記ログが出力されることがわかります。公式サイト(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技術ブログ