Enabling gzip on Amazon Elastic Beanstalk Windows environment

风格不统一 提交于 2019-12-04 18:17:58
Kerem Demirer

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.

  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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!