Enabling gzip on Amazon Elastic Beanstalk Windows

2019-04-15 23:12发布

I cannot create a proper deployment package for AWS Elastic Beanstalk to enable gzip compression on Windows IIS environments.

I enabled in web config as described here. This worked only for static files, dynamic files are served as is.

Anybody have a solution for this?

Edit: There is another issue with IIS. It doesn't compress files requested from proxies and also serves the original file on the first request. This causes CDN's to serve uncompressed file because their endpoints caches the original file.

2条回答
趁早两清
2楼-- · 2019-04-15 23:39

After struggling 10 hours finally I came up with a solid solution.

AWS supports config files to modify the environment. They run before deploying application. http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html

So I created a config file to enable gzip on IIS, placed it to ".ebextensions/gzip.config" in my project folder.

Configuration in YAML format:

container_commands: 
     00-server-config:
       command: c:\windows\system32\inetsrv\appcmd set config /section:system.webServer/serverRuntime /frequentHitThreshold:1 /frequentHitTimePeriod:00:00:05
       waitAfterCompletion: 0
     01-server-config:
       command: c:\windows\system32\inetsrv\appcmd set config /section:system.webServer/httpCompression /noCompressionForHttp10:False /noCompressionForProxies:False
       waitAfterCompletion: 0
     02-gzip-dynamic: 
       command: c:\windows\system32\inetsrv\appcmd set config /section:urlCompression /doDynamicCompression:True
       waitAfterCompletion: 0
     03_gzip_static: 
       command: c:\windows\system32\inetsrv\appcmd set config /section:urlCompression /doStaticCompression:True
       waitAfterCompletion: 0
     04_restart_iis: 
       command: iisreset
       waitAfterCompletion: 0

There are some changes needed in web.config to system.webServer section:

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" noCompressionForHttp10="false" noCompressionForProxies="false">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
        <add mimeType="text/*" enabled="true"/>
        <add mimeType="message/*" enabled="true"/>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="application/x-javascript" enabled="true"/>
        <add mimeType="application/json; charset=utf-8" enabled="true"/>
        <add mimeType="*/*" enabled="false"/>
    </dynamicTypes>
    <staticTypes>
        <add mimeType="text/*" enabled="true"/>
        <add mimeType="message/*" enabled="true"/>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="application/x-javascript" enabled="true"/>
        <add mimeType="application/atom+xml" enabled="true"/>
        <add mimeType="application/xaml+xml" enabled="true"/>
        <add mimeType="*/*" enabled="false"/>
    </staticTypes>
</httpCompression>
<httpProtocol>
    <customHeaders>
        <remove name="Vary" />
        <add name="Vary" value="Accept-Encoding" />
    </customHeaders>
</httpProtocol>

With this two changes Elastic Beanstalk instances are prepared to serve compressed static and dynamic files. Also works with CDN.

查看更多
虎瘦雄心在
3楼-- · 2019-04-15 23:43
  1. If you don't have the compression roles setup see '00' below
  2. If your applicationHost.config disables changes in web.config:

      <section name="httpCompression" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
    

    I found it easiest to supplement the existing applicationHost.config dynamicTypes using '05''s below.


commands: 
  00-install-comp:
    command: powershell.exe -nologo -noprofile -command "& { Import-Module ServerManager; Add-WindowsFeature Web-Stat-Compression,Web-Dyn-Compression; }"
    waitAfterCompletion: 0
  01-server-config:
    command: c:\windows\system32\inetsrv\appcmd set config /section:system.webServer/serverRuntime /frequentHitThreshold:1 /frequentHitTimePeriod:00:00:05
    waitAfterCompletion: 0
  02-server-config:
    command: c:\windows\system32\inetsrv\appcmd set config /section:system.webServer/httpCompression /noCompressionForHttp10:False /noCompressionForProxies:False
    waitAfterCompletion: 0
  03-gzip-dynamic: 
    command: c:\windows\system32\inetsrv\appcmd set config /section:urlCompression /doDynamicCompression:True
    waitAfterCompletion: 0
  04_gzip_static: 
    command: c:\windows\system32\inetsrv\appcmd set config /section:urlCompression /doStaticCompression:True
    waitAfterCompletion: 0
  05_gzip_dyn_type_1:
    command: c:\windows\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json',enabled='True']" /commit:apphost
    waitAfterCompletion: 0
    ignoreErrors: true
  05_gzip_dyn_type_2:
    command: c:\windows\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost
    waitAfterCompletion: 0
    ignoreErrors: true
  06_restart_iis: 
    command: iisreset
    waitAfterCompletion: 0
查看更多
登录 后发表回答