server.xmlに手を入れる — コネクタ・セキュリティ・アクセスログ
目標
server.xmlの階層構造を理解し、コネクターの追加、終了ポートのセキュリティ対応、アクセスログのフォーマット変更、外部のdocBaseコンテキスト、レスポンス圧縮を、自分で設定できるようになります。
なぜ重要なのか
server.xmlは、SI現場で最も頻繁に開かれる設定ファイルです。ところが、ほとんどは「どこかで受け取ったファイルをコピーして、ポートだけを変える」方式で扱われています。その結果、終了ポートがデフォルトのまま本番に出て(セキュリティ点検の指摘の第1位)、アクセスログに応答時間がないため、「遅い」という報告に根拠を示せません。このラボでは、各属性が何を変えるのかを、自分で確認しながら身に付けます。
ステップ
- Tomcatを起動して、
/opt/tomcat/conf/server.xmlを/opt/tomcat/conf/server.xml.origにバックアップします。 server.xmlにポート8081のHTTPコネクターを追加して、再起動します。http://127.0.0.1:8081/が200である必要があります。Server要素のshutdown属性の値を、デフォルト(SHUTDOWN)ではない、8文字以上の別の文字列に変更します。Hostの中のAccessLogValveのpatternに、ミリ秒単位の処理時間を表す指定子を追加して再起動したあと、リクエストを1回送って、/opt/tomcat/logs/localhost_access_log.*.txtにログが残るようにします。/opt/tomcat/conf/Catalina/localhost/api.xmlを作成して、docBaseを/opt/lab/fixtures/tomcat/apiに指定します。再起動後、http://127.0.0.1:8080/api/index.htmlが200である必要があります。- ポート8080のコネクターで圧縮を有効にして、再起動します。
curl -H 'Accept-Encoding: gzip' -I http://127.0.0.1:8080/api/big.htmlのレスポンスヘッダーに、Content-Encoding: gzipがある必要があります。 /root/tc/validate.shを作成します。引数を1つ(XMLファイルのパス)受け取って、XMLが正常なら終了コード0、壊れているかファイルがなければ、0以外の値で終了します。/root/tc/serverxml.csvを作成します。1行目はelement,attribute,value,whyです。ステップ2–6で変更した設定5件を、それぞれ1行ずつ書きます。whyは15文字以上である必要があります。
参考
xmlstarlet sel -t -v "//Connector/@port" -n /opt/tomcat/conf/server.xmlで、値を確認できます- コンテキストファイルの例:
<Context docBase="/경로" />(プレースホルダーはパスです。1行で十分です) - よくあるミス1: XMLを直したあと、再起動しないミスです。server.xmlはホットリロードされません。
- よくあるミス2: コネクターを
Engineの中に入れるミスです。ConnectorはServiceの直接の子です。 - よくあるミス3: 圧縮が有効になっていないと思っているが、実はレスポンスが最小サイズより小さいだけ、というミスです。
原本のバックアップ
Tomcatを起動して、/opt/tomcat/conf/server.xmlを/opt/tomcat/conf/server.xml.origにバックアップします。
設定ファイルを直す前のバックアップは、交渉の対象ではありません。バックアップも、有効なXMLである必要があって初めて意味があります。
追加のコネクターの作成
server.xmlにポート8081のHTTPコネクターを追加して、再起動します。http://127.0.0.1:8081/が200である必要があります。
ConnectorはServiceの下に、複数置けます。既存のコネクターをコピーして、ポートだけを変えればよいです。反映は再起動後です。
終了コマンドの変更
Server要素のshutdown属性の値を、デフォルト(SHUTDOWN)ではない、8文字以上の別の文字列に変更します。
Server要素のshutdown属性がデフォルトなら、ポート8005に接続できる誰でも、WASを停止できます。セキュリティ点検の常連項目です。
アクセスログに応答時間を追加する
Hostの中のAccessLogValveのpatternに、ミリ秒単位の処理時間を表す指定子を追加して再起動したあと、リクエストを1回送って、/opt/tomcat/logs/localhost_access_log.*.txtにログが残るようにします。
AccessLogValveのpatternに、処理時間を表す指定子を追加します。ミリ秒単位の指定子と、秒単位の指定子が別にあるので、ドキュメントを確認してください。再起動後にリクエストを1回送ると、ログができます。
webappsの外のディレクトリをサービスする
/opt/tomcat/conf/Catalina/localhost/api.xmlを作成して、docBaseを/opt/lab/fixtures/tomcat/apiに指定します。再起動後、http://127.0.0.1:8080/api/index.htmlが200である必要があります。
conf/Catalina/localhost/の下にコンテキスト名.xmlを置くと、その名前がコンテキストパスになり、docBaseで任意のパスを指せます。
コネクターの圧縮設定
ポート8080のコネクターで圧縮を有効にして、再起動します。curl -H 'Accept-Encoding: gzip' -I http://127.0.0.1:8080/api/big.htmlのレスポンスヘッダーに、Content-Encoding: gzipがある必要があります。
Connector属性で圧縮を有効にします。最小サイズの基準があるので、小さなレスポンスは圧縮されません。クライアントがAccept-Encodingを送る必要があることも、忘れないでください。
設定の検証スクリプト
/root/tc/validate.shを作成します。引数を1つ(XMLファイルのパス)受け取って、XMLが正常なら終了コード0、壊れているかファイルがなければ、0以外の値で終了します。
デプロイ前に、XMLが壊れていないかを確認するスクリプトです。引数として受け取ったファイルを検証して、終了コードで知らせるようにすれば、自動化に使えます。xmlstarletやpythonのうち、使いやすいものを使ってください。
変更内容の文書化
/root/tc/serverxml.csvを作成します。1行目はelement,attribute,value,whyです。ステップ2–6で変更した設定5件を、それぞれ1行ずつ書きます。whyは15文字以上である必要があります。
設定の変更は、必ず「何を、なぜ」を一緒に残します。6か月後にこの値を戻そうとする人に必要なのは、値ではなく理由です。