Every time I create an IIS website, I do some steps, which I
consider as best practice for creating any IIS website for better
performance, maintainability, and scalability. Here’ re the things
Create a separate application pool for each web
I always create separate app pool for each web app because I can
select different schedule for app pool recycle. Some heavy traffic
websites have long recycle schedule where low traffic websites have
short recycle schedule to save memory. Moreover, I can choose
different number of processes served by the app pool. Applications
that are made for web garden mode can benefit from multiple process
where applications that use in-process session, in memory cache
needs to have single process serving the app pool. Hosting all my
application under the DefaultAppPool does not give me the
flexibility to control these per site.
The more app pool you create, the more ASP.NET threads you make
available to your application. Each w3wp.exe has it’s own
thread pool. So, if some application is congesting particular
w3wp.exe process, other applications can run happily on
their separate w3wp.exe instance, running under separate app
pool. Each app pool hosts its own w3wp.exe instance.
So, my rule of thumb: Always create new app pool for new web
applications and name the app pool based on the site’s domain name
or some internal name that makes sense. For example, if you are
creating a new website alzabir.com, name the app pool alzabir.com
to easily identify it.
Another best practice: Disable the DefaultAppPool so that
you don’t mistakenly keep adding sites to
height="340" alt="image" src=
First you create a new application pool. Then you create a new
Website or Virtual Directory, go to Properties -> Home Directory
tab -> Select the new app pool.
height="501" alt="image" src=
Customize Website properties for performance,
scalability and maintainability
First you map the right host headers to your website. In order
to do this, go to WebSite tab and click on “Advanced” button. Add
mapping for both domain.com and "http://www.domain.com">www.domain.com. Most of the time,
people forget to map the domain.com. Thus many visitors skip typing
the www prefix and get no page served.
height="493" alt="image" src=
Next turn on some log entries:
height="458" alt="image" src=
These are very handy for analysis. If you want to measure your
bandwidth consumption for specific sites, you need the Bytes Sent.
If you want to measure the execution time of different pages and
find out the slow running pages, you need Time Taken. If you want
to measure unique and returning visitors, you need the Cookie. If
you need to know who is sending you most traffic – search engines
or some websites, you need the Referer. Once these entries are
turned on, you can use variety of Log Analysis tools to do the
analysis. For example, "http://awstats.sourceforge.net/">open source AWStats.
But if you are using Google Analytics or something else, you
should have these turned off, especially the Cookie and Referer
because they take quite some space on the log. If you are using
ASP.NET Forms Authentication, the gigantic cookie coming with every
request will produce gigabytes of logs per week if you have a
medium traffic website.
height="269" alt="image" src=
This is kinda no brainer. I add Default.aspx as the default
content page so that, when visitors hit the site without any .aspx
page name, e.g. alzabir.com, they get the default.aspx served.
height="461" alt="image" src=
Things I do here:
- Turn on Content Expiration. This makes static files remain in
browser cache for 30 days and browser serves the files from its own
cache instead of hitting the server. As a result, when your users
revisit, they don’t download all the static files like images,
significantly improves your site’s performance.
- Remove the X-Powered-By: ASP.NET header. You really
don’t need it unless you want to attach Visual Studio Remote
Debugger to your IIS. Otherwise, it’s just sending 21 bytes on
- Add “From” header and set the server name. I do this on each
webserver and specify different names on each box. It’s handy to
see from which servers requests are being served. When you are
trying to troubleshoot load balancing issues, it comes handy to see
if a particular server is sending requests.
height="465" alt="image" src=
I set the 404 handler to some ASPX so that I can show some
custom error message. There’s a 404.aspx which shows some nice
friendly message and suggests some other pages that user can visit.
However, another reason to use this custom mapping is to serve
extensionless URL from IIS. "http://msmvps.com/blogs/omar/archive/2007/04/29/serve-extensionless-url-from-asp-net-without-using-isapi-module-or-iis-6-wildcard-mapping.aspx">
Read this blog post for details.
height="459" alt="image" src=
Make sure to set ASP.NET 2.0 for your ASP.NET 2.0, 3.0 and 3.5
Finally, you must, I repeat you “MUST”
turn on IIS 6.0 gzip compression. This turns on the Volkswagen
V8 engine that is built into IIS to make your site screaming