<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tiger Technologies Blog &#187; Tech Corner</title>
	<atom:link href="http://blog.tigertech.net/category/tech-corner/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tigertech.net</link>
	<description>Behind the scenes at tigertech.net</description>
	<lastBuildDate>Tue, 02 Mar 2010 18:33:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Use WP Super Cache for WordPress speed, not W3 Total Cache</title>
		<link>http://blog.tigertech.net/posts/use-wp-super-cache/</link>
		<comments>http://blog.tigertech.net/posts/use-wp-super-cache/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 18:33:10 +0000</pubDate>
		<dc:creator>Robert Mathews</dc:creator>
				<category><![CDATA[Tales From the Support Team]]></category>
		<category><![CDATA[Tech Corner]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.tigertech.net/?p=1068</guid>
		<description><![CDATA[We keep coming across WordPress customer sites that have hurt their performance by switching from the &#8220;WP Super Cache&#8221; plugin we recommend to a newer plugin named &#8220;W3 Total Cache&#8221;. Unfortunately, their site often ends up being far slower after switching to W3 Total Cache.
If you care about the performance of your site, please stick [...]]]></description>
			<content:encoded><![CDATA[<p>We keep coming across WordPress customer sites that have hurt their performance by switching from the &#8220;<a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache</a>&#8221; plugin <a href="http://support.tigertech.net/wordpress-performance">we recommend</a> to a newer plugin named &#8220;<a href="http://wordpress.org/extend/plugins/w3-total-cache/">W3 Total Cache</a>&#8221;. Unfortunately, their site often ends up being far slower after switching to W3 Total Cache.</p>
<p>If you care about the performance of your site, please stick with WP Super Cache unless you have a very good reason to switch. It works, and it works well.</p>
<p>Some people tell us that W3 Total Cache works just as well if it&#8217;s properly configured, and they may well be right &#8212; but it seems like it&#8217;s difficult to configure properly. Our experience is showing that it&#8217;s easy to get wrong, and performance ends up suffering. WP Super Cache makes it easy to get great performance.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tigertech.net/posts/use-wp-super-cache/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP 5.2.6 and Joomla</title>
		<link>http://blog.tigertech.net/posts/php-5-2-6-and-joomla/</link>
		<comments>http://blog.tigertech.net/posts/php-5-2-6-and-joomla/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 00:34:42 +0000</pubDate>
		<dc:creator>Robert Mathews</dc:creator>
				<category><![CDATA[System Status]]></category>
		<category><![CDATA[Tech Corner]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[server updates]]></category>
		<category><![CDATA[status]]></category>

		<guid isPermaLink="false">http://blog.tigertech.net/?p=1028</guid>
		<description><![CDATA[After upgrading our systems to PHP 5.2.6, we received reports of an incompatibility with Joomla. Some URLs do not work when Joomla is configured to use &#8220;Search Engine Friendly URLs&#8221;, but to not have &#8220;Use Apache mod_rewrite&#8221; turned on.
We&#8217;ve investigated this, and it&#8217;s caused by Joomla assuming that PHP has a bug that makes it [...]]]></description>
			<content:encoded><![CDATA[<p>After <a href="/posts/linux-update-2010-02/">upgrading our systems to PHP 5.2.6</a>, we received reports of an incompatibility with Joomla. Some URLs do not work when Joomla is configured to use &#8220;Search Engine Friendly URLs&#8221;, but to not have &#8220;Use Apache mod_rewrite&#8221; turned on.</p>
<p>We&#8217;ve investigated this, and it&#8217;s caused by Joomla assuming that PHP has a bug that makes it work incorrectly, when in fact it&#8217;s supposed to work differently (and is clearly documented to work differently). Older versions of PHP had this bug, but the new version doesn&#8217;t.</p>
<p>To help our customers work around this, we&#8217;ve &#8220;patched&#8221; PHP to intentionally reintroduce the old bug for now, thus keeping it &#8220;compatible&#8221; with Joomla. If you were having trouble with Joomla&#8217;s &#8220;Search Engine Friendly URLs&#8221;, it should be fixed.</p>
<p>We&#8217;ll provide more technical details (and a more robust long-term solution) in the near future.</p>
<p><em>Update: We&#8217;ve also <a href="http://joomlacode.org/gf/project/joomla/tracker/?action=TrackerItemEdit&#038;tracker_item_id=17147">reported this problem to the Joomla developers and suggested a solution</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tigertech.net/posts/php-5-2-6-and-joomla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scheduled maintenance for Linux updates (completed)</title>
		<link>http://blog.tigertech.net/posts/linux-update-2010-02/</link>
		<comments>http://blog.tigertech.net/posts/linux-update-2010-02/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 18:52:04 +0000</pubDate>
		<dc:creator>Robert Mathews</dc:creator>
				<category><![CDATA[System Status]]></category>
		<category><![CDATA[Tech Corner]]></category>
		<category><![CDATA[all servers]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[lenny]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[status]]></category>

		<guid isPermaLink="false">http://blog.tigertech.net/?p=992</guid>
		<description><![CDATA[Due to software updates on our servers, Web hosting customers will experience about seven minutes of scheduled maintenance downtime between 11 PM and 1 AM Pacific time starting on one of the following nights, depending on which server your site is on:

Thursday, February 4 (servers beginning with the letter &#8220;L&#8221;, such as &#8220;lrrr&#8221;)
Friday, February 5 [...]]]></description>
			<content:encoded><![CDATA[<p>Due to software updates on our servers, Web hosting customers will experience about seven minutes of scheduled maintenance downtime between 11 PM and 1 AM Pacific time starting on one of the following nights, depending on <a href="/posts/which-server/">which server your site is on</a>:</p>
<ul>
<li>Thursday, February 4 (servers beginning with the letter &#8220;L&#8221;, such as &#8220;lrrr&#8221;)</li>
<li>Friday, February 5 (all other servers beginning with letters &#8220;F-Z&#8221;, such as &#8220;farnsworth&#8221;)</li>
<li>Saturday, February 6 (servers beginning with letters &#8220;A-E&#8221;, such as &#8220;amy&#8221;)</li>
</ul>
<p><span id="more-992"></span></p>
<h3>What&#8217;s changing?</h3>
<p>Our servers use the <a href="http://www.debian.org/">Debian GNU/Linux</a> operating system, which is updated with new versions every couple of years (just like Windows or Mac OS X). Last year, Debian was updated to <a href="http://www.debian.org/releases/lenny/">version 5.0</a> (aka &#8220;lenny&#8221;), and since then, we&#8217;ve been running a &#8220;mixed&#8221; system. Some programs on each server have already been updated, but other programs still need updating.</p>
<p>We&#8217;re now finalizing the upgrade. This will make sure we can continue to use Debian security updates (they&#8217;ll soon be provided only for version 5.0) to keep our systems secure, and will give customers access to newer versions of some programs. Among the many updates:</p>
<ul>
<li>The Apache Web server will be upgraded from version 2.2.3 to 2.2.9</li>
<li>The MySQL database server will be upgraded from 5.0.32 to 5.0.51a</li>
<li>The PHP scripting language will be upgraded from 5.2.0 to 5.2.6</li>
<li>The Perl scripting language will be upgraded from 5.8.8 to 5.10.0</li>
<li>The default version of the Python scripting language will change from 2.4.4 to 2.5.2</li>
</ul>
<p>Sharp-eyed readers will notice that these are not the newest, &#8220;cutting-edge&#8221; versions available. This is intentional; the philosophy of Debian Linux (and of our hosting platform) is to only use extremely well-tested, tried-and-true versions. We strongly value stability over new features, within reason, because that improves reliability for the majority of our customers.</p>
<p>However, we also want to emphasize that these versions also <a href="/posts/security-updates/">include security updates from later versions</a> &#8212; for example, PHP includes the features from 5.2.6, but also includes security fixes from versions 5.2.7 to 5.2.12.</p>
<h3>Why the downtime?</h3>
<p>Unfortunately, a side-effect of the upgrade is about 7 total minutes of downtime.</p>
<p>We always strive to avoid any downtime, but in this case, it&#8217;s unavoidable: There&#8217;s a four-minute outage while the server is restarted for the new kernel version, and three outages of about a minute each while Apache, PHP, and MySQL are upgraded. During those three periods, we disable access to the Web server to prevent strange technical error messages appearing on your visitor&#8217;s screens.</p>
<p>Incoming mail may be delayed for a few minutes during the maintenance, but as always, no mail will be lost: it will just be queued and delivered a few minutes later.</p>
<h3>Questions?</h3>
<p>Please <a href="http://support.tigertech.net/contact">contact our support team</a> if you have any questions. We appreciate your business!</p>
<p><em>Update: The maintenance was completed as scheduled.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tigertech.net/posts/linux-update-2010-02/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Super-fast database writes with INSERT DELAYED</title>
		<link>http://blog.tigertech.net/posts/insert-delayed/</link>
		<comments>http://blog.tigertech.net/posts/insert-delayed/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 00:20:13 +0000</pubDate>
		<dc:creator>Ken</dc:creator>
				<category><![CDATA[Tech Corner]]></category>
		<category><![CDATA[Useful Tips]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://blog.tigertech.net/?p=973</guid>
		<description><![CDATA[Many Web sites write data to a database. Usually, the data absolutely must be properly saved, so the default way of adding records (using an SQL &#8220;INSERT&#8221; statement) ensures that the data is permanently stored on the server&#8217;s disks. Doing that takes a relatively long time in computer terms &#8212; it&#8217;s much slower than most [...]]]></description>
			<content:encoded><![CDATA[<p>Many Web sites write data to a database. Usually, the data absolutely must be properly saved, so the default way of adding records (using an SQL &#8220;INSERT&#8221; statement) ensures that the data is permanently stored on the server&#8217;s disks. Doing that takes a relatively long time in computer terms &#8212; it&#8217;s much slower than most things computers do.</p>
<p>In some cases, you might be storing data that&#8217;s not quite so important. And if it means your application can run much faster, you might be willing to risk a very small chance of data loss. That&#8217;s where MySQL&#8217;s &#8220;INSERT DELAYED&#8221; statement, which works with MyISAM table types (but not InnoDB tables), can be useful. (Tables are created as type MyISAM by default, so most tables are eligible to benefit from this tip.)</p>
<p><span id="more-973"></span></p>
<p>Adding the word &#8220;DELAYED&#8221; to your statement tells MySQL to remember the data to be added and return immediately to your application. MySQL will then write the data as soon as the database isn&#8217;t busy. This lets your insertion happen (effectively) immediately, and reduces the load on the database (and server). Using this technique can give your application a huge performance gain.</p>
<p>Since the record is not written immediately, there is a very small chance that the data will be lost before it&#8217;s written to the disk. However, the odds of this happening are very small. It would only happen if MySQL crashed before it had a moment of idle time to write out the record, if the server lost power, or if some similar unexpected event happened.</p>
<p>Using &#8220;INSERT DELAYED&#8221; is recommended for applications that do not absolutely depend upon records being immediately written. Any data which is only referred to at a later time (rather than on-demand) or in a summary fashion is a good candidate for using &#8220;INSERT DELAYED&#8221;. Some examples are logging the IP address of each visitor, or tracking ad impressions for each page viewed on your Web site. Be sure to read the <a href="http://dev.mysql.com/doc/refman/5.0/en/insert-delayed.html">official documentation</a> for full details and additional considerations.</p>
<p>If you want to use &#8220;INSERT DELAYED&#8221;, first check the documentation to see if your application already supports it. If it does not, you&#8217;d need to modify the application. If you have any questions about whether a particular database table is a good candidate for using &#8220;INSERT DELAYED&#8221;, just ask us and we&#8217;ll take a look.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tigertech.net/posts/insert-delayed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Servers now have direct Gigabit Internet links</title>
		<link>http://blog.tigertech.net/posts/gigabit-ethernet/</link>
		<comments>http://blog.tigertech.net/posts/gigabit-ethernet/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 22:10:13 +0000</pubDate>
		<dc:creator>Robert Mathews</dc:creator>
				<category><![CDATA[Tech Corner]]></category>
		<category><![CDATA[gigabit]]></category>

		<guid isPermaLink="false">http://blog.tigertech.net/?p=929</guid>
		<description><![CDATA[We&#8217;ve finished upgrading our network so that all of our customer Web hosting and mail servers have full, direct gigabit links to Internet peering points, with no 100 megabit Ethernet segments anywhere. This involved replacing old Ethernet switches and retiring old servers, and now we&#8217;re more than ready for the future.

Many other companies still run [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve finished upgrading our network so that all of our customer Web hosting and mail servers have full, direct gigabit links to Internet peering points, with no 100 megabit Ethernet segments anywhere. This involved replacing old Ethernet switches and retiring old servers, and now we&#8217;re more than ready for the future.</p>
<p><span id="more-929"></span></p>
<p>Many other companies still run their servers on slower 100 Mbps Ethernet connections, leading to slow speeds for all sites on a busy server that experiences a sudden burst of traffic. We don&#8217;t have that limitation, which is why we can now allow individual sites to <a href="http://support.tigertech.net/bandwidth">&#8220;burst&#8221; up to 100 Mbps</a> without affecting other sites on the same server.</p>
<p>Of course, good network performance means more than just raw throughput &#8212; low latency (&#8221;ping time&#8221;) is also important.</p>
<p>If you think of a network as being like a road, &#8220;throughput&#8221; is [sort of] the measure of how many cars the road can handle per second, and &#8220;latency&#8221; is [sort of] the time it takes an individual car to get from one end of the road to another. It&#8217;s no good having a wide, gridlocked road that can handle lots of cars at 5 miles an hour, and it&#8217;s no good having a road that allows only a small handful of fast-moving cars. </p>
<p>Our network has both high throughput and low latency. For example, I just transferred a large file from kernel.org to one of our hosting servers at over 180 Mbps, and a quick ping test shows our latency to www.yahoo.com and www.google.com is under 3 ms:</p>
<p><code>$ ping -n -c 3 www.yahoo.com<br />
PING www-real.wa1.b.yahoo.com (209.131.36.158) 56(84) bytes of data.<br />
64 bytes from 209.131.36.158: icmp_seq=1 ttl=59 time=1.71 ms<br />
64 bytes from 209.131.36.158: icmp_seq=2 ttl=59 time=1.69 ms<br />
64 bytes from 209.131.36.158: icmp_seq=3 ttl=59 time=1.80 ms</code></p>
<p><code>$ ping -n -c 3 www.google.com<br />
PING www.l.google.com (74.125.19.105) 56(84) bytes of data.<br />
64 bytes from 74.125.19.105: icmp_seq=1 ttl=59 time=2.22 ms<br />
64 bytes from 74.125.19.105: icmp_seq=2 ttl=59 time=1.80 ms<br />
64 bytes from 74.125.19.105: icmp_seq=3 ttl=59 time=1.91 ms<br />
</code></p>
<p>By the way, if you try your own speed tests (or try <a href="http://support.tigertech.net/speed-test">ours</a>), be sure to notice if they&#8217;re measuring the speed in mega<strong>bits</strong> per second (Mbps), mega<strong>bytes</strong> per second (MBps), kilo<strong>bits</strong> per second (Kbps), or kilo<strong>bytes</strong> per second (KBps).</p>
<p>Those are easy to mix up, and we sometimes hear complaints like &#8220;My Internet connection is supposed to be 1500 Kbps (1.5 Mbps), but my FTP program says I&#8217;m only getting 187 KBps.&#8221; Those are all the same speeds, just measured in different units.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tigertech.net/posts/gigabit-ethernet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Better performance from WP Super Cache</title>
		<link>http://blog.tigertech.net/posts/better-performance-from-wp-super-cache/</link>
		<comments>http://blog.tigertech.net/posts/better-performance-from-wp-super-cache/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 18:58:22 +0000</pubDate>
		<dc:creator>Robert Mathews</dc:creator>
				<category><![CDATA[Tech Corner]]></category>
		<category><![CDATA[Useful Tips]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[WP Super Cache]]></category>

		<guid isPermaLink="false">http://blog.tigertech.net/?p=922</guid>
		<description><![CDATA[If you use the WP Super Cache WordPress plugin (and you should, if you use WordPress), it has a settings page section titled &#8220;Expiry Time &#038; Garbage Collection&#8221;. It sets the &#8220;Expire time&#8221; to 3600 seconds by default, and warns that you should set it lower on a busy site.
That advice makes sense if you [...]]]></description>
			<content:encoded><![CDATA[<p>If you use the <a href="http://support.tigertech.net/wordpress-performance">WP Super Cache</a> WordPress plugin (and you should, if you use WordPress), it has a settings page section titled &#8220;Expiry Time &#038; Garbage Collection&#8221;. It sets the &#8220;Expire time&#8221; to 3600 seconds by default, and warns that you should set it lower on a busy site.</p>
<p>That advice makes sense if you have a sudden surge of traffic to a single page. However, if your site is generally very busy across all pages (for example, if you have an archive of hundreds or thousands of posts that are constantly being indexed by search engines), we&#8217;ve found that you should do the opposite to improve performance: set it much higher. We recommend setting it to <strong>172800 seconds</strong> (which is 48 hours). This can cut your CPU usage in half, which will speed up your site.</p>
<p><span id="more-922"></span></p>
<p>The reason for this is that when WP Super Cache creates a cached page, it wants to make sure that those pages don&#8217;t build up forever. Every ten minutes or so, it looks through them all and deletes any that are older than the &#8220;expire time&#8221;.</p>
<p>On some servers that use a network file system called &#8220;NFS&#8221;, looking through a large number of files causes performance problems. That&#8217;s why the WP Super Cache author recommends making them expire quickly: it reduces the number of files it has to examine each time.</p>
<p>On our servers, we don&#8217;t use NFS and looking through lots of files does not cause a performance problem. Leaving the files for a longer time is safe and increases the chance that a page will already be cached when it&#8217;s needed.</p>
<p>If you&#8217;re a Tiger Technologies customer who makes this change and you want to see how it affects the CPU usage, just let us know and we can provide you with details.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tigertech.net/posts/better-performance-from-wp-super-cache/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Followup to Friday problem</title>
		<link>http://blog.tigertech.net/posts/followup-to-friday-problem/</link>
		<comments>http://blog.tigertech.net/posts/followup-to-friday-problem/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 18:47:43 +0000</pubDate>
		<dc:creator>Robert Mathews</dc:creator>
				<category><![CDATA[System Status]]></category>
		<category><![CDATA[Tech Corner]]></category>

		<guid isPermaLink="false">http://blog.tigertech.net/?p=907</guid>
		<description><![CDATA[On Friday, a problem made our &#8220;My Account&#8221; control panel system unavailable for about three hours, and caused some other problems as well. We promised we&#8217;d follow up with more details.

First of all, the problem: Our primary internal PostgreSQL database server (which we use to manage all customer data) completely failed due to a nasty [...]]]></description>
			<content:encoded><![CDATA[<p>On Friday, <a href="/posts/unexpected-problem-2010-01-15/">a problem made our &#8220;My Account&#8221; control panel system unavailable</a> for about three hours, and caused some other problems as well. We promised we&#8217;d follow up with more details.</p>
<p><span id="more-907"></span></p>
<p>First of all, the problem: Our primary internal PostgreSQL database server (which we use to manage all customer data) completely failed due to a nasty problem: a program on the server tried to delete every file on the disk.</p>
<p>The way this happened was surprising. A long time ago, our database server had a certain Debian GNU/Linux software &#8220;package&#8221; installed that &#8212; somehow &#8212; erroneously created a user with a &#8220;home directory&#8221; set to the top level of the entire disk (&#8221;/&#8221;). This caused no harm for almost two years&#8230; until we removed the obsolete, unused package while cleaning up odds and ends. The automatic package uninstallation script then began to delete all the files in the &#8220;/&#8221; directory. The script deleted several important files, including some necessary to &#8220;boot&#8221; that server, before we stopped it.</p>
<p>When the worst happens, we have a plan to recover from database failures:</p>
<ul>
<li>If the server hardware somehow fails (despite having redundant hard drives, power supplies, etc.), we can move the data disks to a spare server. This can be done in a few minutes.</li>
<li>If the database files are corrupted or unavailable, we can restore from the correct onsite or offsite hourly backup, re-apply changes made since that backup (either manually or through database &#8220;journal logs&#8221;), and make it available again. This takes longer and is more tedious and error-prone.</li>
</ul>
<p>In this case, we knew that some of the files on the server had been deleted, but it wasn&#8217;t clear which ones. That caused a significant delay while we contemplated whether it was safe to use the files of the existing database, or whether we needed to restore the database from backups. We eventually determined that it was safe to use the existing data, and restored things to a working state on a spare server.</p>
<p>Unfortunately, it took longer than we&#8217;d like to make sure all our systems that rely on databases were fully functional, and there were several things that we&#8217;d like to have avoided even if &#8220;My Account&#8221; was temporarily not working:</p>
<ul>
<li>The server problem also made our own www.tigertech.net Web site completely stop working for a short time.</li>
<li>Our <a href="http://blog.tigertech.net/">blog.tigertech.net</a> pages relied on the same database server, so we couldn&#8217;t communicate the status well.</li>
<li>Some people saw error messages when using the Webmail system to read certain messages. This shouldn&#8217;t happen; the Webmail system is designed to be independent of our database system.</li>
<li>Our &#8220;<a href="http://support.tigertech.net/">Support</a>&#8221; pages don&#8217;t work properly when the database is unavailable. This is actually a known issue; the pages are entirely database-driven from what amounts to a custom wiki on our end. On balance, this drawback is probably worth it; it allows our staff to make changes very easily (the ease of changes keeps it up-to-date and comprehensive), and we also customize pages for each viewer depending on what accounts they have with us.</li>
</ul>
<h3>&#8220;Learning is fun!&#8221;</h3>
<p>That&#8217;s a sarcastic comment (from Futurama&#8217;s <a href="http://en.wikipedia.org/wiki/Bender_Bending_Rodríguez">Bender</a> character), of course. This kind of learning is actually not fun at all. On the other hand, one of the things we&#8217;re committed to is the idea of continuous improvement (fans of management systems probably know about <a href="http://en.wikipedia.org/wiki/Kaizen">&#8220;Kaizen&#8221;, or 改善</a>). Each problem is an opportunity to make things better.</p>
<p>Any sufficiently advanced computer system is a web of interdependent parts that humans have difficulty understanding. Occasional failures are probably inevitable. But when we have a problem, we want to learn from it.</p>
<p>To that end, we&#8217;re making the following changes:</p>
<ul>
<li>We&#8217;ve added a check to ensure that no software package ever uses the top level of the disk as its home directory.</li>
<li>We&#8217;ve made sure that blog.tigertech.net does not rely on our primary database system at all (it&#8217;s self-contained on servers in a completely separate data center), so we can use it to communicate with customers no matter what happens. If you normally reach our blog via a link on our main Web site, you should take a moment now to create a bookmark for <a href="http://blog.tigertech.net">blog.tigertech.net</a> that you can use later (in case you somehow can&#8217;t reach our main site).</li>
<li>We now have a simple way for any employee here to add a status update banner to every page on our site.</li>
<li>We&#8217;re documenting improvements to our procedure for restoring database backups, avoiding several little annoyances that cost us valuable minutes.</li>
<li>We&#8217;re fixing the software problem that causes some Webmail error messages during database failures.</li>
</ul>
<p>And long-term, we&#8217;re looking into these:</p>
<ul>
<li>Adding the ability for our &#8220;Support&#8221; pages to work in a degraded, non-customized mode when the database is not available.</li>
<li>Using the &#8220;<a href="http://wiki.postgresql.org/wiki/Streaming_Replication">streaming replication</a>&#8221; and/or &#8220;<a href="http://wiki.postgresql.org/wiki/Hot_Standby">hot standby</a>&#8221; features that will be available in a forthcoming version of PostgreSQL to provide better database redundancy.</li>
<li>Using a snapshot-able file system like <a href="http://btrfs.wiki.kernel.org/index.php/Main_Page">Btrfs</a> to more easily recover from processes that destroy data on a disk.</li>
<li>Better segregation of changing data (databases, etc.) and unchanging data (program files and the root level of disks) on our servers, putting the unchanging data on partitions that are read-only and undeletable. The runaway file deletion process would not have caused problems if the root file system on this server was mounted in &#8220;read-only&#8221; mode.</li>
</ul>
<p>We&#8217;re always trying to improve, and we regret that our best side wasn&#8217;t on display last Friday. We apologize for the inconvenience caused to our customers.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tigertech.net/posts/followup-to-friday-problem/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress 2.8.6 security update</title>
		<link>http://blog.tigertech.net/posts/wordpress-2-8-6-security-update/</link>
		<comments>http://blog.tigertech.net/posts/wordpress-2-8-6-security-update/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 21:44:42 +0000</pubDate>
		<dc:creator>Robert Mathews</dc:creator>
				<category><![CDATA[Tech Corner]]></category>
		<category><![CDATA[Useful Tips]]></category>
		<category><![CDATA[mod_security]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.tigertech.net/?p=863</guid>
		<description><![CDATA[If you use WordPress blog software on your site, be sure to upgrade to WordPress 2.8.6. The upgrade contains important security fixes. Upgrading is usually easy with the built-in WordPress &#8220;update now&#8221; feature.
Although all WordPress users should upgrade, we&#8217;ve added security rules to our servers to protect our Web hosting customers who haven&#8217;t yet upgraded. [...]]]></description>
			<content:encoded><![CDATA[<p>If you use WordPress blog software on your site, be sure to upgrade to <a href="http://wordpress.org/development/2009/11/wordpress-2-8-6-security-release/">WordPress 2.8.6</a>. The upgrade contains important security fixes. Upgrading is usually easy with the built-in WordPress &#8220;update now&#8221; feature.</p>
<p>Although all WordPress users should upgrade, we&#8217;ve added security rules to our servers to protect our Web hosting customers who haven&#8217;t yet upgraded. Other people may find the rules useful if they use <a href="http://www.modsecurity.org/">mod_security</a> on Apache Web servers. The rest of this post contains more technical details.</p>
<p><span id="more-863"></span></p>
<h3>Surprising Apache script behavior</h3>
<p>One of the fixes in WordPress 2.8.6 compensates for a peculiar and surprising feature (or bug, if you prefer) in the Apache Web server: in many cases, it will run a file with a name like &#8220;image.php.jpeg&#8221; as a PHP script.</p>
<p>Some software (like WordPress 2.8.5 and earlier) can be configured to allow strangers to upload JPEG and other files to your site &#8212; but it checks only the &#8220;.jpeg&#8221; file extension to see if the uploaded file is safe. So a &#8220;hacker&#8221; could upload a malicious PHP script named &#8220;image.php.jpeg&#8221;, then &#8220;view the image&#8221; in a Web browser&#8230; but the server would actually run the PHP script.</p>
<p>Because of that, we&#8217;ve added a mod_security rule that prevents site visitors from requesting certain file extensions that include &#8220;.php.&#8221; in their name. (There are <a href="http://core.trac.wordpress.org/ticket/11122">other possible solutions</a>, but testing has shown this is the least intrusive to our existing customers.)</p>
<p>Here&#8217;s a mod_security rule that accomplishes that (adjust the extensions to suit your taste; these are the WordPress 2.8.5 allowed extensions):</p>
<p><code>SecRule REQUEST_FILENAME "\.php[456]?\.(asf|asx|avi|bmp|gif|ico|jpe|jpeg|jpg|png|tif|tiff|wax|wmv|wmx)$" "deny,status:412,auditlog"</code></p>
<h3>WordPress brute force attacks</h3>
<p>Another recently reported attack against WordPress (which is unrelated to version 2.8.6 in particular) involves &#8220;brute force&#8221; attempts to guess the administrator password. The proper solution is to choose a good password for your blog (not a word from the dictionary!), but some people don&#8217;t do that.</p>
<p>To reduce the risk of successful attacks against our customers, we limit each IP address to 25 &#8220;wp-login.php&#8221; attempts within a five minute period. Here&#8217;s how you can do that with mod_security:</p>
<p><code>SecAction phase:1,initcol:ip=%{REMOTE_ADDR},nolog<br />
SecRule REQUEST_LINE "post .*/wp-login" "nolog,phase:1,setvar:ip.wordpress_login=+1,deprecatevar:ip.wordpress_login=5/60"<br />
SecRule IP:WORDPRESS_LOGIN "@gt 25" "deny,status:412,auditlog,chain"<br />
SecRule REQUEST_LINE "post .*/wp-login"</code></p>
<p>This unfortunately doesn&#8217;t prevent &#8220;distributed&#8221; attacks in which many different IP addresses submit different password guesses, but it will help in many cases.</p>
<h3>Summary</h3>
<p>So: if you use WordPress yourself, be sure to update. And if you provide blog hosting services for others, consider adding the mod_security rules to your Apache server.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tigertech.net/posts/wordpress-2-8-6-security-update/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails 2.2.3</title>
		<link>http://blog.tigertech.net/posts/ruby-on-rails-2-2-3/</link>
		<comments>http://blog.tigertech.net/posts/ruby-on-rails-2-2-3/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 00:27:27 +0000</pubDate>
		<dc:creator>Robert Mathews</dc:creator>
				<category><![CDATA[Tech Corner]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[server updates]]></category>

		<guid isPermaLink="false">http://blog.tigertech.net/?p=822</guid>
		<description><![CDATA[We’ve updated the default version of Ruby on Rails on our servers to version 2.2.3.

If you use Rails and you haven’t explicitly chosen to stick with an existing version, it’s a good idea to check your applications and make sure there are no problems. But if you’re concerned about compatibility, it’s probably best to freeze [...]]]></description>
			<content:encoded><![CDATA[<p>We’ve updated the default version of <a href="http://support.tigertech.net/ruby">Ruby on Rails</a> on our servers to version 2.2.3.</p>
<p><span id="more-822"></span></p>
<p>If you use Rails and you haven’t explicitly <a href="http://support.tigertech.net/ruby#rails-version">chosen to stick with an existing version</a>, it’s a good idea to check your applications and make sure there are no problems. But if you’re concerned about compatibility, it’s probably best to <a href="http://support.tigertech.net/freeze-rails">freeze Rails</a> anyway so that server upgrades like this can’t affect your application.</p>
<p>Note that this version still isn&#8217;t the latest version of Rails, the 2.3 series. We&#8217;ll be updating to that shortly (for technical reasons, we needed to make sure we were using the last version of the 2.2 series first &#8212; of course, you can always <a href="http://support.tigertech.net/freeze-rails#3">install your own version</a>, which is why we don&#8217;t necessarily make the latest version the default). The 2.3 series will introduce even bigger changes, so again, make sure you&#8217;ve frozen your version if you don&#8217;t want your applications to break.</p>
<p>By the way, if you haven&#8217;t frozen your application and you have problems with &#8220;No route matches&#8221; errors in 2.2.3, make sure you&#8217;ve followed the &#8220;3. Edit config/environment.rb&#8221; instructions on our <a href="http://support.tigertech.net/ruby">Rails example</a> page. That should fix it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tigertech.net/posts/ruby-on-rails-2-2-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache Web server logging extra &#8220;500&#8221; errors (fixed)</title>
		<link>http://blog.tigertech.net/posts/extra-500-errors/</link>
		<comments>http://blog.tigertech.net/posts/extra-500-errors/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 03:45:46 +0000</pubDate>
		<dc:creator>Robert Mathews</dc:creator>
				<category><![CDATA[System Status]]></category>
		<category><![CDATA[Tech Corner]]></category>
		<category><![CDATA[status]]></category>

		<guid isPermaLink="false">http://blog.tigertech.net/?p=756</guid>
		<description><![CDATA[Our Web hosting customers who use FastCGI have been seeing extra &#8220;500 internal server&#8221; errors in their logs and statistics since September 12.
The good news is that this is just a logging bug caused by a recent Apache Web server update. Visitors to your site are seeing exactly what they always saw, and there isn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Our Web hosting customers who use <a href="http://support.tigertech.net/fastcgi">FastCGI</a> have been seeing extra &#8220;500 internal server&#8221; errors in their logs and statistics since September 12.</p>
<p>The good news is that this is just a logging bug caused by a recent Apache Web server update. Visitors to your site are seeing exactly what they always saw, and there isn&#8217;t any problem besides the incorrect logging.</p>
<p><span id="more-756"></span></p>
<p>The bug happens when a computer connects to your site and successfully requests a page, but closes the connection before the entire page is received.</p>
<p>That situation happens fairly often with <a href="https://developer.mozilla.org/en/Link_prefetching_FAQ">Mozilla browser &#8220;prefetching&#8221;</a>, for instance. It&#8217;s especially common on WordPress blogs because they contain prefetching hints.</p>
<p>Previous version of Apache would log these broken connections as a successful &#8220;200&#8243; status code, albeit with a smaller-than-normal size. That makes sense: there&#8217;s no problem on the server end. But <a href="http://mail-archives.apache.org/mod_mbox/httpd-dev/200907.mbox/&lt;20090703100048.GA4492%40redhat.com&gt;">this Apache bug fix</a> causes an interrupted connection to send a much quicker notice to the FastCGI Apache module. That module logs the unfinished page as a 500 error, even though there&#8217;s nothing happening that hasn&#8217;t aways happened.</p>
<p>We plan to patch the FastCGI module to prevent it from changing the logging, which will fix this annoyance. We&#8217;ll post an update as soon as this change has been made.</p>
<p><em>Update September 18: This issue has been fixed on all our servers as of 1:10 PM Pacific time.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tigertech.net/posts/extra-500-errors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
