 <?xml-stylesheet type="text/css" href="https://www.esdm.co.uk/Data/style/rss1.css" ?> <?xml-stylesheet type="text/xsl" href="https://www.esdm.co.uk/Data/style/rss1.xsl" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
  <channel>
    <title>The knowledge base blog</title>
    <link>https://www.esdm.co.uk/knowledge</link>
    <description />
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>mojoPortal Blog Module</generator>
    <language>en-GB</language>
    <ttl>120</ttl>
    <atom:link href="https://www.esdm.co.uk/Blog/RSS.aspx?p=138~108~17" rel="self" type="application/rss+xml" />
    <itunes:owner />
    <itunes:explicit>no</itunes:explicit>
    <item>
      <title>How to change the port for GeoServer on Windows with Jetty</title>
      <description><![CDATA[<p>Faced with the task of upgrading a production GeoServer under heavy constant use, I decided to install the newer version alongside first, migrate the content, then make the switch when I was happy everything was working. I installed the new GeoServer 2.7.0 using the Windows installer, choosing port 8081 (the old version was running on port 8080), and electing to run it as a service. I cloned the data directory and pointed the new version at the new copy. Once the SQL Server extension was installed, everything appeared to be working fine – all layers working well. The only problem I could see was the the disk quota functionality was failing with visible warning messages in the GeoServer admin interface, and I guessed that this was probably because two different versions could not use the same disk quota database (this turned out to be correct).</p>

<p>The next step was to switch off the old version of GeoServer and present the new version on its address, minimising transition time. This required changing the port of the new version from 8081 to 8080, so I scoured the internet on how to do this. I found a few threads out there, but none gave me the right answer. They specifically mentioned \etc\jetty.xml and GeoServer’s startup.bat, neither of which configured the port for my installation. In fact the configuration is to be found against the Windows service:</p>

<p><img alt="GeoServer Windows service" border="0" height="427" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_143.png" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" title="GeoServer Windows service" width="644" /></p>

<p>Opening this service reveals the port specified in the command line (here showing after I had changed it):</p>

<p><img alt="GeoServer service commandline" border="0" height="465" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_144.png" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" title="GeoServer service commandline" width="414" /></p>

<p style="width:100%; white-space: pre-wrap;">Changing this command required editing the registry, with these settings found under HKEY_LOCAL_MACHINE\SYSTEM\ ControlSet001\services\GeoServer 2.7.0:</p>

<p><img alt="GeoServer service registry settings" border="0" height="272" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_145.png" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" title="GeoServer service registry settings" width="644" /></p>

<p>Edit the command-line as follows:</p>

<p><img alt="GeoServer service command" border="0" height="166" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_146.png" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" title="GeoServer service command" width="388" /></p>

<p>I also edited the previous version to start on port 8081 (in case I needed to run both), then stopped the older version’s service and restarted the new version’s service. Everything worked fine, with an imperceptible transition. And as predicted, the disk quota thing started working too.</p>

<p>So that’s how to change the port for GeoServer running on Windows with Jetty!</p>
<br /><a href='https://www.esdm.co.uk/how-to-change-the-port-for-geoserver-on-windows-with-jetty'>Crispin Flower</a>&nbsp;&nbsp;<a href='https://www.esdm.co.uk/how-to-change-the-port-for-geoserver-on-windows-with-jetty'>...</a>]]></description>
      <link>https://www.esdm.co.uk/how-to-change-the-port-for-geoserver-on-windows-with-jetty</link>
      <author>crispin.flower@idoxgroup.com (Crispin Flower)</author>
      <comments>https://www.esdm.co.uk/how-to-change-the-port-for-geoserver-on-windows-with-jetty</comments>
      <guid isPermaLink="true">https://www.esdm.co.uk/how-to-change-the-port-for-geoserver-on-windows-with-jetty</guid>
      <pubDate>Sun, 19 Apr 2015 13:23:00 GMT</pubDate>
    </item>
    <item>
      <title>How to hide the MapServer map file location on IIS (without writing any code)</title>
      <description><![CDATA[<p>We posted some notes a few days ago on <a href="https://www.esdm.co.uk/how-to-install-the-latest-version-of-mapserver-on-windows" target="_blank">how to set up MapServer WMS/WFS server on IIS</a>. Someone called Dennis has commented appreciatively, but asked how to hide the location of the .map file and <a href="http://mapserver.org/ogc/wms_server.html#changing-the-online-resource-url" target="_blank">create a cleaner URL with a cgi-wrapper, as described in the MapServer documentation</a>. Well that documentation page does tell you how to do it on IIS, with ASP script, but here’s a much simpler way that requires no hacking.</p>

<p>Aside: I should say that what follows is not what we normally do in our real applications – we usually use ASP.Net .ashx handlers to relay requests through the root of our web sites, which also helps to avoid cross-domain problems with GetFeatureInfo responses and WFS, but that’s another story! This post is in reaction to Dennis’s request for help, and because I wanted to check this approach is viable.</p>

<p>I’ve posted before on <a href="https://www.esdm.co.uk/presenting-geoserver-on-port-80-on-a-windows-iis-server" target="_blank">how to use URL Rewrite to give GeoServer a friendly URL on IIS</a>, and we’re going to use the same technique here, so first ensure you have the necessaries installed.</p>

<p>You should also already have a working WMS/WFS – we created this one in the previous post:</p>

<p><a href="http://mapservertest.esdm.co.uk/scripts/mapserv.exe?map=D:\Websites\mapservertest\map\mapfiletest.map" title="http://mapservertest.esdm.co.uk/scripts/mapserv.exe?map=D:\Websites\mapservertest\map\mapfiletest.map">http://mapservertest.esdm.co.uk/scripts/mapserv.exe?map=D:\Websites\mapservertest\map\mapfiletest.map</a></p>

<p>which was fine, but a) the URL reveals some information about the structures on the web server, and b) the URL is a bit ugly.</p>

<p>So decide what address you want for your MapServer service (remembering this will be specific right down to the map file). I’m using “mapservertestwrapper.esdm.co.uk” which I have pointed at the web server in question.</p>

<p>Create a new web site in IIS with this URL as a host header (you’ll first need to create an empty “physical” folder for the site to point at – add a readme.config file explaining what it’s for).</p>

<p>Now open URL Rewrite and create a reverse proxy inbound rule, entering the real service address as the forwarding address:</p>

<p><img alt="Creating the reverse proxy inbound rule" border="0" height="480" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_97.png" style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Creating the reverse proxy inbound rule" width="476" /></p>

<p>OK now we should be able to see our MapServer on the new URL. However, when we visit <a href="http://mapservertestwrapper.esdm.co.uk/" title="http://mapservertestwrapper.esdm.co.uk/">http://mapservertestwrapper.esdm.co.uk/</a> we get this feedback in the browser:</p>

<p>msLoadMap(): Regular expression error. MS_DEFAULT_MAPFILE_PATTERN validation failed. msEvalRegex(): Regular expression error. String failed expression test.</p>

<p>The fix is to re-edit the inbound rule, and remove the final “/” in the “rewrite URL”, going from:</p>

<p>http://mapservertest.esdm.co.uk/scripts/mapserv.exe?map=D:\Websites\mapservertest\map\mapfiletest.map/{R:1}</p>

<p>to:</p>

<p>http://mapservertest.esdm.co.uk/scripts/mapserv.exe?map=D:\Websites\mapservertest\map\mapfiletest.map{R:1}</p>

<p>Now we should get sensible MapServer feedback in the browser (conditioned by a template specified in the map file).</p>

<p>Now let’s see if we can do a GetCapabilities request… turns out our URL has to be this:</p>

<p><a href="http://mapservertestwrapper.esdm.co.uk/?service=wms&amp;version=1.3.0&amp;request=getcapabilities" title="http://mapservertestwrapper.esdm.co.uk/?service=wms&amp;version=1.3.0&amp;request=getcapabilities">http://mapservertestwrapper.esdm.co.uk/?service=wms&amp;version=1.3.0&amp;request=getcapabilities</a></p>

<p>Yes it works, but a) that’s a slightly odd URL with “/?”, and b) the response contains the original service addresses, again revealing information about our server.</p>

<p>To fix a), we go back and edit our inbound rule again, and change the “pattern” from “(.*)” to “map1(.*)” (without the quotes of course). Now our service URL becomes:</p>

<p><a href="http://mapservertestwrapper.esdm.co.uk/map1?service=wms&amp;version=1.3.0&amp;request=getcapabilities" title="http://mapservertestwrapper.esdm.co.uk/map1?service=wms&amp;version=1.3.0&amp;request=getcapabilities">http://mapservertestwrapper.esdm.co.uk/map1?service=wms&amp;version=1.3.0&amp;request=getcapabilities</a></p>

<p>Ah yes that’s much nicer, and now of course we see we can manage lots of .map files within one web site simply by setting up in inbound rule for each, with an appropriate pattern and target.</p>

<p>To fix b) we can edit the metadata in the .map file to set this:</p>

<p>"wms_onlineresource"&nbsp;&nbsp;&nbsp; "http://mapservertestwrapper.esdm.co.uk/map1"</p>

<p>This works fine, returning this within the GetCapabilities:</p>

<p><a>&lt;OnlineResource xlink:href="http://mapservertestwrapper.esdm.co.uk/map1?" xmlns:xlink="http://www.w3.org/1999/xlink"/&gt;</a></p>

<p>And I can confirm this creates a working map in QGIS, with map requests like this <a href="https://www.esdm.co.uk/inspecting-web-service-requests-from-quantum-gis-with-fiddler" target="_blank">visible in Fiddler</a>:</p>

<p><a href="http://mapservertestwrapper.esdm.co.uk/map1?SERVICE=WMS&amp;VERSION=1.3.0&amp;REQUEST=GetMap&amp;BBOX=52801.44371538766426966,3347.3560407145996578,657116.82161524775438011,428145.51874091033823788&amp;CRS=EPSG:27700&amp;WIDTH=1020&amp;HEIGHT=717&amp;LAYERS=grid&amp;STYLES=&amp;FORMAT=image/png&amp;DPI=96&amp;MAP_RESOLUTION=96&amp;FORMAT_OPTIONS=dpi:96&amp;TRANSPARENT=TRUE" title="http://mapservertestwrapper.esdm.co.uk/map1?SERVICE=WMS&amp;VERSION=1.3.0&amp;REQUEST=GetMap&amp;BBOX=52801.44371538766426966,3347.3560407145996578,657116.82161524775438011,428145.51874091033823788&amp;CRS=EPSG:27700&amp;WIDTH=1020&amp;HEIGHT=717&amp;LAYERS=grid&amp;STYLES=&amp;FORMAT=image/png&amp;DPI=96&amp;MAP_RESOLUTION=96&amp;FORMAT_OPTIONS=dpi:96&amp;TRANSPARENT=TRUE&#10;">http://mapservertestwrapper.esdm.co.uk/map1?SERVICE=WMS&amp;VERSION=1.3.0&amp;REQUEST=GetMap&amp;BBOX=52801.44371538766426966,3347.3560407145996578,657116.82161524775438011,428145.51874091033823788&amp;CRS=EPSG:27700&amp;WIDTH=1020&amp;HEIGHT=717&amp;LAYERS=grid&amp;STYLES=&amp;FORMAT=image/png&amp;DPI=96&amp;MAP_RESOLUTION=96&amp;FORMAT_OPTIONS=dpi:96&amp;TRANSPARENT=TRUE</a></p>

