複数台構成のEC2上のapacheサーバからDocumentRootを特定する

公開:2020/09/29
更新:2020/09/29
5 min読了の目安(約3500字TECH技術記事

あるパスで静的ファイルを公開しようと思った際に詰まったので備忘録として
以下のような環境です

  • プラットフォームはAWS
  • 公開LB→WEBサーバ(冗長構成)→非公開LB→APサーバ(冗長構成)

そして以下のような条件です

  • あるパスに指定のテキストを配置してインターネットから見たいとの要求
  • あるパスとは https://hogehoge.com/hoge/fuga/piyo.txt
  • 公開LBだけわかってる
  • DocumentRootは不明

対応手順

1.公開LBの登録EC2インスタンス・転送ポートを確認する

公開LBの名前でAWSコンソール(ELB)から検索
対象インスタンスhoge-web-01と転送ポート10446が判明

2.起動中のhttpdの設定ファイルがどれか特定する

EC2インスタンスにSSMでログイン

[ssm-user@hoge-web-01 /]$ ps aux | grep httpd | grep -v grep
apache     956  0.0  0.8 313316 31284 ?        S    06:52   0:00 /usr/sbin/httpd
#################略########################

/usr/sbin/httpdが起動中のプロセスと判明したので設定ファイルパスを確認

[ssm-user@hoge-web-01 /]$ /usr/sbin/httpd -V | grep -e HTTPD_ROOT -e SERVER_CONFIG_FILE
 -D HTTPD_ROOT="/etc/httpd"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

/etc/httpd/conf/httpd.confと判明
※ここですぐconfのDocumentRootを見ないこと、変にリダイレクトとかされてる可能性あり。
私はここで1h無駄にしました

3.VirtualHostがないか確認する

「vhost」系のモジュールが読み込まれていれば、VirtualHost設定の可能性大
Includeから始まるvhost系設定ファイルのパスが出力されればそちらを参照

[ssm-user@hoge-web-01 /]$ cat /etc/httpd/conf/httpd.conf | grep -v "#" | grep -e vhost
LoadModule vhost_alias_module modules/mod_vhost_alias.so

パスが記載なかったが、まだ安心してはいけない
/etc/httpd/conf.d/があればVirtualHost設定が配下でされてる可能性大

[ssm-user@hoge-web-01 /]$ ls /etc/httpd/conf.d/
/etc/httpd/conf.d/

存在した
ので、「1.公開LBの登録EC2インスタンス・転送ポートを確認する」で特定したインスタンスポート「10446」が含まれている部分を確認する

[ssm-user@hoge-web-01 /]$ cat /etc/httpd/conf.d/httpd-vhosts.conf | grep -v '^\s*#' | grep -v '^\s*$' | less
# 10466で検索
# <VirtualHost>でかこまれた箇所が対象、以下抜粋
<VirtualHost AAA.AAA.AAA.AAA:10446>
    <Location "/">
        ProxyPass http://fugafuga.com:8443/
        ProxyPassReverse http://fugafuga.com:8443/
    </Location>
</VirtualHost>

fugafuga.com:8443に転送されているらしい。

4.転送先ドメインのリソースを特定する

ちなみにAWSコンソールではfugafuga.com:8443を調べることができなかった。
ので、名前で引いてみた

[ssm-user@hoge-web-01 /]$ nslookup fugafuga.com
Server:         BBB.BBB.BBB.BBB
Address:        BBB.BBB.BBB.BBB#53

fugafuga.com  canonical name = piyopiyo.com.
piyopiyo.com        canonical name = internal-HOGE-INTERNAL-01-012345678.ap-northeast-1.elb.amazonaws.com.
Name:   internal-HOGE-INTERNAL-01-012345678.ap-northeast-1.elb.amazonaws.com
Address: CCC.CCC.CCC.CCC
Name:   internal-HOGE-INTERNAL-01-012345678.ap-northeast-1.elb.amazonaws.com
Address: DDD.DDD.DDD.DDD

内部DNSで解決しているようです
CNAMEですね
fugafuga.compiyopiyo.comらしく
HOGE-INTERNAL-01というLBに飛ぶ様子。

5.1~4を繰り返す

ということでLBがわかったので
「1.公開LBの登録EC2インスタンス・転送ポートを確認する」の手順からやり直しAPサーバも確認

6.DocumentRootの特定

APサーバには
httpd.confに「vhost」系の設定なかったし
/etc/httpd/conf.d/もなかったので
無事はれてDocumentRootの設定を確認

[ssm-user@hoge-ap-01 /]$ cat /etc/httpd/conf/httpd.conf | grep -v "#" | grep -e "DocumentRoot"
DocumentRoot "/var/www/html"

無事判明

7.ファイルの配置&疎通確認

DocumentRoot以下はreadできればとりあえずいいので適当につくってもOK

[ssm-user@hoge-ap-01 /]$ mkdir -p /var/www/html/hoge/fuga/
[ssm-user@hoge-ap-01 /]$ touch /var/www/html/hoge/fuga/piyo.txt
[ssm-user@hoge-ap-01 /]$ sudo echo "こんにちはー" | sudo tee /var/www/html/hoge/fuga/piyo.txt

あとはブラウザでhttps://hogehoge.com/hoge/fuga/piyo.txt叩いて「こんにちはー」ってでればOK!

所感

昔は複数ドメインを1サーバで対応する節約構成が流行ってたんでしょうね。。。。。
でも今はクラウド時代。よっぽどの理由がなければサーバレスにしましょう。
本質じゃないことは全部お金払ってマネージドで任せましょう。

  • 特殊な要件がない限りWEBサーバやロードバランサをやめてALBに任せましょう
  • 名前解決やルーティングはRoute53に任せましょう
  • APもAPIGateway+Lambda構成にしましょう

「コストガー」って人がいるけど、開発・保守・運用・管理コスト等総合的に考えればサーバレス構成がコスパダントツなのは自明ですね。