<?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>TheHippo &#187; hosting</title>
	<atom:link href="http://blog.thehippo.de/tag/hosting/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.thehippo.de</link>
	<description>if (i=1) throw null;</description>
	<lastBuildDate>Wed, 02 Mar 2011 18:06:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Suppress Apache to give away too much information</title>
		<link>http://blog.thehippo.de/2009/09/server/suppress-apache-to-give-away-to-much-information/</link>
		<comments>http://blog.thehippo.de/2009/09/server/suppress-apache-to-give-away-to-much-information/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 12:48:53 +0000</pubDate>
		<dc:creator>Hippo</dc:creator>
				<category><![CDATA[Server]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.thehippo.de/?p=68</guid>
		<description><![CDATA[Just for fun I looked at the headers generated by website I made and where I am responsible for the administration of the Apache server I discovered this:
HTTP/1.1 200 OK
Date: Sun, 06 Sep 2009 11:44:56 GMT
Server: Apache/2.2.8 (Ubuntu) DAV/2 SVN/1.4.6
X-Powered-By: PHP/5.2.4-2ubuntu5.7
Connection: close
Content-Type: text/html
Actually I think no one needs to know which PHP version is ...]]></description>
			<content:encoded><![CDATA[<p>Just for fun I looked at the <a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol" target="_blank">headers</a> generated by website I made and where I am responsible for the administration of the <a title="Apache" href="http://httpd.apache.org/" target="_blank">Apache</a> server I discovered this:</p>
<pre>HTTP/1.1 200 OK
Date: Sun, 06 Sep 2009 11:44:56 GMT
Server: Apache/2.2.8 (Ubuntu) DAV/2 SVN/1.4.6
X-Powered-By: PHP/5.2.4-2ubuntu5.7
Connection: close
Content-Type: text/html</pre>
<p>Actually I think no one needs to know which <a title="PHP" href="http://www.php.net/" target="_blank">PHP</a> version is running on this machine and that there also a <a title="SVN" href="http://subversion.tigris.org/" target="_blank">Subversion</a> is running on that machine. Even the name of the operating system and the version of the Apache is not needed in most cases.</p>
<p><strong>So how suppress these information?</strong></p>
<h2><span id="more-68"></span>Disable the &#8220;X-Powered-By&#8221;</h2>
<ul>
<li>Log in to your server as root user.</li>
<li>Open you <em>php.ini</em> file in a editor of you choice. My <em>php.ini</em> is located at <em>/etc/php5/cgi/</em> (as I use <a href="http://blog.thehippo.de/2009/08/server/crashing-virtual-servers-2/" target="_blank">mod_fcgid</a> to server PHP content)</li>
<li>Search and edit:
<pre>; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header).  It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
expose_php = Off</pre>
<p>If you like you read in the official <a title="expose_php documentation" href="www.php.net/manual/ini.core.php">PHP documentation</a>.</li>
<li>Save and reload you Apache:
<pre>/etc/init.d/apache2 force-reload</pre>
</li>
</ul>
<h2>Disable the &#8220;Server&#8221;-header</h2>
<p>After searching for  while I figured out that disabling the &#8220;Server&#8221;-header is not possible, without recompiling the Apache. (The Apache developers <a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=40026" target="_blank">claim this as a feature</a>.)  But you could decide between some level of information that will be provided.</p>
<ul>
<li>If you are not logged in, log in as root user.</li>
<li>Open you Apache configuration, for me it was <em>/etc/apache2/apache2.conf</em></li>
<li>Search for and edit the following lines:
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1"># ServerTokens</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># This directive configures what you return as the Server HTTP response</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># Header. The default is &#8216;Full&#8217; which sends information about the OS-Type</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># and compiled in modules.</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1"># Set to one of: &nbsp;Full | OS | Minor | Minimal | Major | Prod</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># where Full conveys the most information, and Prod the least.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">#</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">ServerTokens</span> Full</div>
</li>
</ol>
</div>
</li>
<li>Replace the <em>Full</em> with some of the options given in the comment. Here are some examples what these options are meaning:<br />
<table border="0">
<tbody>
<tr>
<td>Full</td>
<td>Server: Apache/2.2.8 (Ubuntu) DAV/2 SVN/1.4.6</td>
</tr>
<tr>
<td>OS</td>
<td>Server: Apache/2.2.8 (Ubuntu)</td>
</tr>
<tr>
<td>Minor</td>
<td>Server: Apache/2.2.8</td>
</tr>
<tr>
<td>Minimal</td>
<td>Server: Apache/2.2</td>
</tr>
<tr>
<td>Major</td>
<td>Server: Apache/2</td>
</tr>
<tr>
<td>Prod</td>
<td>Server: Apache</td>
</tr>
</tbody>
</table>
<p>If you like you could also read the <a title="mod_core documentation" href="http://httpd.apache.org/docs/2.2/mod/core.html#servertokens" target="_blank">official documentation</a>.</li>
<li>Save and reload you Apache:
<pre>/etc/init.d/apache2 force-reload</pre>
</li>
</ul>
<h2>Result</h2>
<p>I had chosen <em>Major</em> in the last step. Now the headers look like this:</p>
<pre>HTTP/1.1 200 OK
Date: Sun, 06 Sep 2009 12:16:40 GMT
Server: Apache/2
Connection: close
Content-Type: text/html</pre>
<p id="firstHeading"><strong>Important note</strong>: This does not improve the security of the server, because you are only hiding information. Maybe you want to read: <a title="Security through obscurity" href="http://en.wikipedia.org/wiki/Security_through_obscurity" target="_blank">Security through obscurity</a>.</p>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://blog.thehippo.de/2009/09/server/suppress-apache-to-give-away-to-much-information/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crashing virtual servers</title>
		<link>http://blog.thehippo.de/2009/08/server/crashing-virtual-servers/</link>
		<comments>http://blog.thehippo.de/2009/08/server/crashing-virtual-servers/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 11:14:36 +0000</pubDate>
		<dc:creator>Hippo</dc:creator>
				<category><![CDATA[Server]]></category>
		<category><![CDATA[1und1]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[vHost]]></category>
		<category><![CDATA[virtual server]]></category>

		<guid isPermaLink="false">http://blog.thehippo.de/?p=36</guid>
		<description><![CDATA[After leaving my last company I rented a small virtual server at 1und1. I took the XL vHost package which contains:

	20 GB Raid 5 Storage
	512 MB RAM, max 2 GB RAM
	2 TB Traffic

At this time I thought it would be nice to install every thing by myself, so I choose a plain "Ubuntu 8.04 ...]]></description>
			<content:encoded><![CDATA[<p>After leaving my last company I rented a small virtual server at <a title="1und1" href="http://www.1und1.info" target="_blank">1und1</a>. I took the <a title="1und1 XL virtual host package" href="http://www.1und1.info/xml/order/VirtualServerXL" target="_blank">XL vHost</a> package which contains:</p>
<ul>
<li>20 GB Raid 5 Storage</li>
<li>512 MB RAM, max 2 GB RAM</li>
<li>2 TB Traffic</li>
</ul>
<p>At this time I thought it would be nice to install every thing by myself, so I choose a plain &#8220;Ubuntu 8.04 LTS 64 bit minimal&#8221; as operating system for my vHost. I installed Apache2, PHP5, MySQL and all the stuff I needed. It all works fine and I was really impressed by the speed of this virtual server.</p>
<p>Then I moved <a title="www.sportinleipzig.de" href="http://www.sportinleipzig.de" target="_blank">sportinleipzig.de</a>, which I made during the time at my last company to this new server. This page does not have a very high traffic (200 unique visitors a day), but a lot of content (at least 5000 &#8220;static&#8221; pages). After 2 days the server crashed the first time, whereas crash means, that he is still alive, but does not respond to anything more then a simple ping. I restarted the server over the admin panel. Half a week later the server crashed the next time. Investigating the cause for these crashed I found out a few interesting things.<span id="more-36"></span></p>
<p>First a blamed <a title="mod_tora" href="http://ncannasse.fr/blog/mod_tora" target="_blank">mod_tora</a> which I installed on this virtual server to check if it is ready to use for some production code. Then I deactivated <a title="eAccelerator" href="http://blog.thehippo.de/2009/08/server/eaccelerator-on-ubuntu/" target="_blank">eAccelerator</a>, because I thought it could be possible that it has some memory leaks. I even deactivated <a title="Piwik" href="http://piwik.org/" target="_blank">Piwik</a> which I use as a tracking system for all the visitors on the pages of this server. (It is very nice! If you need some visitor tracking, give it a try.) But the server still crashed ever few days.</p>
<p>Later I recognized that these crashes possibly occur when Google starts to crawl the page, as the page was not completely indexed anymore. So I started to do some load test on the server. A good page to start is <a title="loadimpact.com" href="http://loadimpact.com" target="_blank">loadimpact.com</a> and the Apache command line tool <a title="Apache Benchmark" href="http://httpd.apache.org/docs/2.0/programs/ab.html" target="_blank">ab</a>, which both give you the possibility to run a lot of requests on you own server. Having a ssh session open and refreshing the status page of the Virtuozzo panel it became more and more clear. These kind of virtual server are very restricted how many resources they could consume and there a few limit that are easy to reach:</p>
<ul>
<li><strong>kmemsize</strong>:<br />
<blockquote><p>The size of unswappable kernel memory allocated for the internal kernel structures for the processes of a particular VPS.</p></blockquote>
</li>
<li><strong>shmpages</strong>:<br />
<blockquote><p>The total size of shared memory (including IPC, shared anonymous mappings and tmpfs objects) allocated by the processes of a particular VPS, in pages.</p></blockquote>
</li>
<li><strong>numproc</strong> (maximum set to 128!):<br />
<blockquote><p>The maximal number of processes the VPS may create.</p></blockquote>
</li>
<li><strong>numfile</strong> (maximum set to 8192, this is okay):<br />
<blockquote><p>The number of files opened by all VPS processes.</p></blockquote>
</li>
<li><strong>numtcpsock</strong> and <strong>numothersock</strong> (both set to 720, means: no socket servers on virtual servers!):<br />
<blockquote><p>he number of TCP sockets (PF_INET family, SOCK_STREAM type). This parameter limits the number of TCP connections and, thus, the number of clients the server application can handle in parallel.</p></blockquote>
<blockquote><p>The number of sockets other than TCP ones. Local (UNIX-domain) sockets are used for communications inside the system. UDP sockets are used, for example, for Domain Name Service (DNS) queries. UDP and other sockets may also be used in some very specialized applications (SNMP agents and others).</p></blockquote>
</li>
</ul>
<p>There are a lot of other limits set to the server, but the first three are these limits that made my server crash, when having tons of requests on the Apache.</p>
<p>I am using the Apache2 in the prefork mode (this is default if you install it via the Ubuntu repositories). This means the Apache spawns a few processes to handle the requests. If load raises more processes will be created, if load goes down unused processes will be destroyed. Forking new processes cost a little bit time so the Apache keeps some processes ready just in the case of load peak. During the time google crawls the page many processes where created to handle the load. The problem was that these processes consumed to much memory (probably this could be a memory leak in one of the PHP  scripts) and some of some became zombies, leading the virtual server to consume all resources and then crash.</p>
<p><strong>The solution</strong>:<br />
Edit you &#8220;/etc/apache2/apache2.conf&#8221;. Search for this section:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1"># prefork MPM</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># StartServers: number of server processes to start</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># MinSpareServers: minimum number of server processes which are kept spare</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># MaxSpareServers: maximum number of server processes which are kept spare</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1"># MaxClients: maximum number of server processes allowed to start</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># MaxRequestsPerChild: maximum number of requests a server process serves</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">StartServers</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">10</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">MinSpareServers</span> &nbsp; &nbsp; &nbsp;<span class="nu0">10</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">MaxSpareServers</span> &nbsp; &nbsp; &nbsp;<span class="nu0">20</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">MaxClients</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="nu0">100</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">MaxRequestsPerChild</span> <span class="nu0">500</span></div>
</li>
</ol>
</div>
<p>You could read in the comment of the config the impact of every parameter. The important one is the last one which is set to &#8220;0&#8243; by default, which means that processes live as long as possible. Setting it to &#8220;500&#8243;, which is quite conservative, makes every process ends after serving 500 request. This also makes sure that all the allocated memory is freed. That causes that processes need to be created more often, so I also raised &#8220;MinSpareServers&#8221; and &#8220;MaxSpareServers&#8221;, which are the processes keept ready for load peak.<br />
In conclusion my server spends a little more time on spawning new Apache processes, but this makes sure memory is cleaned more often and finally solved my problem!</p>
<p>P.S.: I don&#8217;t know if this is on all virtual servers, but the vHosts at 1und1 have a &#8220;/proc/&#8221;-entry for reading the limits of you server. You type into the terminal:</p>
<pre>root@foo:~# cat /proc/user_beancounters</pre>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://blog.thehippo.de/2009/08/server/crashing-virtual-servers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.219 seconds -->

