サーバ上で動いているWebサーバを特定する方法
自分で構築したわけでもないWebサーバをメンテナンスしないといけなくなって、当然ドキュメントなんて存在しないし、例えあったとしても正しいという保証はまったくないという良くある状況を仮定したとして…
この状態で動いているWebサーバを特定し、メンテナンスをしないといけないとします。
OSやdistributionで用意されているデフォルトのApacheを使ってくれていれば良いのですが、往々にして自前でビルドしたApacheが走っていたり、そもそもApache以外のWebサーバ(nginx等)が動いていたりするわけです。何がWebサーバとして使われ、その設定ファイルがどこにあるのか? そこを特定するところから全ては始まります。
以下、CentOSで実行することを仮定してます。それ以外のOSやLinux distributionであれば、パス名等が違うことがあるかもしれません。
また、後半の設定ファイルを特定する部分については、Apacheの場合のみを書いてます。
lsofで TCP 80番ポートや443番ポートをLISTENしているプロセスを特定する
ブラウザ等のWebクライアントとサーバの間にロードバランサー等が入っておらず、直接Webサーバに接続していると仮定します。
Webクライアントから当該サーバにアクセスする時、URLのスキームが “http” であればTCP 80番ポート、”https” であればTCP 443番ポートに接続しているということになります。もしそれ以外のポートにアクセスするのであれば、ポート番号を指定しているはずなので。
ということは、サーバでTCP の80番や443番ポートをLISTENしているプロセスが特定出来れば、それがWebサーバのプロセスということになります。
特定のポートをLISTENしているプロセスを調べるためには、lsofコマンドを使います。TCP 80番ポートをLISTENしているプロセスを調べるには、下記を実行します。
$ sudo /usr/sbin/lsof -Pn -i tcp:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 5931 apache 3u IPv4 837255019 0t0 TCP *:80 (LISTEN)
httpd 7124 apache 3u IPv4 837255019 0t0 TCP *:80 (LISTEN)
httpd 7464 apache 3u IPv4 837255019 0t0 TCP *:80 (LISTEN)
httpd 7469 apache 3u IPv4 837255019 0t0 TCP *:80 (LISTEN)
httpd 8084 apache 3u IPv4 837255019 0t0 TCP *:80 (LISTEN)
httpd 8086 apache 3u IPv4 837255019 0t0 TCP *:80 (LISTEN)
lsofの -P オプションは、ポート番号を数字で出力します。また、-n は接続先のDNS逆引きをしないというオプションになります。
そして -i tcp:80というオプションが、TCP の80番をLISTENしているプロセスのみを出力するというオプションです。
この出力から、このサーバ上で動いているのはApache httpdであろうということがわかります。
次は、COMMAND が httpd であるプロセスのフルパスを調べて行きます。
$ sudo /usr/sbin/lsof -Pn -c httpd -a -d txt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 11358 root txt REG 253,0 928892 4606756 /usr/local/apache/bin/httpd
httpd 22911 apache txt REG 253,0 928892 4606756 /usr/local/apache/bin/httpd
httpd 22982 apache txt REG 253,0 928892 4606756 /usr/local/apache/bin/httpd
httpd 23124 apache txt REG 253,0 928892 4606756 /usr/local/apache/bin/httpd
httpd 23368 apache txt REG 253,0 928892 4606756 /usr/local/apache/bin/httpd
httpd 23412 apache txt REG 253,0 928892 4606756 /usr/local/apache/bin/httpd
httpd 24338 apache txt REG 253,0 928892 4606756 /usr/local/apache/bin/httpd
-c httpd オプションで、COMMANDが httpd であるプロセスのみを絞り込んで出力します。さらに、-d txt オプションで、FD (File Descriptor) が txt であるもののみを絞り込んでいます。
複数のオプションを AND で繋げるために、-a オプションを使っています。-a オプションなしで複数のオプションを並べた時は、それらは OR で繋げたものと見做されます。
この出力から、このサーバ上で動いている Apacheのフルパスが /usr/local/apache/bin/httpd であることがわかります。
Apacheの設定ファイルの場所を調べる
ここまでで、サーバ上で動いてるWebサーバが Apache であり、そのフルパスが /usr/local/apache/bin/httpd であることがわかりました。次にこの Apache の設定ファイルの場所を調べることにします。
通常であれば、設定ファイルは /usr/local/apache/conf/httpd.conf だと思われるのですが、設定ファイル等の位置はビルド時に変更することが出来るので、念の為ちゃんと調べることにします。
そのためには、httpd に -V オプションを指定して実行します。そうすると、バージョン番号やビルド時のオプション等を出力してくれます。
$ sudo /usr/local/apache/bin/httpd -V
Server version: Apache/2.2.29 (Unix)
...(略)...
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-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=128
-D HTTPD_ROOT="/usr/local/apache"
-D SUEXEC_BIN="/usr/local/apache/bin/suexec"
-D DEFAULT_PIDLOG="/var/run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="/var/run/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
この出力の HTTPD_ROOT というのが、この Apache の ServerRoot となり、全ての相対パスはこのディレクトリからの相対パスとなります。
SERVER_CONFIG_FILE というのが、この Apache の設定ファイルになります。”conf/httpd.conf” と、相対パスで指定されているので、HTTPD_ROOT と繋げて “/usr/local/apache/conf/httpd.conf” が設定ファイルであるということがわかります。
終わりに
今回紹介した内容の内、「接続先ポートをLISTENしているプロセスを特定する」部分に関しては、Apacheに限らず MySQL や sshd等でも汎用的に使える方法です。
その後の設定ファイルを特定する方法は、使っているプログラム毎にやり方が違って来るので、それぞれのマニュアル等を調べる必要があります。