Avkash Chauhan's Blog

Windows Azure, Windows 8, Cloud Computing, Big Data and Hadoop: All together at one place.. One problem, One solution at One time...

Enableing gzip compression with Windows Azure CDN through Web Role

Enableing gzip compression with Windows Azure CDN through Web Role

Rate This
  • Comments 3

CDN picks up compression from the origin and Windows Azure Storage does not support compression directly so if you get CDN content from Azure Storage origin, it will not be compressed.  So if you have content hosted at Windows Azure Storage you will not be able to have compressed content. To have compressed content, you would need to host the content at hosted service such as web role as origin.   As this type of origin would be IIS based, is a supported way to use  compression.

Windows Azure CDN supports compressed content over HTTP1.0, and most of the time the problem I have seen are related with having an HTTP 1.0 vs HTTP 1.1 issue. So when you request you CDN object directly from your web role via HTTP 1.0 (using the wget command) you should get compressed content if all is correct. If you get non-compressed content then you know where the problem is. Please be sure you’ve configured your application and IIS itself to deliver compressed content to HTTP 1.0 clients as well as HTTP 1.1 clients.

So if you decided to use Web Role for compress CDN original here are the steps to enable compression:

 

[Step 1] Please add the following elevated startup task in your ServiceDefinition.csdef:

       <Task commandLine="StartupTasks\ChangeIisDefaults.cmd" executionContext="elevated" taskType="simple" />

 

[Step 2] Here is the ChangeIisDefaults.cmd script as below:

 

%windir%\system32\inetsrv\appcmd set config -section:httpCompression -noCompressionForHttp10:false

%windir%\system32\inetsrv\appcmd set config -section:httpCompression -noCompressionForProxies:false

 

[Step 3] Please add the following code in your web role OnStart() event:

 

using Microsoft.Web.Administration;
using (var serverManager = new ServerManager()) 
{
            Configuration config = serverManager.GetApplicationHostConfiguration();
 
            ConfigurationSection serverRuntimeSection = config.GetSection("system.webServer/serverRuntime", "");
            serverRuntimeSection["enabled"] = true;
            serverRuntimeSection["frequentHitThreshold"] = 1;
            serverRuntimeSection["frequentHitTimePeriod"] = TimeSpan.Parse("00:00:10");
            serverManager.CommitChanges();
}
 

When the CDN endpoint has gzip compression enabled, in the fiddler log you will see the following header info:

Accept-Ranges:bytes

Cache-Control:max-age=31536000

Content-Encoding:gzip

Content-Length:XXXXX

Content-Type:text/css

Date:Tue, 12 Jan 2012 22:26:26 GMT

ETag:"1d560a2645cc345:0"

Last-Modified:Tue, 12 Jan 2012 22:24:15 GMT

Server:Microsoft-IIS/7.5

Vary:Accept-Encoding

X-Powered-By:ASP.NET

 

Setting “Enable Query String” flag:

By having "Enable query string" flag set on the CDN endpoint you can assure that content will be considered new and new values in the querystring will considered new request and update the CDN with new content. This way new values in the querystring be considered new requests and using random value in the querystring, that should go all the way back to the origin server again.

If you don’t have “enable Query String” flag set then you would need to request Azure CDN team to manually purge to content as there are no customer specific API to do purge old cached CDN content. 

Leave a Comment
  • Please add 3 and 2 and type the answer here:
  • Post
  • After adding a reference to Microsoft.Web.Administration and inserting the above code into OnStart you get endless cycling of the role on start and a failed deployment.

  • My web role is returning compressed content for http 1.0 because of this article, but my CDN is not returning compressed content still.  The one line that was not explained well was: "When the CDN endpoint has gzip compression enabled".  How do you do that?  I'm not seeing it anywhere.

  • Adding <Runtime executionContext="elevated" /> to the role in the service definition file allowed the code in OnStart to run.

Page 1 of 1 (3 items)