<p><img alt="image" border="0" height="426" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_98.png" style="border: 0px currentColor; border-image: none; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="image" width="640" /></p>

<p>And a quick test shows that info clicking (GetFeatureInfo) and legends work too:</p>

<p>e.g. <a href="http://mapservertestwrapper.esdm.co.uk/map1?version=1.3.0&amp;service=WMS&amp;request=GetLegendGraphic&amp;sld_version=1.1.0&amp;layer=grid&amp;format=image/png&amp;STYLE=default" title="http://mapservertestwrapper.esdm.co.uk/map1?version=1.3.0&amp;service=WMS&amp;request=GetLegendGraphic&amp;sld_version=1.1.0&amp;layer=grid&amp;format=image/png&amp;STYLE=default">http://mapservertestwrapper.esdm.co.uk/map1?version=1.3.0&amp;service=WMS&amp;request=GetLegendGraphic&amp;sld_version=1.1.0&amp;layer=grid&amp;format=image/png&amp;STYLE=default</a></p>

<p>gives this:</p>

<p><img alt="GetLegendGraphic image" src="http://mapservertestwrapper.esdm.co.uk/map1?version=1.3.0&amp;service=WMS&amp;request=GetLegendGraphic&amp;sld_version=1.1.0&amp;layer=grid&amp;format=image/png&amp;STYLE=default" title="GetLegendGraphic image" /></p>

<p>There you go Dennis, we have working OGC services from MapServer with nice clean URLs, a simple architecture for adding new services with their own map files, and no leaking of details about our directory structures.</p>

<p>&nbsp;</p>

<h3>Footnote…</h3>

<p>I’m not completely keen on the last bit, having to change the wms_onlineresource, as this means the original service is now broken (depending on whether the mapping client makes us of this, which QGIS likes to). Another way <em>should be</em>&nbsp; to create an outbound URL Rewrite rule to rewrite any references to the original URL with the new one. However, after a bit of pfaffing with this, I’m pretty sure there’s a bug in URL Rewrite that means outbound rewriting doesn’t work for attributes containing colons, and ours is “xlink:href”. Incidentally setting up the outbound rules for custom tags is a bit of an adventure through the UI, and there is a bit of escaping to do for the backslashes and question mark in the URL (<font style="background-color: rgb(255, 255, 0);">highlighted</font> below) as URL Rewrite is doing regular expressions so you might as well get down and dirty in the web.config located in the “dummy” folder we created for the new web site we created earlier. So this is my outbound rule that <em>doesn’t work,</em> but should when someone fixes the bug!</p>

<p><font face="Courier New">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;system.webServer&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rewrite&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rules&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rule name="ReverseProxyInboundRule2" stopProcessing="true"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;match url="map1(.*)" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action type="Rewrite" url="</font><a href="http://mapservertest.esdm.co.uk/scripts/mapserv.exe?map=D:\Websites\mapservertest\map\mapfiletest.map{R:1}&quot;"><font face="Courier New">http://mapservertest.esdm.co.uk/scripts/mapserv.exe?map=D:\Websites\mapservertest\map\mapfiletest.map{R:1}"</font></a><font face="Courier New"> /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rule&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rules&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;outboundRules&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsXML" enabled="true"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;match filterByTags="CustomTags" customTags="OGC GetCapabilities" pattern="^http(s)?://mapservertest.esdm.co.uk/scripts/mapserv.exe<font style="background-color: rgb(255, 255, 0);">\?map=D:\\Websites\\mapservertest\\map\\</font>mapfiletest.map(.*)" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action type="Rewrite" value="http{R:1}://mapservertestwrapper.esdm.co.uk/map1{R:2}" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rule&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;preConditions&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;preCondition name="ResponseIsHtml1"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/preCondition&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;preCondition name="ResponseIsXML"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/xml" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/preCondition&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/preConditions&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;customTags&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tags name="OGC GetCapabilities"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tag name="OnlineResource" attribute="<font style="background-color: rgb(255, 0, 0);">xlink:href</font>" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tags&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/customTags&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/outboundRules&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rewrite&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/system.webServer&gt;<br />
&lt;/configuration&gt;</font></p>

<p>&nbsp;</p>

