在运行ElasticBeanstalk Tomcat实例

时间:2017-01-14 01:00:10

标签: amazon-web-services tomcat spring-boot elastic-beanstalk

我已将Spring Boot REST应用程序作为WAR部署到AWS Elastic Beanstalk Tomcat 8 + Java 8实例中。随后,我意识到我需要配置以下设置(适用于Tomcat server.xml):

compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/css,..."

因为Spring Boot中的application.properties仅适用于嵌入式Tomcat容器。现在更改Elastic Beanstalk实例的平台类型为时已晚。有没有办法使用eb config从Elastic Beanstalk CLI更新配置?我正在看这个AWS page,看起来有可能。

2017年1月16日更新 感谢@ dave-maple的回答,我开始查看Elastic Beanstalk文档的相关部分。

首先,我发现Apache是​​默认的代理服务器。我本来可以把它改成nginx,但我没有任何特别的理由走这条路。

其次,我发现在我的Spring Boot项目的顶层添加了一个.ebextensions文件夹。我不想用云提供商特定的配置文件污染我的代码库,但它似乎是最低级的结果。所以我去了。

我添加了以下层次结构:

MySpringBootProject
 |
 +- src
     |
     +- main
         |
         +- resources
             |
             +- ebextensions
                 |
                 +- httpd
                 |   |
                 |   +- conf.d
                 |       |
                 |       +- enable_mod_deflate.conf
                 |
                 +- myapp.config
                 |
                 +- tomcat-settings.config

tomcat-settings.config

的内容
option_settings:
  aws:elasticbeanstalk:environment:proxy:
    GzipCompression: 'true'

myapp.config

的内容
container_commands:
05-restart-apache:
    command: "sudo /etc/init.d/httpd restart"

的内容 enable_mod_deflate.conf

# mod_deflate configuration
<IfModule mod_deflate.c>
  # Restrict compression to these MIME types
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE text/xml
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE application/xml+rss
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE image/png
  AddOutputFilterByType DEFLATE image/gif
  AddOutputFilterByType DEFLATE image/jpeg

  # Level of compression (Highest 9 - Lowest 1)
  DeflateCompressionLevel 9

  # Netscape 4.x has some problems.
  BrowserMatch ^Mozilla/4 gzip-only-text/html

  # Netscape 4.06-4.08 have some more problems
  BrowserMatch ^Mozilla/4\.0[678] no-gzip

  # MSIE masquerades as Netscape, but it is fine
  BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

  <IfModule mod_headers.c>
    # Make sure proxies don't deliver the wrong content
    Header append Vary User-Agent env=!dont-vary
  </IfModule>
</IfModule>

将以下行添加到 pom.xml (在生成的WAR文件的顶层设置.ebextensions文件夹):

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <webResources>
            <resource>
                <directory>src/main/resources/ebextensions</directory>
                <targetPath>.ebextensions</targetPath>
                <filtering>true</filtering>
            </resource>
        </webResources>
    </configuration>
</plugin>

我本可以发誓这是有效的,因为我只看了几次Content-Encoding: gzip响应标题。知道会发生什么吗?

1 个答案:

答案 0 :(得分:1)

实现压缩的最佳方法是在tomcat前运行的nginx代理。 nginx在此操作中更有效。为此,您可以在部署档案库的根目录中创建.ebextensions目录,并添加nginx-proxy.config文件,如下所示:

<强> .ebextensions / nginx的-proxy.config

option_settings:
  aws:elasticbeanstalk:environment:proxy:
    GzipCompression: 'true'
    ProxyServer: nginx

然后,您可以在Elastic Beanstalk上构建和部署新版本的应用程序。

如果您在推出新版本时需要避免停机,可以使用rolling deployment(在部署新版本之前从LB中获取实例)甚至blue/green deployment (a new environment + cname swap)

===编辑===

您可能需要自定义nginx将gzip的Content-Type值。

要gzip所有内容,请在.ebextensions:

中创建配置文件

<强> .ebextensions / gzip.config

files:
  /etc/nginx/conf.d/gzip.conf:
    content: |
      gzip_types *;

或更具选择性,定义您想要压缩的类型:

<强> .ebextensions / gzip.config

files:
  /etc/nginx/conf.d/gzip.conf:
    content: |
      gzip_types text/plain text/css application/json application/x-javascript text/xml;