AWS Elastic Beanstalk Tomcat プラットフォームを使用する

AWS Elastic Beanstalkを使ってTomcatを動かします。その際にApacheもしくはnginxをプロキシサーバーとして指定することができるようになっています。

また、オプションとしてStaticファイルの指定、Gzipの有効化ができるようになっています。

Gzipの指定

.ebextensions/tomcat-settings.config

option_settings:
  - namespace:  aws:elasticbeanstalk:environment:proxy
    option_name: GzipCompression
    value: true

のように指定すると、インスタンス上の設定が以下のようになります。

/etc/httpd/conf.d/elasticbeanstalk/01_gzip.conf

  AddOutputFilterByType DEFLATE text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript

静的ファイルの指定

.ebextensions/tomcat-settings.config

option_settings:
  - namespace:  aws:elasticbeanstalk:environment:proxy:staticfiles
    option_name: /images
    value: images
  - namespace:  aws:elasticbeanstalk:environment:proxy:staticfiles
    option_name: /static
    value: static

のように指定すると以下のファイルが自動生成されます。

/etc/httpd/conf.d/elasticbeanstalk/02_static.conf

#Elastic Beanstalk Managed
ProxyPass /images !
Alias /images /var/lib/tomcat7/webapps/ROOT/images
<Directory /var/lib/tomcat7/webapps/ROOT/images>
  Order allow,deny
  Allow from all
</Directory>

ProxyPass /static !
Alias /static /var/lib/tomcat7/webapps/ROOT/static
<Directory /var/lib/tomcat7/webapps/ROOT/static>
  Order allow,deny
  Allow from all
</Directory>

ただし手元の環境ではContet-Typeの指定がおかしくなりました。

/etc/httpd/conf/httpd.conf

に対して以下を追記しました。

LoadModule mime_module modules/mod_mime.so
TypesConfig /etc/mime.types

追記の仕方としてはファイルを置き換える方法しかないようです。

Beanstalkのベースとなるhttpd.confはだいぶスッキリしています。

/etc/httpd/conf/httpd.conf

# Managed by Elastic Beanstalk
PidFile run/httpd.pid

# Enable TCP keepclive
Timeout 60
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 60

<IfModule worker.c>
StartServers        10
MinSpareThreads     250
MaxSpareThreads     250
ServerLimit         10
MaxClients          250
MaxRequestsPerChild 1000000
</IfModule>

Listen 80

Include conf.d/*.conf
Include conf.d/elasticbeanstalk/*.conf

User apache
Group apache

CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
TraceEnable off

LoadModule alias_module modules/mod_alias.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule cache_module modules/mod_cache.so

これをもとに

ServerSignature On
ServerTokens Prod

などカスタマイズしたものを

.ebextensions/httpd/conf/httpd.conf

においておけば上書きされます。

また独自の拡張confを用意する場合には

.ebextensions/httpd/conf.d/hoge.conf

に置けばいいようです。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/java-tomcat-platform.html

に詳しい内容が記載されています。

なお

.ebextensions/httpd/

にファイルを置き始めると、フォルダをごそっと上書きした上で 00_application.conf 01_gzip.conf 02_static.conf を生成するっぽいので、

.ebextensions/httpd/conf.d/elasticbeanstalk_log.conf

LogFormat "%h (%{X-Forwarded-For}i) %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" eb_access_log_format
CustomLog /var/log/httpd/elasticbeanstalk-access_log eb_access_log_format

もおいておく必要があります。

Beanstalkは設定の書き換え後の反映サイクルに時間がかかるのでつらい。。。