<p>The <font style="background-color: rgb(255, 0, 0);">red bit</font> is the bit affected by the bug I think, unless someone can point out how this should be escaped/expressed to make it work?</p>
<br /><a href='https://www.esdm.co.uk/how-to-hide-the-mapserver-map-file-location-on-iis'>Crispin Flower</a>&nbsp;&nbsp;<a href='https://www.esdm.co.uk/how-to-hide-the-mapserver-map-file-location-on-iis'>...</a>]]></description>
      <link>https://www.esdm.co.uk/how-to-hide-the-mapserver-map-file-location-on-iis</link>
      <author>crispin.flower@idoxgroup.com (Crispin Flower)</author>
      <comments>https://www.esdm.co.uk/how-to-hide-the-mapserver-map-file-location-on-iis</comments>
      <guid isPermaLink="true">https://www.esdm.co.uk/how-to-hide-the-mapserver-map-file-location-on-iis</guid>
      <pubDate>Sat, 12 Apr 2014 11:29:00 GMT</pubDate>
    </item>
    <item>
      <title>Making our mojoPortal sites even more secure</title>
      <description><![CDATA[<p>I’ve just run a couple of our mojoPortal web sites through the test on <a href="https://asafaweb.com" title="https://asafaweb.com">https://asafaweb.com</a> and thought I’d write up some notes on how to get the best possible test results (and therefore presumably the most secure sites!). We are starting from a point where all the basic security measures are in place – folder permissions, custom machine key, running the site under SSL.</p>

<p>The tests that did not immediately pass were:</p>

<h3>Request validation: Fail</h3>

<p>OK so we find &lt;pages validateRequest="false" … in web.config.</p>

<p>But we are assured this is deliberate and acceptable in mojoPortal because, as Joe Audette explained,</p>

<blockquote>
<p>validateRequest is false because we do our own validation of inputs and setting it to true causes problems/errors when posting back html content from a wysiwyg editor.</p>
</blockquote>

<h3>Excessive headers: Warning</h3>

<p>So our IIS server and site are revealing several pieces of information about the technologies behind the site, and we are <a href="http://www.troyhunt.com/2012/02/shhh-dont-let-your-response-headers.html" target="_blank">better concealing these http headers</a>.</p>

<p>Specifically we have:</p>

<ul>
	<li><strong>Server</strong> which can be turned off with <a href="http://www.iis.net/downloads/microsoft/urlscan" target="_blank">URLscan</a> by setting RemoveServerHeader=1 in UrlScan.ini (there are other ways, but this is by far the simplest).</li>
	<li><strong>X-Powered-By </strong>which can be turned off in IIS Manager: select the web site, then open HTTP Response Headers and remove this one.</li>
	<li><strong>X-AspNet-Version </strong>which can be suppressed by adding this attribute to the httpRuntime setting in web.config: &lt;httpRuntime … <strong>enableVersionHeader="false"</strong> /&gt;</li>
</ul>

<h3>Secure cookies: Fail</h3>

<p>In line with <a href="https://www.mojoportal.com/use-ssl" target="_blank">the mojoPortal documentation on SSL</a> we already had the attribute in bold:</p>

<p>&lt;forms name=".mysitecookiename" protection="All" timeout="50000000" path="/" cookieless="UseCookies" <strong>requireSSL="true"</strong> /&gt;</p>

<p>but we were still failing the test until we also added this into the system.web section:</p>

<p><strong>&lt;httpCookies httpOnlyCookies="true" requireSSL="true" /&gt;</strong></p>

<p>Joe Audette said:</p>

<blockquote>
<p>Adding the &lt;httpCookies element as you have just means that any other cookies issued for the web site would also be kept secure, but as far as I know any other cookies we are creating are only for cosmetic purposes such as the one to toggle the collapse state of the admin toolbar etc.</p>
</blockquote>

<p>So I think we were secure anyway, but it’s nice to pass the test.</p>

<h3>Clickjacking: Warning</h3>

<p>This was easily blocked by preventing our site from being run in an iframe. This is achieved in IIS Manager: select the web site, then open HTTP Response Headers, and add a new one as follows:</p>

<p><img alt="Adding an HTTP response header to block loading the site in an iframe" border="0" height="185" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/clip_image002_4.jpg" style="border: 0px currentColor; border-image: none; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Adding an HTTP response header to block loading the site in an iframe" width="326" /></p>

<p>If we are using an iframe within the site, for something like a keep-alive, another value for this setting is "SAMEORIGIN" - this allows iframes in the site to host content that is within the same domain. If we want our site to be displayed in an iframe within a known other site, we can use "ALLOW-FROM <em>uri</em>".</p>

<h3>View state MAC: Not tested</h3>

<p>Not tested apparently because the viewstate is encrypted in mojoPortal, but it turns out versions of mojoPortal before 2.4.0.2 had <strong>enableViewStateMac="false"</strong> which is not what we want. This has been removed, meaning it is set to true by default, in version 2.4.0.2, but if running an earlier version we should ensure this setting has <em>only</em> the following attributes:</p>

<p><code>&lt;pages validateRequest="false" viewStateEncryptionMode="Auto" maxPageStateFieldLength="500" controlRenderingCompatibilityVersion="4.0" clientIDMode="AutoID"&gt;</code></p>

<p>So on sites running mojoPortal 2.4.0.2 or later, no change needed.</p>

<h3>Summary</h3>

<p>So we needed to make two changes in web.config, remove one http header and add another one. Plus install and configure&nbsp;URLscan if it's not already present. These are one-off changes for a server and/or site except the web.config settings. mojoPortal upgrades generally involve overwriting the web.config, so it’s important to keep separate notes about what default settings need to be changed again after an upgrade. We always keep these notes for each site in a UpgradeNotes.config file in the root folder of the site.</p>

<h3>*** UPDATE ***</h3>

<p>Further testing of some sites with ZAP and&nbsp;<a href="https://securityheaders.com" target="_blank">https://securityheaders.com</a> identified two more http headers (in italics below) that should be set to improve security. Overall the header settings can be wrapped up by including this section in system.webServer:</p>

<p><code>&nbsp; &lt;system.webServer&gt;<br />
...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;httpProtocol&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;customHeaders&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;remove name="X-Powered-By" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add name="X-Frame-Options" value="SAMEORIGIN" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <em>&lt;add name="X-XSS-Protection" value="1" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add name="X-Content-Type-Options" value="nosniff" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;add name="Referrer-Policy" value="no-referrer-when-downgrade" /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;add name="strict-transport-security" value="max-age=31536000; includeSubDomains" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/customHeaders&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/httpProtocol&gt;&nbsp; </em> </code></p>

<p><code>...</code></p>

<p>And it also pointed&nbsp;&nbsp;out that auto-complete was not disabled on the login screen (which leaves accounts vulnerable where more than one user may share a machine). This can be suppressed with the following in user.config:</p>

<p><code>&lt;add key="DisableAutoCompleteOnLogin" value="true"/&gt;</code></p>

<p>&nbsp;</p>
<br /><a href='https://www.esdm.co.uk/making-our-mojoportal-sites-even-more-secure'>Crispin Flower</a>&nbsp;&nbsp;<a href='https://www.esdm.co.uk/making-our-mojoportal-sites-even-more-secure'>...</a>]]></description>
      <link>https://www.esdm.co.uk/making-our-mojoportal-sites-even-more-secure</link>
      <author>crispin.flower@idoxgroup.com (Crispin Flower)</author>
      <comments>https://www.esdm.co.uk/making-our-mojoportal-sites-even-more-secure</comments>
      <guid isPermaLink="true">https://www.esdm.co.uk/making-our-mojoportal-sites-even-more-secure</guid>
      <pubDate>Thu, 10 Apr 2014 18:31:00 GMT</pubDate>
    </item>
    <item>
      <title>When RD Web Access doesn’t work with Internet Explorer 11</title>
      <description><![CDATA[<p>&nbsp;</p>

<p>We found that our Remote Desktop Web Access didn’t work with IE11. Browsing to the /RDweb page produced this message:</p>

<p>“Browser Not Supported</p>

<p>This Web browser is not supported by RD Web Access. RD Web Access requires Internet Explorer 6.0 or later.”</p>

<p><img alt="RD Web Access not working for Internet Explorer 11" border="0" height="188" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_86.png" style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="RD Web Access not working for Internet Explorer 11" width="640" /></p>

<p>The solution (thanks to <a href="http://www.edugeek.net/forums/windows/127594-ie11-rd-web-access.html" title="http://www.edugeek.net/forums/windows/127594-ie11-rd-web-access.html">http://www.edugeek.net/forums/windows/127594-ie11-rd-web-access.html</a> and repeated here in case that site vanishes) is to make a minor change to the configuration on the web server. The fix only works on <acronym>RDS</acronym> Gateway servers with 2008 R2 SP1 installed.</p>

<ol>
	<li>In IIS Management Console, open the Sites node and then select the RDweb node.</li>
	<li>On the right-hand side double-click on HTTP Response Headers.</li>
	<li>In the right hand panel click “Add…”.</li>
	<li>In the dialogue that appears enter Name: X-UA-Compatible and Value: IE=9 as shown below:<br />
	&nbsp;<img alt="Adding a custom HTTP response header" border="0" height="185" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_89.png" style="border: 0px currentColor; border-image: none; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Adding a custom HTTP response header" width="326" /></li>
	<li>Re-start IIS (and possibly reboot the server) and test RD Web Access again.</li>
</ol>
<br /><a href='https://www.esdm.co.uk/when-rd-web-access-doesn't-work-with-internet-explorer-11'>Crispin Flower</a>&nbsp;&nbsp;<a href='https://www.esdm.co.uk/when-rd-web-access-doesn't-work-with-internet-explorer-11'>...</a>]]></description>
      <link>https://www.esdm.co.uk/when-rd-web-access-doesn't-work-with-internet-explorer-11</link>
      <author>crispin.flower@idoxgroup.com (Crispin Flower)</author>
      <comments>https://www.esdm.co.uk/when-rd-web-access-doesn't-work-with-internet-explorer-11</comments>
      <guid isPermaLink="true">https://www.esdm.co.uk/when-rd-web-access-doesn't-work-with-internet-explorer-11</guid>
      <pubDate>Fri, 03 Jan 2014 15:26:00 GMT</pubDate>
    </item>
    <item>
      <title>Presenting GeoServer on port 80 on a Windows IIS Server</title>
      <description><![CDATA[<p>We run several instances of <a href="http://geoserver.org" target="_blank">GeoServer</a> on Windows servers, using the Jetty web server included in the GeoServer for Windows installer. By default this results in a service running on an address like http://123.345.67.321:8080/geoserver </p> <p>Recently we have found that some external users cannot see the mapping, and it appears something at their end is blocking requests to our address. We are not sure exactly what is being blocked, but a solution was needed. We need to run these services over port 80, and with a friendly domain name instead of an i.p. address.</p> <p>However we also run IIS web sites on the same servers, and while it is possible to reconfigure the port used for Jetty, I’m pretty sure it would not be possible to have both IIS and Jetty handling requests on the same port.</p> <p>The solution was to configure an IIS web site to route traffic through to GeoServer on its old address. I thought it worth making some notes of the procedure.</p> <ol> <li>This required installing two extensions to IIS 7.5:<br>URL Rewrite: <a href="http://www.iis.net/download/URLRewrite" target="_blank">http://www.iis.net/download/URLRewrite</a><br>Application Request Routing: <a href="http://www.iis.net/download/ApplicationRequestRouting">http://www.iis.net/download/ApplicationRequestRouting</a></li> <li>I created a new web site in IIS, on the same server as the GeoServer instance. I added a new subdomain, that I had created earlier, as a binding (host header) for the site; this will be the new external address for our GeoServer service. Let’s say it’s mygeoserver.exegesis.com or something.</li> <li>In IIS, select the site, and double-click the “URL Rewrite” icon which should be visible in the IIS section of the Features View.</li> <li>Right-click in the “Inbound rules” area, and “Add Rule(s)…”. </li> <li>Choose “Reverse Proxy” and click OK.</li> <li>Enter the address of the GeoServer instance. Using my hypothetical server above, I would enter 123.345.67.321:8080/geoserver. Click OK.&nbsp; The “geoserver” bit was not strictly necessary, but including this shortens the final addresses a bit.</li> <li>Test.&nbsp; For any original request to GeoServer, simply replace http://123.345.67.321:8080/geoserver with mygeoserver.exegesis.com (or whatever), and you should get the same response. For external users, traffic is now going over port 80, and there are no server i.p. addresses to get grumpy about.</li></ol> <p>For us, it means our clients can now see their map of fly-tipping incidents in the Valleys again:</p> <p><img title="fly tipping incidents in the Welsh Valleys" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="fly tipping incidents in the Welsh Valleys" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_48.png" width="640" height="360"></p> <p>This also has a number of other benefits that I’ve not fully thought through yet… for example, it means we can use IIS i.p. filtering to restrict access to our GeoServer mapping where needed, we can analyze IIS logs, etc.</p><br /><a href='https://www.esdm.co.uk/presenting-geoserver-on-port-80-on-a-windows-iis-server'>Crispin Flower</a>&nbsp;&nbsp;<a href='https://www.esdm.co.uk/presenting-geoserver-on-port-80-on-a-windows-iis-server'>...</a>]]></description>
      <link>https://www.esdm.co.uk/presenting-geoserver-on-port-80-on-a-windows-iis-server</link>
      <author>crispin.flower@idoxgroup.com (Crispin Flower)</author>
      <comments>https://www.esdm.co.uk/presenting-geoserver-on-port-80-on-a-windows-iis-server</comments>
      <guid isPermaLink="true">https://www.esdm.co.uk/presenting-geoserver-on-port-80-on-a-windows-iis-server</guid>
      <pubDate>Tue, 25 Jun 2013 13:18:07 GMT</pubDate>
    </item>
    <item>
      <title>asp.net - json compression</title>
      <description><![CDATA[<p>Dynamic content compression does not work by default in asp.net for ‘application/json’ mime types, and given that we’re doing more mobile apps and client side data requests this can make quite a difference to application performance. &nbsp;In flymapper my json response went from 0.4mb to 0.04mb.</p>

<p><a href="http://www.hanselman.com/blog/EnablingDynamicCompressionGzipDeflateForWCFDataFeedsODataAndOtherCustomServicesInIIS7.aspx">http://www.hanselman.com/blog/EnablingDynamicCompressionGzipDeflateForWCFDataFeedsODataAndOtherCustomServicesInIIS7.aspx</a></p>
<br /><a href='https://www.esdm.co.uk/aspnet-json-compression'>Stewart Bellamy</a>&nbsp;&nbsp;<a href='https://www.esdm.co.uk/aspnet-json-compression'>...</a>]]></description>
      <link>https://www.esdm.co.uk/aspnet-json-compression</link>
      <author>stewartb@esdm.co.uk (Stewart Bellamy)</author>
      <comments>https://www.esdm.co.uk/aspnet-json-compression</comments>
      <guid isPermaLink="true">https://www.esdm.co.uk/aspnet-json-compression</guid>
      <pubDate>Wed, 29 May 2013 04:24:00 GMT</pubDate>
    </item>
    <item>
      <title>Revealed: the Identity of the ApplicationPoolIdentity</title>
      <description><![CDATA[<p>While setting up a new <a title="mojoPortal" href="http://www.mojoportal.com" target="_blank">mojoPortal</a> site I tried our running the application pool with the identity “ApplicationPoolIdentity”. Previously we have tended to create a specific user account for each site (with each site running in its own app pool). An advantage of that approach was that we could see in Task Manager what CPU and memory was being used by each site, because the the w3wp.exe process showed as the specific user account. When switched to run as ApplicationPoolIdentity, the process appears to run as a user named the same as the application pool, so all good there.</p> <p>Aside: the problem with running an application pool under its own user account is that MapServer CGI will not run within the site – I’ve no idea why, though it must be a permissions issue. When the app pool runs as ApplicationPoolIdentity then MapServer works fine.</p> <p>As you’ll see from a previous post about <a href="http://www.esdmdata.co.uk/how-to-set-up-a-new-mojoportal-site-in-10-minutes" target="_blank">how to install a mojoPortal site</a>, it is necessary to secure the web site folders. When I came to do this I found there was no user account called ApplicationPoolIdentity, and no user with the name of the application pool either.</p> <p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_10.png" width="217" height="244"></p> <p>It turns out there is a virtual user account, and it can be entered as</p> <p>IIS APPPOOL\ApplicationPoolName&nbsp; (obviously replacing ApplicationPoolName as appropriate):</p> <p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_11.png" width="244" height="132"></p> <p>Folder permissions can then be granted/revoked for this user.</p><br /><a href='https://www.esdm.co.uk/revealed-the-identity-of-the-applicationpoolidentity'>Crispin Flower</a>&nbsp;&nbsp;<a href='https://www.esdm.co.uk/revealed-the-identity-of-the-applicationpoolidentity'>...</a>]]></description>
      <link>https://www.esdm.co.uk/revealed-the-identity-of-the-applicationpoolidentity</link>
      <author>crispin.flower@idoxgroup.com (Crispin Flower)</author>
      <comments>https://www.esdm.co.uk/revealed-the-identity-of-the-applicationpoolidentity</comments>
      <guid isPermaLink="true">https://www.esdm.co.uk/revealed-the-identity-of-the-applicationpoolidentity</guid>
      <pubDate>Fri, 08 Jun 2012 06:58:55 GMT</pubDate>
    </item>
    <item>
      <title>How to set up a new mojoPortal site in 10 minutes</title>
      <description><![CDATA[<p>OK you had better have a .Net 4 IIS server and a SQL server already, or this is not going to work. And if sharing the web server with other sites, you should have a host name configured and pointing at the web server. But if you do, then it really is this easy…</p>

<h3>Creating the site</h3>

<ol>
	<li>Download the latest release from <a href="https://www.mojoportal.com/download">https://www.mojoportal.com/download</a></li>
	<li>Unpack the zip and find the wwwroot folder. Copy the contents to wherever you want your web site files.</li>
	<li>On your SQL Server create an empty database, and give a login dbowner access to it.</li>
	<li>In the web site folder, rename user.config.sample to user.config and alter the MSSQLConnectionString to point at your new database. Better still copy in a user.config from another working site and adjust.</li>
	<li>In IIS Manager, we like to create a dedicated application pool per site:<br />
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image.png"><img alt="image" border="0" height="222" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_thumb_2.png" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" title="image" width="244" /></a></li>
	<li>Then create a web site:<br />
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_1.png"><img alt="image" border="0" height="240" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/image_thumb_3.png" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" title="image" width="244" /></a></li>
	<li>On a PC, browse to your web site… you should see lots of messages appear like this:<br />
	Welcome to mojoPortal Setup<br />
	Probing system...<br />
	File system permissions ok.<br />
	MSSQL database connection ok.<br />
	database permissions are sufficient to alter schema.<br />
	database initial schema needs to be created.<br />
	Running script mojoportal-core - 2.3.4.8 - 00:00:00.0700000<br />
	Running script mojoportal-core - 2.3.4.9 - 00:00:03.2250000<br />
	Running script mojoportal-core - 2.3.5.0 - 00:00:03.2820000<br />
	Running script mojoportal-core - 2.3.5.1 - 00:00:03.3130000<br />
	etc etc</li>
	<li>Your site should now be up and running. Assuming it is, there are a couple more things to do to secure the site.</li>
</ol>

<h3>Securing the site</h3>

<ol>
	<li>Sign in as <a href="mailto:admin@admin.com">admin@admin.com</a> / admin</li>
	<li>Got to Administration &gt; Security Advisor – it will be warning you about the machine key. Click “Generate a new key”, copy the result, and paste it into your web.config on the web server (replacing the existing machine key – search the file for “machineKey”). This will make your site restart so you will have to log in again.</li>
	<li>Next visit the “Member List” page (using the link at the top of the page), and click “Add new user”. Create a new account for yourself, and after clicking “Create User” go to “Role Membership” and add the new account to the Administrators role. Sign out, and sign in again with your new account.</li>
	<li>Go to the Member List, “Manage” the “Admin” account, and delete it.</li>
	<li>Go to Administration &gt; Site Settings &gt; Security, and change the password format from “Clear Text in DB” to “Hashed in DB…”</li>
	<li>Screw down the permission on the web site folders <a href="http://www.mojoportal.com/securing-the-file-system.aspx" target="_blank">as instructed here</a>. We like to make the application pool run under a specific user account, then give this account the permissions described.</li>
</ol>

<p>That’s it – you have a secure mojoPortal web site.</p>

<h3>Useful settings</h3>

<p>We like to add the following settings to user.config (remembering to touch web.config to make these take effect):</p>

<pre class="csharpcode">
    <span class="rem">&lt;!-- to allow extensionless URLs --&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="AllowChangingFriendlyUrlPattern"</span> <span class="attr">value</span><span class="kwrd">="true"</span> <span class="kwrd">/&gt;</span>
    <span class="rem">&lt;!-- Set these to false during design work --&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="CacheCssOnServer"</span> <span class="attr">value</span><span class="kwrd">="false"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="CacheCssInBrowser"</span> <span class="attr">value</span><span class="kwrd">="false"</span><span class="kwrd">/&gt;</span>
    <span class="rem">&lt;!-- To prevent startup scripts running. Change to false when upgrading mojo --&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="DisableSetup"</span> <span class="attr">value</span><span class="kwrd">="true"</span> <span class="kwrd">/&gt;</span>
    <span class="rem">&lt;!-- make sure admins put content files in same place as non-admins --&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="ForceAdminsToUseMediaFolder"</span> <span class="attr">value</span><span class="kwrd">="true"</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="AllowForcingPreferredHostName"</span> <span class="attr">value</span><span class="kwrd">="true"</span> <span class="kwrd">/&gt;</span>
    <span class="rem">&lt;!-- EMAIL --&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="DisableDotNetOpenMail"</span> <span class="attr">value</span><span class="kwrd">="true"</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="SMTPServer"</span> <span class="attr">value</span><span class="kwrd">="myserver"</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="SMTPRequiresAuthentication"</span> <span class="attr">value</span><span class="kwrd">="true"</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="SMTPUseSsl"</span> <span class="attr">value</span><span class="kwrd">="false"</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="SMTPPort"</span> <span class="attr">value</span><span class="kwrd">="25"</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="SMTPUser"</span> <span class="attr">value</span><span class="kwrd">="mymailserver"</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="SMTPPassword"</span> <span class="attr">value</span><span class="kwrd">="mypassword"</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="SMTPTimeoutInMilliseconds"</span> <span class="attr">value</span><span class="kwrd">="30000"</span> <span class="kwrd">/&gt;</span>
    <span class="rem">&lt;!-- Leave this blank for ASCII encoding. Allowed values are utf-8, utf-32, and unicode --&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">="SmtpPreferredEncoding"</span> <span class="attr">value</span><span class="kwrd">=""</span><span class="kwrd">/&gt;</span>
    <span class="rem">&lt;!-- END EMAIL --&gt;</span></pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<h3>Skinning the site</h3>

<p>Big topic, with plenty of guidance on <a href="http://www.mojoportal.com">www.mojoportal.com</a>, and we are now going over the 10 minutes! The easiest way to get started is to choose the shipped skin that is closest to your layout/behaviour requirements, clone this skin, then work on the CSS, layout.master and graphics. We usually review the extra skins that are available for each mojoPortal release (as well as the ones in the release folders). These are also found on the Codeplex download page (see above) as “extra-skins.zip”. If you drop the unzipped skin folders into \Data\skins in your web site folder they will be available for all child sites. If you have already create a site, you can drop them into \Data\Sites\N\skins (where N is the number of your site).</p>
<br /><a href='https://www.esdm.co.uk/how-to-set-up-a-new-mojoportal-site-in-10-minutes'>Crispin Flower</a>&nbsp;&nbsp;<a href='https://www.esdm.co.uk/how-to-set-up-a-new-mojoportal-site-in-10-minutes'>...</a>]]></description>
      <link>https://www.esdm.co.uk/how-to-set-up-a-new-mojoportal-site-in-10-minutes</link>
      <author>crispin.flower@idoxgroup.com (Crispin Flower)</author>
      <comments>https://www.esdm.co.uk/how-to-set-up-a-new-mojoportal-site-in-10-minutes</comments>
      <guid isPermaLink="true">https://www.esdm.co.uk/how-to-set-up-a-new-mojoportal-site-in-10-minutes</guid>
      <pubDate>Sat, 14 Jan 2012 23:08:00 GMT</pubDate>
    </item>
    <item>
      <title>Breaking a site with Multi-Mechanize</title>
      <description><![CDATA[<p>In my previous post I <a title="Trying out Multi-Mechanize web performance and load testing framework" href="trying-out-multi-mechanize-web-performance-and-load-testing-framework" target="_blank">got started with Multi-Mechanize</a> and established that it is a useful tool for load-testing web sites.&nbsp; Next I tried it on a real site that we are currently building – the new “Norfolk Heritage Explorer”. This is a mojoPortal site with exeGesIS plug-in components that fetch data from the “HBSMR Gateway” web service. This is the bit I wanted to test for performance under load.</p> <p>I ran the test against a single page in the new site that loads a record from the web service, with a query on the record ID.</p> <p><a href="http://nhe.no-ip.org/glossary?uid=TNF2069">http://nhe.no-ip.org/glossary?uid=TNF2069</a></p> <p>I didn’t mention in the previous post that you need to watch the “errors” figure. You can see this in the console during the test run, and also at the top of the results html. The first time I ran the test, I got a huge error rate – something like 5000 errors out of 6000 transactions. Therefore I lowered the number of threads to 4, ramping up over 100 seconds.</p> <p>This time I got 474 errors out of 627 transactions, and an interesting pattern emerged:</p><b>transactions:</b> 627<br><b>errors:</b> 474<br><b>run time:</b> 100 secs<br><b>rampup:</b> 100 secs<br><br><b>test start:</b> 2011-12-28 10:39:26<br><b>test finish:</b> 2011-12-28 10:41:04<br><br><b>time-series interval:</b> 10 secs<br><br> <h4>Timer Summary (secs)</h4> <table> <tbody> <tr> <th>count</th> <th>min</th> <th>avg</th> <th>80pct</th> <th>90pct</th> <th>95pct</th> <th>max</th> <th>stdev</th></tr> <tr> <td>623</td> <td>0.170</td> <td>0.473</td> <td>1.022</td> <td>1.300</td> <td>1.580</td> <td>3.174</td> <td>0.521</td></tr></tbody></table> <h4>Interval Details (secs)</h4> <table> <tbody> <tr> <th>interval</th> <th>count</th> <th>rate</th> <th>min</th> <th>avg</th> <th>80pct</th> <th>90pct</th> <th>95pct</th> <th>max</th> <th>stdev</th></tr> <tr> <td>1</td> <td>19</td> <td>1.90</td> <td>0.900</td> <td>1.045</td> <td>1.150</td> <td>1.150</td> <td>1.431</td> <td>1.431</td> <td>0.132</td></tr> <tr> <td>2</td> <td>18</td> <td>1.80</td> <td>1.050</td> <td>1.164</td> <td>1.249</td> <td>1.290</td> <td>1.570</td> <td>1.570</td> <td>0.128</td></tr> <tr> <td>3</td> <td>18</td> <td>1.80</td> <td>1.010</td> <td>1.095</td> <td>1.130</td> <td>1.180</td> <td>1.180</td> <td>1.180</td> <td>0.050</td></tr> <tr> <td>4</td> <td>19</td> <td>1.90</td> <td>1.010</td> <td>1.067</td> <td>1.100</td> <td>1.120</td> <td>1.150</td> <td>1.150</td> <td>0.037</td></tr> <tr> <td>5</td> <td>20</td> <td>2.00</td> <td>0.940</td> <td>0.983</td> <td>1.010</td> <td>1.030</td> <td>1.050</td> <td>1.050</td> <td>0.030</td></tr> <tr> <td>6</td> <td>24</td> <td>2.40</td> <td>1.332</td> <td>1.641</td> <td>1.820</td> <td>1.940</td> <td>1.970</td> <td>2.010</td> <td>0.194</td></tr> <tr> <td>7</td> <td>25</td> <td>2.50</td> <td>1.280</td> <td>1.588</td> <td>1.780</td> <td>1.800</td> <td>1.850</td> <td>1.990</td> <td>0.181</td></tr> <tr> <td>8</td> <td>137</td> <td>13.70</td> <td>0.170</td> <td>0.316</td> <td>0.200</td> <td>0.480</td> <td>1.440</td> <td>2.600</td> <td>0.420</td></tr> <tr> <td>9</td> <td>192</td> <td>19.20</td> <td>0.170</td> <td>0.193</td> <td>0.190</td> <td>0.200</td> <td>0.200</td> <td>0.530</td> <td>0.035</td></tr> <tr> <td>10</td> <td>151</td> <td>15.10</td> <td>0.170</td> <td>0.231</td> <td>0.200</td> <td>0.200</td> <td>0.204</td> <td>3.174</td> <td>0.343</td></tr></tbody></table> <h4>Graphs</h4> <h6>Response Time: 10 sec time-series</h6><a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times_intervals.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Load_Homepage_response_times_intervals" border="0" alt="Load_Homepage_response_times_intervals" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times_intervals_thumb.png" width="244" height="103"></a> <h6>Response Time: raw data (all points)</h6><a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Load_Homepage_response_times" border="0" alt="Load_Homepage_response_times" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times_thumb.png" width="244" height="103"></a> <h6>Throughput: 10 sec time-series</h6><a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_throughput.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Load_Homepage_throughput" border="0" alt="Load_Homepage_throughput" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_throughput_thumb.png" width="244" height="103"></a> <p>I think what’s happening here is:</p> <p>First 50 seconds we get consistent response times around 1 second with no errors. Not sure why no change at 20-30 seconds transition, because I would have expected M-M to add a virtual user at this point.</p> <p>After 50 seconds, we clearly have more virtual users, and the site slows down with average responses 2.25 seconds. </p> <p>At 75 seconds (presumably 3 virtual users), the response times become much faster… eh? Well because I was watching the console output I knew this is also when the errors starting happening – pity M-M’s analysis doesn’t reveal this.&nbsp; I also “manually” uses the site during this period, and found that mojoPortal was returning it’s standard “something’s bust” page (and doing so very rapidly!).</p> <p>Examination of the mojoPortal system log showed that our plug-in component that talks to the web service was throwing an unhandled exception, along the lines that the root XML element was missing in the response from the HBSMR Gateway web service. This is turn was causing mojoPortal to output it’s standard error page.</p> <blockquote> <p>2011-12-28 10:41:16,125 ERROR 82.31.27.48 - en-US - /glossary?uid=TNF2069 - mojoPortal.Web.Global -&nbsp; Referrer(none) useragent Mozilla/5.0 Compatible <br>System.Xml.XmlException: Root element is missing.<br>&nbsp;&nbsp; at System.Xml.XmlTextReaderImpl.Throw(Exception e)<br>&nbsp;&nbsp; at System.Xml.XmlTextReaderImpl.ParseDocumentContent()<br>&nbsp;&nbsp; at System.Xml.XmlTextReaderImpl.Read()<br>&nbsp;&nbsp; at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)<br>&nbsp;&nbsp; at System.Xml.XmlDocument.Load(XmlReader reader)<br>&nbsp;&nbsp; at System.Xml.XmlDocument.LoadXml(String xml)<br>&nbsp;&nbsp; at ESDMmojoPortal.NHE.Business.GatewayResult.get_BBox()</p></blockquote> <p>I’ll need to investigate this further, but it suggests the HBSMR Gateway web service was returning an error response or perhaps empty XML when put under this load. This has to be improved of course, because it can come under very heavy load when used from the national Heritage Gateway site as well as applications like the Norfolk Heritage Explorer.</p> <p>So Multi-Mechanize has been incredibly useful in highlighting a weakness that could otherwise have rumbled on causing occasional problems for months.</p> <p>However, note that at first glance the graphs look as though the site was performing better as the load increased, because erring transactions were included into the analysis undifferentiated. In this case it was extremely obvious this was not really the case, because once the page started giving errors it basically stopped working at all; but this could be far less clear-cur, and the verdict has to be to remember to look at the number of errors first, and if there are any then bear this in mind in any interpretation of the figures and graphs. It would be useful if M-M could represent the errors in the results analysis, perhaps including them into the tabular stats, and offering graphs with the errors filtered out.</p><br /><a href='https://www.esdm.co.uk/breaking-a-site-with-multi-mechanize'>Crispin Flower</a>&nbsp;&nbsp;<a href='https://www.esdm.co.uk/breaking-a-site-with-multi-mechanize'>...</a>]]></description>
      <link>https://www.esdm.co.uk/breaking-a-site-with-multi-mechanize</link>
      <author>crispin.flower@idoxgroup.com (Crispin Flower)</author>
      <comments>https://www.esdm.co.uk/breaking-a-site-with-multi-mechanize</comments>
      <guid isPermaLink="true">https://www.esdm.co.uk/breaking-a-site-with-multi-mechanize</guid>
      <pubDate>Wed, 28 Dec 2011 11:33:57 GMT</pubDate>
    </item>
    <item>
      <title>Trying out Multi-Mechanize web performance and load testing framework</title>
      <description><![CDATA[<p>
	Information and download from <strike><a href="http://code.google.com/p/multi-mechanize/" title="http://code.google.com/p/multi-mechanize/">http://code.google.com/p/multi-mechanize/</a></strike></p>
<p>
	UPDATE 14th March 2012: now moved to <a href="http://testutils.org/multi-mechanize"><font color="#0066cc">http://testutils.org/multi-mechanize</font></a></p>
<blockquote>
	<p>
		Multi-Mechanize is an open source framework for API performance and load testing. It allows you to run simultaneous python scripts to generate load (synthetic transactions) against a web site or API/service.&nbsp;</p>
	<p>
		In your scripts, you have the convenience of mechanize along with the power of the full Python programming language at your disposal. You programmatically create test scripts to simulate virtual user activity. Your scripts will then generate HTTP requests to intelligently navigate a web site or send requests to a web service.</p>
	<p>
		…</p>
	<p>
		You should be proficient with Python, HTTP, and performance/load testing to use multi-mechanize successfully.</p>
</blockquote>
<h3>
	Installing Multi-Mechanize</h3>
<p>
	First time around I got this horribly wrong, probably through not being proficient with…. actually my problem was installing Python 3.2 for Windows 64 bit; it turns out Multi-Mechanize only works with Python 2.6 and 2.7, and if you install the wrong version you get loads of syntax error messages; so I had to start again. Here is the correct sequence:</p>
<ol>
	<li>
		First install Python 2.7<br />
		<a href="http://www.python.org/download/releases/2.7.2/" title="http://www.python.org/download/releases/2.7.2/">http://www.python.org/download/releases/2.7.2/</a>&nbsp;<br />
		specifically<br />
		<a href="http://www.python.org/ftp/python/2.7.2/python-2.7.2.amd64.msi">Windows X86-64 MSI Installer (2.7.2)</a> <a href="http://www.python.org/download/releases/2.7.2/#id5">[1]</a><a href="http://www.python.org/download/releases/2.7.2/python-2.7.2.amd64.msi.asc">(sig)</a></li>
	<li>
		To install mechanize, download<br />
		<a href="http://pypi.python.org/pypi/distribute#distribute-setup-py" title="http://pypi.python.org/pypi/distribute#distribute-setup-py">http://pypi.python.org/pypi/distribute#distribute-setup-py</a>&nbsp;<br />
		and run&nbsp;<br />
		C:\Python27\python C:\blah\Downloads\distribute_setup.py<br />
		then<br />
		C:\Python27\scripts\easy_install mechanize</li>
	<li>
		Install Numpy from <a href="http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy" title="http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy">http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy</a>&nbsp;<br />
		specifically <a href="http://www.lfd.uci.edu/~gohlke/pythonlibs/">numpy-MKL-1.6.1.win-amd64-py2.7.‌exe</a> [8.7 MB] [Python 2.7] [64 bit] [Oct 29, 2011]</li>
	<li>
		Then install Matplotlib from <a href="http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib" title="http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib">http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib</a>&nbsp;<br />
		specifically <a href="http://www.lfd.uci.edu/~gohlke/pythonlibs/">matplotlib-1.1.0.win-amd64-py2.7.‌exe</a> [4.4 MB] [Python 2.7] [64 bit] [Oct 06, 2011]</li>
	<li>
		Finally download Multi-Mechanize<br />
		<a href="http://code.google.com/p/multi-mechanize/downloads/list" title="http://code.google.com/p/multi-mechanize/downloads/list">http://code.google.com/p/multi-mechanize/downloads/list</a><br />
		and copy the unzipped folder somewhere (no installation).</li>
</ol>
<h3>
	Using Multi-Mechanize</h3>
<p>
	It’s pretty simple. Use a command like this to start a session:</p>
<p>
	&gt;c:\python27\python multi-mechanize.py testMySite</p>
<p>
	This refers to a “project” (in this case “testMySite”) which is a folder under \projects under your Multi-Mechanize folder.&nbsp; To create a project I just copied and adapted the “default_project” that came in the download.</p>
<p>
	In the project folder there is a config.cfg text file that specifies some global settings and some details about what scripts to run on and how many simultaneous sessions to run. There is some sparse information on the config settings here: <a href="http://code.google.com/p/multi-mechanize/wiki/ConfigFile" title="http://code.google.com/p/multi-mechanize/wiki/ConfigFile">http://code.google.com/p/multi-mechanize/wiki/ConfigFile</a></p>
<p>
	You can specify any number of “user groups”, each representing one sequence of actions on your web site/service (e.g. loading the home page, or executing a search). Each user group is associated with a python script defining the actions. Each user group has a number of threads, i.e. virtual users attempting the sequence of operations.</p>
<p>
	TODO: insert some information about the actual Python script - how to perform simple and more complex operations on a web site.</p>
<p>
	The global settings include how long to run the test for, the time series interval for results analysis, and how long to “rampup” the number of users, presumably from one up to the maximum number of threads specified in the user groups. The ramp-up is to see within one test how the site performs under low and then progressively higher loads.</p>
<p>
	The results of the test are output into a folder below the project, with a time-stamped name like \results\results_2011.12.27_16.32.07</p>
<p>
	This contains the raw results as CSV, plus some graphs as PNG images, and an HTML page that brings the numbers and images together into a report.</p>
<h3>
	Example tests</h3>
<p>
	I ran simple tests on the following sites:</p>
<ul>
	<li>
		<a href="http://www.esdm.co.uk">www.esdm.co.uk</a> (main exeGesIS web site built in DotNetNuke and running on one of our older Telehouse servers)</li>
	<li>
		<a href="http://www.esdm.no-ip.co.uk">www.esdm.no-ip.co.uk</a> (draft replacement exeGesIS web site built in mojoPortal and running on our newer Telehouse hosting stack)</li>
	<li>
		<a href="http://www.breconfans.org.uk">www.breconfans.org.uk</a> (a site I run at home, using mojoPortal on Arvixe hosting)</li>
	<li>
		<a href="http://www.wikipedia.org">www.wikipedia.org</a> (a high availability global site as a control)</li>
</ul>
<p>
	The test script simply loaded the home page and checked for some text on the page. I tested with two user groups undertaking the same actions, with 50 virtual users in each, ramping up throughout the 5 minute test period.</p>
<h3>
	www.esdm.co.uk</h3>
<h4>
	Timer Summary (secs)</h4>
<table>
	<tbody>
		<tr>
			<th>
				count</th>
			<th>
				min</th>
			<th>
				avg</th>
			<th>
				80pct</th>
			<th>
				90pct</th>
			<th>
				95pct</th>
			<th>
				max</th>
			<th>
				stdev</th>
		</tr>
		<tr>
			<td>
				1088</td>
			<td>
				0.480</td>
			<td>
				12.897</td>
			<td>
				19.550</td>
			<td>
				23.866</td>
			<td>
				28.932</td>
			<td>
				88.588</td>
			<td>
				9.897</td>
		</tr>
	</tbody>
</table>
<h4>
	Interval Details (secs)</h4>
<table>
	<tbody>
		<tr>
			<th>
				interval</th>
			<th>
				count</th>
			<th>
				rate</th>
			<th>
				min</th>
			<th>
				avg</th>
			<th>
				80pct</th>
			<th>
				90pct</th>
			<th>
				95pct</th>
			<th>
				max</th>
			<th>
				stdev</th>
		</tr>
		<tr>
			<td>
				1</td>
			<td>
				105</td>
			<td>
				3.50</td>
			<td>
				0.480</td>
			<td>
				1.613</td>
			<td>
				2.120</td>
			<td>
				2.290</td>
			<td>
				2.630</td>
			<td>
				4.190</td>
			<td>
				0.711</td>
		</tr>
		<tr>
			<td>
				2</td>
			<td>
				82</td>
			<td>
				2.73</td>
			<td>
				1.992</td>
			<td>
				4.856</td>
			<td>
				6.574</td>
			<td>
				8.324</td>
			<td>
				9.834</td>
			<td>
				11.624</td>
			<td>
				2.251</td>
		</tr>
		<tr>
			<td>
				3</td>
			<td>
				101</td>
			<td>
				3.37</td>
			<td>
				3.000</td>
			<td>
				6.962</td>
			<td>
				9.360</td>
			<td>
				11.960</td>
			<td>
				13.194</td>
			<td>
				14.610</td>
			<td>
				3.095</td>
		</tr>
		<tr>
			<td>
				4</td>
			<td>
				110</td>
			<td>
				3.67</td>
			<td>
				2.830</td>
			<td>
				9.231</td>
			<td>
				12.650</td>
			<td>
				17.330</td>
			<td>
				18.070</td>
			<td>
				30.890</td>
			<td>
				4.900</td>
		</tr>
		<tr>
			<td>
				5</td>
			<td>
				89</td>
			<td>
				2.97</td>
			<td>
				4.964</td>
			<td>
				13.425</td>
			<td>
				17.822</td>
			<td>
				20.912</td>
			<td>
				22.222</td>
			<td>
				28.932</td>
			<td>
				5.095</td>
		</tr>
		<tr>
			<td>
				6</td>
			<td>
				114</td>
			<td>
				3.80</td>
			<td>
				4.912</td>
			<td>
				14.126</td>
			<td>
				18.792</td>
			<td>
				22.286</td>
			<td>
				24.210</td>
			<td>
				48.924</td>
			<td>
				7.163</td>
		</tr>
		<tr>
			<td>
				7</td>
			<td>
				117</td>
			<td>
				3.90</td>
			<td>
				4.670</td>
			<td>
				14.342</td>
			<td>
				18.290</td>
			<td>
				20.986</td>
			<td>
				23.958</td>
			<td>
				58.470</td>
			<td>
				6.999</td>
		</tr>
		<tr>
			<td>
				8</td>
			<td>
				92</td>
			<td>
				3.07</td>
			<td>
				5.402</td>
			<td>
				19.430</td>
			<td>
				24.054</td>
			<td>
				28.328</td>
			<td>
				31.194</td>
			<td>
				51.860</td>
			<td>
				7.733</td>
		</tr>
		<tr>
			<td>
				9</td>
			<td>
				163</td>
			<td>
				5.43</td>
			<td>
				2.650</td>
			<td>
				17.628</td>
			<td>
				25.356</td>
			<td>
				31.604</td>
			<td>
				34.338</td>
			<td>
				88.588</td>
			<td>
				12.654</td>
		</tr>
		<tr>
			<td>
				10</td>
			<td>
				115</td>
			<td>
				3.83</td>
			<td>
				6.500</td>
			<td>
				22.619</td>
			<td>
				27.201</td>
			<td>
				33.947</td>
			<td>
				39.892</td>
			<td>
				86.551</td>
			<td>
				11.353</td>
		</tr>
	</tbody>
</table>
<h4>
	Graphs</h4>
<h6>
	Response Time: 30 sec time-series</h6>
<p>
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times_intervals%5B6%5D.png"><img alt="Load_Homepage_response_times_intervals[6]" border="0" height="103" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times_intervals%5B6%5D_thumb.png" style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Load_Homepage_response_times_intervals[6]" width="244" /></a></p>
<h6>
	Response Time: raw data (all points)</h6>
<p>
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times%5B6%5D.png"><img alt="Load_Homepage_response_times[6]" border="0" height="103" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times%5B6%5D_thumb.png" style="border-width: 0px; margin: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Load_Homepage_response_times[6]" width="244" /></a></p>
<h6>
	Throughput: 30 sec time-series</h6>
<p>
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_throughput%5B6%5D.png"><img alt="Load_Homepage_throughput[6]" border="0" height="103" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_throughput%5B6%5D_thumb.png" style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Load_Homepage_throughput[6]" width="244" /></a></p>
<h3>
	www.esdm.no-ip.co.uk</h3>
<h4>
	Timer Summary (secs)</h4>
<table>
	<tbody>
		<tr>
			<th>
				count</th>
			<th>
				min</th>
			<th>
				avg</th>
			<th>
				80pct</th>
			<th>
				90pct</th>
			<th>
				95pct</th>
			<th>
				max</th>
			<th>
				stdev</th>
		</tr>
		<tr>
			<td>
				5105</td>
			<td>
				0.210</td>
			<td>
				2.914</td>
			<td>
				4.410</td>
			<td>
				5.954</td>
			<td>
				7.190</td>
			<td>
				27.443</td>
			<td>
				2.285</td>
		</tr>
	</tbody>
</table>
<h4>
	Interval Details (secs)</h4>
<table>
	<tbody>
		<tr>
			<th>
				interval</th>
			<th>
				count</th>
			<th>
				rate</th>
			<th>
				min</th>
			<th>
				avg</th>
			<th>
				80pct</th>
			<th>
				90pct</th>
			<th>
				95pct</th>
			<th>
				max</th>
			<th>
				stdev</th>
		</tr>
		<tr>
			<td>
				1</td>
			<td>
				518</td>
			<td>
				17.27</td>
			<td>
				0.210</td>
			<td>
				0.347</td>
			<td>
				0.410</td>
			<td>
				0.470</td>
			<td>
				0.520</td>
			<td>
				1.210</td>
			<td>
				0.119</td>
		</tr>
		<tr>
			<td>
				2</td>
			<td>
				599</td>
			<td>
				19.97</td>
			<td>
				0.300</td>
			<td>
				0.790</td>
			<td>
				1.110</td>
			<td>
				1.250</td>
			<td>
				1.320</td>
			<td>
				2.380</td>
			<td>
				0.322</td>
		</tr>
		<tr>
			<td>
				3</td>
			<td>
				473</td>
			<td>
				15.77</td>
			<td>
				0.960</td>
			<td>
				1.596</td>
			<td>
				1.920</td>
			<td>
				2.030</td>
			<td>
				2.332</td>
			<td>
				3.550</td>
			<td>
				0.399</td>
		</tr>
		<tr>
			<td>
				4</td>
			<td>
				528</td>
			<td>
				17.60</td>
			<td>
				1.020</td>
			<td>
				2.068</td>
			<td>
				2.410</td>
			<td>
				2.590</td>
			<td>
				2.742</td>
			<td>
				5.602</td>
			<td>
				0.505</td>
		</tr>
		<tr>
			<td>
				5</td>
			<td>
				504</td>
			<td>
				16.80</td>
			<td>
				1.250</td>
			<td>
				2.586</td>
			<td>
				3.020</td>
			<td>
				3.360</td>
			<td>
				3.550</td>
			<td>
				6.170</td>
			<td>
				0.713</td>
		</tr>
		<tr>
			<td>
				6</td>
			<td>
				461</td>
			<td>
				15.37</td>
			<td>
				2.314</td>
			<td>
				3.532</td>
			<td>
				4.204</td>
			<td>
				5.482</td>
			<td>
				6.124</td>
			<td>
				9.872</td>
			<td>
				1.253</td>
		</tr>
		<tr>
			<td>
				7</td>
			<td>
				406</td>
			<td>
				13.53</td>
			<td>
				2.670</td>
			<td>
				4.808</td>
			<td>
				6.440</td>
			<td>
				7.470</td>
			<td>
				8.340</td>
			<td>
				17.990</td>
			<td>
				2.107</td>
		</tr>
		<tr>
			<td>
				8</td>
			<td>
				556</td>
			<td>
				18.53</td>
			<td>
				2.080</td>
			<td>
				4.031</td>
			<td>
				5.340</td>
			<td>
				6.560</td>
			<td>
				8.332</td>
			<td>
				18.562</td>
			<td>
				2.157</td>
		</tr>
		<tr>
			<td>
				9</td>
			<td>
				506</td>
			<td>
				16.87</td>
			<td>
				1.960</td>
			<td>
				5.030</td>
			<td>
				6.570</td>
			<td>
				8.010</td>
			<td>
				9.734</td>
			<td>
				25.216</td>
			<td>
				2.685</td>
		</tr>
		<tr>
			<td>
				10</td>
			<td>
				554</td>
			<td>
				18.47</td>
			<td>
				2.050</td>
			<td>
				4.880</td>
			<td>
				6.540</td>
			<td>
				8.082</td>
			<td>
				8.882</td>
			<td>
				27.443</td>
			<td>
				2.432</td>
		</tr>
	</tbody>
</table>
<h4>
	Graphs</h4>
<h6>
	Response Time: 30 sec time-series</h6>
<p>
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times_intervals%5B4%5D.png"><img alt="Load_Homepage_response_times_intervals[4]" border="0" height="103" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times_intervals%5B4%5D_thumb.png" style="border-width: 0px; margin: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Load_Homepage_response_times_intervals[4]" width="244" /></a></p>
<h6>
	Response Time: raw data (all points)</h6>
<p>
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times%5B4%5D.png"><img alt="Load_Homepage_response_times[4]" border="0" height="103" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times%5B4%5D_thumb.png" style="border-width: 0px; margin: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Load_Homepage_response_times[4]" width="244" /></a></p>
<h6>
	Throughput: 30 sec time-series</h6>
<p>
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_throughput%5B4%5D.png"><img alt="Load_Homepage_throughput[4]" border="0" height="103" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_throughput%5B4%5D_thumb.png" style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Load_Homepage_throughput[4]" width="244" /></a></p>
<h3>
	www.breconfans.org.uk</h3>
<h4>
	Timer Summary (secs)</h4>
<table>
	<tbody>
		<tr>
			<th>
				count</th>
			<th>
				min</th>
			<th>
				avg</th>
			<th>
				80pct</th>
			<th>
				90pct</th>
			<th>
				95pct</th>
			<th>
				max</th>
			<th>
				stdev</th>
		</tr>
		<tr>
			<td>
				6710</td>
			<td>
				0.780</td>
			<td>
				2.218</td>
			<td>
				2.970</td>
			<td>
				4.620</td>
			<td>
				5.590</td>
			<td>
				16.120</td>
			<td>
				1.655</td>
		</tr>
	</tbody>
</table>
<h4>
	Interval Details (secs)</h4>
<table>
	<tbody>
		<tr>
			<th>
				interval</th>
			<th>
				count</th>
			<th>
				rate</th>
			<th>
				min</th>
			<th>
				avg</th>
			<th>
				80pct</th>
			<th>
				90pct</th>
			<th>
				95pct</th>
			<th>
				max</th>
			<th>
				stdev</th>
		</tr>
		<tr>
			<td>
				1</td>
			<td>
				220</td>
			<td>
				7.33</td>
			<td>
				0.780</td>
			<td>
				0.830</td>
			<td>
				0.850</td>
			<td>
				0.880</td>
			<td>
				0.890</td>
			<td>
				0.990</td>
			<td>
				0.031</td>
		</tr>
		<tr>
			<td>
				2</td>
			<td>
				500</td>
			<td>
				16.67</td>
			<td>
				0.790</td>
			<td>
				0.959</td>
			<td>
				1.020</td>
			<td>
				1.144</td>
			<td>
				1.420</td>
			<td>
				2.180</td>
			<td>
				0.216</td>
		</tr>
		<tr>
			<td>
				3</td>
			<td>
				703</td>
			<td>
				23.43</td>
			<td>
				0.874</td>
			<td>
				1.111</td>
			<td>
				1.200</td>
			<td>
				1.280</td>
			<td>
				1.400</td>
			<td>
				1.720</td>
			<td>
				0.153</td>
		</tr>
		<tr>
			<td>
				4</td>
			<td>
				761</td>
			<td>
				25.37</td>
			<td>
				0.980</td>
			<td>
				1.416</td>
			<td>
				1.620</td>
			<td>
				2.060</td>
			<td>
				2.120</td>
			<td>
				2.490</td>
			<td>
				0.356</td>
		</tr>
		<tr>
			<td>
				5</td>
			<td>
				857</td>
			<td>
				28.57</td>
			<td>
				1.080</td>
			<td>
				1.611</td>
			<td>
				1.810</td>
			<td>
				2.072</td>
			<td>
				2.430</td>
			<td>
				6.206</td>
			<td>
				0.556</td>
		</tr>
		<tr>
			<td>
				6</td>
			<td>
				982</td>
			<td>
				32.73</td>
			<td>
				0.940</td>
			<td>
				1.699</td>
			<td>
				1.720</td>
			<td>
				2.730</td>
			<td>
				3.240</td>
			<td>
				10.488</td>
			<td>
				0.778</td>
		</tr>
		<tr>
			<td>
				7</td>
			<td>
				628</td>
			<td>
				20.93</td>
			<td>
				1.250</td>
			<td>
				2.986</td>
			<td>
				4.340</td>
			<td>
				5.030</td>
			<td>
				5.600</td>
			<td>
				11.762</td>
			<td>
				1.473</td>
		</tr>
		<tr>
			<td>
				8</td>
			<td>
				693</td>
			<td>
				23.10</td>
			<td>
				1.450</td>
			<td>
				3.333</td>
			<td>
				4.870</td>
			<td>
				5.680</td>
			<td>
				7.000</td>
			<td>
				15.868</td>
			<td>
				1.905</td>
		</tr>
		<tr>
			<td>
				9</td>
			<td>
				663</td>
			<td>
				22.10</td>
			<td>
				1.680</td>
			<td>
				3.794</td>
			<td>
				5.150</td>
			<td>
				6.300</td>
			<td>
				7.600</td>
			<td>
				14.934</td>
			<td>
				1.986</td>
		</tr>
		<tr>
			<td>
				10</td>
			<td>
				703</td>
			<td>
				23.43</td>
			<td>
				1.660</td>
			<td>
				3.714</td>
			<td>
				5.390</td>
			<td>
				6.910</td>
			<td>
				7.900</td>
			<td>
				16.120</td>
			<td>
				2.171</td>
		</tr>
	</tbody>
</table>
<h4>
	Graphs</h4>
<h6>
	Response Time: 30 sec time-series</h6>
<p>
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times_intervals%5B8%5D.png"><img alt="Load_Homepage_response_times_intervals[8]" border="0" height="103" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times_intervals%5B8%5D_thumb.png" style="border-width: 0px; margin: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Load_Homepage_response_times_intervals[8]" width="244" /></a></p>
<h6>
	Response Time: raw data (all points)</h6>
<p>
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times%5B8%5D.png"><img alt="Load_Homepage_response_times[8]" border="0" height="103" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_response_times%5B8%5D_thumb.png" style="border-width: 0px; margin: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Load_Homepage_response_times[8]" width="244" /></a></p>
<h6>
	Throughput: 30 sec time-series</h6>
<p>
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_throughput%5B8%5D.png"><img alt="Load_Homepage_throughput[8]" border="0" height="103" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_homepage_throughput%5B8%5D_thumb.png" style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Load_Homepage_throughput[8]" width="244" /></a></p>
<h3>
	www.wikipedia.org</h3>
<h4>
	Timer Summary (secs)</h4>
<table>
	<tbody>
		<tr>
			<th>
				count</th>
			<th>
				min</th>
			<th>
				avg</th>
			<th>
				80pct</th>
			<th>
				90pct</th>
			<th>
				95pct</th>
			<th>
				max</th>
			<th>
				stdev</th>
		</tr>
		<tr>
			<td>
				2748</td>
			<td>
				0.340</td>
			<td>
				4.880</td>
			<td>
				6.811</td>
			<td>
				9.970</td>
			<td>
				14.132</td>
			<td>
				98.597</td>
			<td>
				5.963</td>
		</tr>
	</tbody>
</table>
<h4>
	Interval Details (secs)</h4>
<table>
	<tbody>
		<tr>
			<th>
				interval</th>
			<th>
				count</th>
			<th>
				rate</th>
			<th>
				min</th>
			<th>
				avg</th>
			<th>
				80pct</th>
			<th>
				90pct</th>
			<th>
				95pct</th>
			<th>
				max</th>
			<th>
				stdev</th>
		</tr>
		<tr>
			<td>
				1</td>
			<td>
				278</td>
			<td>
				9.27</td>
			<td>
				0.340</td>
			<td>
				0.643</td>
			<td>
				0.780</td>
			<td>
				0.930</td>
			<td>
				0.970</td>
			<td>
				2.990</td>
			<td>
				0.264</td>
		</tr>
		<tr>
			<td>
				2</td>
			<td>
				269</td>
			<td>
				8.97</td>
			<td>
				0.570</td>
			<td>
				1.689</td>
			<td>
				2.240</td>
			<td>
				2.484</td>
			<td>
				3.030</td>
			<td>
				5.304</td>
			<td>
				0.796</td>
		</tr>
		<tr>
			<td>
				3</td>
			<td>
				239</td>
			<td>
				7.97</td>
			<td>
				1.944</td>
			<td>
				3.265</td>
			<td>
				4.040</td>
			<td>
				4.716</td>
			<td>
				5.542</td>
			<td>
				7.652</td>
			<td>
				1.096</td>
		</tr>
		<tr>
			<td>
				4</td>
			<td>
				303</td>
			<td>
				10.10</td>
			<td>
				0.750</td>
			<td>
				3.182</td>
			<td>
				4.310</td>
			<td>
				5.482</td>
			<td>
				7.074</td>
			<td>
				18.540</td>
			<td>
				2.366</td>
		</tr>
		<tr>
			<td>
				5</td>
			<td>
				293</td>
			<td>
				9.77</td>
			<td>
				0.880</td>
			<td>
				4.424</td>
			<td>
				6.282</td>
			<td>
				7.574</td>
			<td>
				9.214</td>
			<td>
				26.812</td>
			<td>
				3.156</td>
		</tr>
		<tr>
			<td>
				6</td>
			<td>
				297</td>
			<td>
				9.90</td>
			<td>
				0.960</td>
			<td>
				5.225</td>
			<td>
				7.410</td>
			<td>
				10.330</td>
			<td>
				14.050</td>
			<td>
				29.854</td>
			<td>
				4.526</td>
		</tr>
		<tr>
			<td>
				7</td>
			<td>
				290</td>
			<td>
				9.67</td>
			<td>
				0.830</td>
			<td>
				6.111</td>
			<td>
				8.510</td>
			<td>
				12.400</td>
			<td>
				15.470</td>
			<td>
				43.068</td>
			<td>
				5.177</td>
		</tr>
		<tr>
			<td>
				8</td>
			<td>
				252</td>
			<td>
				8.40</td>
			<td>
				0.930</td>
			<td>
				7.125</td>
			<td>
				9.380</td>
			<td>
				13.642</td>
			<td>
				21.808</td>
			<td>
				62.750</td>
			<td>
				6.843</td>
		</tr>
		<tr>
			<td>
				9</td>
			<td>
				278</td>
			<td>
				9.27</td>
			<td>
				0.870</td>
			<td>
				8.470</td>
			<td>
				10.430</td>
			<td>
				15.573</td>
			<td>
				23.071</td>
			<td>
				98.597</td>
			<td>
				10.443</td>
		</tr>
		<tr>
			<td>
				10</td>
			<td>
				249</td>
			<td>
				8.30</td>
			<td>
				1.170</td>
			<td>
				9.083</td>
			<td>
				12.550</td>
			<td>
				17.946</td>
			<td>
				23.132</td>
			<td>
				75.871</td>
			<td>
				8.477</td>
		</tr>
	</tbody>
</table>
<h4>
	Graphs</h4>
<h6>
	Response Time: 30 sec time-series</h6>
<p>
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_front_page_response_times_intervals.png"><img alt="Load_Front_Page_response_times_intervals" border="0" height="103" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_front_page_response_times_intervals_thumb.png" style="margin: 0px; border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Load_Front_Page_response_times_intervals" width="244" /></a></p>
<h6>
	Response Time: raw data (all points)</h6>
<p>
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_front_page_response_times.png"><img alt="Load_Front_Page_response_times" border="0" height="103" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_front_page_response_times_thumb.png" style="margin: 0px; border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Load_Front_Page_response_times" width="244" /></a></p>
<h6>
	Throughput: 30 sec time-series</h6>
<p>
	<a href="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_front_page_throughput.png"><img alt="Load_Front_Page_throughput" border="0" height="103" src="https://www.esdm.co.uk/Data/Sites/1/media/wlw/load_front_page_throughput_thumb.png" style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="Load_Front_Page_throughput" width="244" /></a></p>
<p>
	&nbsp;</p>
<h3>
	Analysis</h3>
<p>
	I am no expert in load testing, so I do not pretend to be able to analyse the results in any meaningful way. Looking to learn though…!</p>
<p>
	But bringing together the most significant statistics from these tests…</p>
<table border="1" cellpadding="2" cellspacing="0" width="574">
	<tbody>
		<tr>
			<td valign="top" width="130">
				Measurement</td>
			<td valign="top" width="116">
				esdm.co.uk</td>
			<td valign="top" width="113">
				esdm.no-ip.co.uk</td>
			<td valign="top" width="131">
				breconfans.org</td>
			<td valign="top" width="82">
				www.wikipedia.org</td>
		</tr>
		<tr>
			<td valign="top" width="130">
				CMS</td>
			<td valign="top" width="116">
				DNN</td>
			<td valign="top" width="113">
				mojoPortal</td>
			<td valign="top" width="131">
				mojoPortal</td>
			<td valign="top" width="82">
				n/a</td>
		</tr>
		<tr>
			<td valign="top" width="130">
				Platform</td>
			<td valign="top" width="116">
				exeGesIS Telehouse hosting.<br />
				Windows Server 2003 + SQL Server 2000</td>
			<td valign="top" width="113">
				exeGesIS Telehouse hosting.<br />
				Windows Server 2008 + SQL Server 2008 R2</td>
			<td valign="top" width="131">
				Arvixe hosting.<br />
				Windows Server 2008 + SQL Server 2008 Express</td>
			<td valign="top" width="82">
				n/a</td>
		</tr>
		<tr>
			<td valign="top" width="130">
				Successful requests</td>
			<td valign="top" width="116">
				1088</td>
			<td valign="top" width="113">
				5105</td>
			<td valign="top" width="131">
				6710</td>
			<td valign="top" width="82">
				2748</td>
		</tr>
		<tr>
			<td valign="top" width="130">
				Minimum response time</td>
			<td valign="top" width="116">
				0.480</td>
			<td valign="top" width="113">
				0.210</td>
			<td valign="top" width="131">
				0.780</td>
			<td valign="top" width="82">
				0.340</td>
		</tr>
		<tr>
			<td valign="top" width="130">
				Average response time</td>
			<td valign="top" width="116">
				12.897</td>
			<td valign="top" width="113">
				2.914</td>
			<td valign="top" width="132">
				2.218</td>
			<td valign="top" width="82">
				4.880</td>
		</tr>
		<tr>
			<td valign="top" width="130">
				95pct response time</td>
			<td valign="top" width="115">
				28.932</td>
			<td valign="top" width="113">
				7.190</td>
			<td valign="top" width="132">
				5.590</td>
			<td valign="top" width="82">
				14.132</td>
		</tr>
		<tr>
			<td valign="top" width="130">
				Average requests / sec</td>
			<td valign="top" width="118">
				3.63</td>
			<td valign="top" width="118">
				17.02</td>
			<td valign="top" width="139">
				22.37</td>
			<td valign="top" width="104">
				9.16</td>
		</tr>
	</tbody>
</table>
<p>
	These identical tests put the web sites under heavy load, particularly after the first minute or so. It is clear that the two mojoPortal sites dramatically out-perform our old esdm.co.uk, with average response times of 2.9 and 2.2 seconds compared with 12.8 over the full test period. The reasons for this are far less clear though.&nbsp; esdm.co.uk and esdm.no-ip.co.uk have about the same amount of content, but this is not really a fair comparison between DotNetNuke and mojoPortal, because esdm.no-ip.co.uk is running on faster servers. Also, we are running the latest version of mojoPortal (2.3.7.5) compared to an ancient version of DNN.</p>
<p>
	Interestingly the minimum response time was 0.48 for esdm.co.uk, significantly faster than the 0.78 seconds for breconfans.org.uk, perhaps because the latter is on US hosting meaning a longer round-trip regardless of other factors; esdm.no-ip.co.uk gave 0.21 seconds minimum, perhaps demonstrating the inherent responsiveness of our new hosting stack.</p>
<p>
	I was surprised that breconfans.org came out better under load than esdm.no-ip.co.uk, but I suspect this is because the latter is a much larger site, with hundreds of pages (and so a much larger mojoPortal database) compared to about 25 pages for breconfans.</p>
<p>
	Testing wikipedia was an afterthought, and of course it is not quite the same because it is always under heavy load; nonetheless it was reassuring to find that my mojoPortal sites performed better, and that the wikipedia performance also degraded through the test as more virtual users were added (though this does make me wonder whether some of the performance degradation is client-side, e.g. inherent bottle-neck in processing http requests in Windows?).</p>
<h3>
	Conclusion</h3>
<p>
	Multi-Mechanize was simple to set up and use (admittedly in a limited manner). It quickly demonstrates what kinds of load web sites can sustain before degrading.</p>
<p>
	More advanced configuration of the test scripts, e.g. to perform form-based operations, should be reasonably easy for our developers. This should give real power for load-testing our web applications.</p>
<p>
	&nbsp;</p>
<p>
	Aside: I found when running the longer tests with lots of threads (e.g. 100) that the routine would not complete after the allotted time, and would stick saying “waiting for all requests to finish”.&nbsp; Usually it would complete after a minute or two extra waiting. If not, no outputs were produced, but killing the python.exe process <em>sometimes</em> caused the output files to be created. This issue has been encountered by others, with no apparent resolution (e.g. <a href="http://groups.google.com/group/multi-mechanize/browse_thread/thread/706c30203c568d61" title="http://groups.google.com/group/multi-mechanize/browse_thread/thread/706c30203c568d61">http://groups.google.com/group/multi-mechanize/browse_thread/thread/706c30203c568d61</a>)</p>
<br /><a href='https://www.esdm.co.uk/trying-out-multi-mechanize-web-performance-and-load-testing-framework'>Crispin Flower</a>&nbsp;&nbsp;<a href='https://www.esdm.co.uk/trying-out-multi-mechanize-web-performance-and-load-testing-framework'>...</a>]]></description>
      <link>https://www.esdm.co.uk/trying-out-multi-mechanize-web-performance-and-load-testing-framework</link>
      <author>crispin.flower@idoxgroup.com (Crispin Flower)</author>
      <comments>https://www.esdm.co.uk/trying-out-multi-mechanize-web-performance-and-load-testing-framework</comments>
      <guid isPermaLink="true">https://www.esdm.co.uk/trying-out-multi-mechanize-web-performance-and-load-testing-framework</guid>
      <pubDate>Tue, 27 Dec 2011 18:46:00 GMT</pubDate>
    </item>
    <item>
      <title>Getting MapServer to work on IIS7.5 Server 2008</title>
      <description><![CDATA[<p>Text below is reproduced from:&nbsp;<a href="http://mas-kono-tes.blogspot.com/2011/03/getting-mapserver-to-work-on-iis75.html">http://mas-kono-tes.blogspot.com/2011/03/getting-mapserver-to-work-on-iis75.html</a>&nbsp;and gives a reasonable overview of how to install mapserver - especially how to navigate IIS 7 menu options.</p>

<p>and CGI install:&nbsp;<a href="http://blogs.iis.net/thomad/archive/2010/04/04/how-to-run-a-cgi-program-under-iis-7-0-or-iis-7-5.aspx">http://blogs.iis.net/thomad/archive/2010/04/04/how-to-run-a-cgi-program-under-iis-7-0-or-iis-7-5.aspx</a></p>

<p>Note: &nbsp;setting paths and env variables is not normally necessary and in fact can be dangerous on systems hosting multiple versions of mapserver&nbsp; or related applications.</p>

<h3>Getting MapServer to work on IIS7.5 Server 2008</h3>

<p>For some reason there doesn't seem to be a lot of documentation on how to install MapServer on IIS7 +. This entry will only cover installation on Windows Server 2008 R2 SP1 (x64) with IIS 7.5.</p>

<p><br />
1. First install&nbsp;<a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2&amp;displaylang=en">Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)</a>.Even though the machine is running Server 2008 (x64) the MapServer binaries that I am using is from MS4W which is for x86. (I have not tried to get the 64 bit version working yet).<br />
<br />
2. From Server Manager select Roles and add the web server role with the following Role services:&nbsp;<br />
&nbsp;</p>

<p>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application Development</p>

<p>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .NET Extensibility</p>

<p>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CGI</p>

<p>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISAPI Extensions</p>

<p>3. Get the MS4W zip file (<a href="http://maptools.org/ms4w/index.phtml?page=downloads.html">ms4w_3.0.1.zip</a>)and extract it to the root directory, (i used C:\ms4w)<br />
<br />
4. Following the instructions&nbsp;<a href="http://www.osgeo.org/pipermail/mapserver-users/2007-November/026549.html">here</a>, I created a separate folder (c:\MapServer) and copied the follow folders into this directory: c:\ms4w\Apache\cgi-bin, C:\ms4w\gdaldata, C:\ms4w\gdalplugins, C:\ms4w\proj and C:\ms4w\tools.</p>

<p><br />
5. Copy the C:\ms4w\setenv.bat file into c:\MapServer and modify it as follows and then run it.</p>

<p>@ECHO OFF<br />
&nbsp;</p>

<p>set PATH=c:\MapServer\\cgi-bin; C:\MapServer\tools\gdal-ogr; C:\MapServer\\tools\mapserv; C:\MapServer\tools\shapelib; C:\MapServer\proj\bin; C:\MapServer\tools\shp2tile; C:\MapServer\tools\shpdiff; C:\MapServer\tools\avce00;<br />
echo GDAL, mapserv, PROJ, and shapelib dll paths set<br />
<br />
set GDAL_DATA=C:\MapServer\gdaldata<br />
echo GDAL_DATA path set<br />
<br />
set GDAL_DRIVER_PATH=C:\MapServer\gdalplugins<br />
echo GDAL_DRIVER_PATH set<br />
<br />
set PROJ_LIB=C:\MapServer\proj\nad<br />
echo PROJ_LIB set<br />
<br />
:ALL_DONE<br />
<br />
6. Right click the C:\MapServer folder, go to the security tab and add the IIS_IUSRS account with Read &amp; execute permissions.<br />
<br />
7. In IIS create a new Website. I called mine Mapping and turned off the default Website. To get CGI working I used the instructions from&nbsp;<a href="http://blogs.iis.net/thomad/archive/2010/04/04/how-to-run-a-cgi-program-under-iis-7-0-or-iis-7-5.aspx">here</a>.</p>

<p align="center">&nbsp;</p>

<p>8. In IIS click on the machine node and select the "ISAPI/CGI restrictions" icon from the Feature view. Select Add and choose C:\MapServer\cgi-bin\MapServ.exe as the "ISAPI or CGI path" and tick the check box for "Allow extension path to execute".<br />
<br />
9. In the Mapping website add a virtual directory (I called mine "cgi") and set the physical path to C:\MapServer\cgi-bin.<br />
&nbsp;&nbsp;<br />
10. Select the newly created cgi virtual directory and select the "Handler Mappings" icon in the Feature view. Click the Edit Feature Permissions link in the action menu and check the box "Execute".<br />
<br />
11. If you now navigate to http://localhost/cgi/mapserv.exe you should see the message:<br />
<br />
No query information to decode. QUERY_STRING is set, but empty<br />
<br />
which means you map server is up and running.<br />
<br />
12. To try out a demo, I created C:\MapServer\apps\Sample directories and then added the example1-1.map file from "<a href="http://maptools.org/dl/ms4w/mapserv_demo_ms4w.zip">MapServer Itasca Demo Application</a>". I also added a Data directory inside sample and added states_ugl.dbf, states_ugl.shp and states_ugl.shx into it. The paths in example1-1.map file needed to be updated to point to the right locations and then you can browse to it using&nbsp;<br />
http://localhost/cgi/mapserv.exe?map=C:/MapServer/apps/sample/example1-1.map&amp;layer=states&amp;mode=map<br />
<br />
Hopefully these instructions may help somebody out. There maybe security issues with this setup so its up to you to figure it out and fix them.</p>
<br /><a href='https://www.esdm.co.uk/getting-mapserver-to-work-on-iis75-server-2008'></a>&nbsp;&nbsp;<a href='https://www.esdm.co.uk/getting-mapserver-to-work-on-iis75-server-2008'>...</a>]]></description>
      <link>https://www.esdm.co.uk/getting-mapserver-to-work-on-iis75-server-2008</link>
      <author>()</author>
      <comments>https://www.esdm.co.uk/getting-mapserver-to-work-on-iis75-server-2008</comments>
      <guid isPermaLink="true">https://www.esdm.co.uk/getting-mapserver-to-work-on-iis75-server-2008</guid>
      <pubDate>Sat, 12 Nov 2011 10:18:00 GMT</pubDate>
    </item>
  </channel>
</rss>