複数台構成のEC2上のapacheサーバからDocumentRootを特定する
あるパスで静的ファイルを公開しようと思った際に詰まったので備忘録として
以下のような環境です
- プラットフォームは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.com
はpiyopiyo.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構成にしましょう
「コストガー」って人がいるけど、開発・保守・運用・管理コスト等総合的に考えればサーバレス構成がコスパダントツなのは自明ですね。