<?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>Envision Systems</title>
	<atom:link href="http://www.envision-systems.com.au/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.envision-systems.com.au/blog</link>
	<description>Envision Systems Blog</description>
	<lastBuildDate>Mon, 12 Sep 2011 00:01:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Mounting remote directories to Scientific Linux / CentOS /RedHat 6 via SSH using Fuse</title>
		<link>http://www.envision-systems.com.au/blog/2011/09/01/mounting-remote-directories-to-scientific-linux-centos-redhat-6-via-ssh-using-fuse/</link>
		<comments>http://www.envision-systems.com.au/blog/2011/09/01/mounting-remote-directories-to-scientific-linux-centos-redhat-6-via-ssh-using-fuse/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 04:26:58 +0000</pubDate>
		<dc:creator>William Jamieson</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.envision-systems.com.au/blog/?p=182</guid>
		<description><![CDATA[Often I need to mount a directory from a remote machine onto my Linux server so that I can dump backups or perform other tasks. You can certainly use samba to mount windows shares but for Mac and Linux shares &#8230; <a href="http://www.envision-systems.com.au/blog/2011/09/01/mounting-remote-directories-to-scientific-linux-centos-redhat-6-via-ssh-using-fuse/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Often I need to mount a directory from a remote machine onto my Linux server so that I can dump backups or perform other tasks.  You can certainly use samba to mount windows shares but for Mac and Linux shares SSHFS shares are more consistently supported, especially since Apple&#8217;s change&#8217;s to Samba in Mac OS X 10.7 Lion.</p>
<p>This tutorial will step you through how to mount a remote directory onto your Scientific Linux / CentOS /RedHat 6 machine.</p>
<h2>For a mount on demand solution</h2>
<ol>
<li><strong>Login to your linux server as root</strong>
<p></li>
<li>
        <strong>Install fuse-sshfs</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
        #yum install fuse-sshfs
        </pre>
</li>
<li>
        <strong>Create a mount directory</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
        #mkdir /mnt/sshfsMount
        </pre>
</li>
<li>
        <strong>Mount the remote directory</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
        #sshfs user@192.168.1.1:/mySharePath /mnt/sshfsMount/
        </pre>
<p>        SSHFS will then ask you to authenticate with the password for the user account you supplied
    </li>
<li>
        <strong>To unmount the drive:</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
        #umount /sshfs/sshfsMount/
        </pre>
</li>
</ol>
<h2>To automate the process so that the server automatically mounts</h2>
<ol>
<li>
               <strong> Setup SSH keys so that the linux machine can automatically login to the remote machine via SSH</strong><br />
               To set this up you can see our tutorial on <a href="http://www.envision-systems.com.au/blog/setting-up-automatic-ssh-login-without-password-on-centos/">setting up automatic SSH logins without using a password</a></p>
</li>
<li>
               <strong> Setup SSH keys so that the linux machine can automatically login to the remote machine via SSH</strong><br />
               To set this up you can see our tutorial on <a href="http://www.envision-systems.com.au/blog/setting-up-automatic-ssh-login-without-password-on-centos/">setting up automatic SSH logins without using a password</a></p>
<p>                Now you should be able to use the following command without being asked for a password</p>
<pre class="brush: bash; light: true; title: ; notranslate">
                #sshfs user@192.168.1.1:/mySharePath /mnt/sshfsMount/
                </pre>
</li>
<li>
               <strong>Install autofs</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
                #yum install autofs
                </pre>
</li>
<li>
               <strong>Get the user and group id of the user you wish to control the share.</strong><br />
                In this example I&#8217;m going to use the root account<br />
               </p>
<pre class="brush: bash; light: true; title: ; notranslate">
                #cat /etc/passwd | grep root
                root:x:0:0:root:/root:/bin/bash
                </pre>
<p>                The user id is the first number, and the coup id is the second number (0 and 0)
            </li>
<li>
               <strong>Edit the /etc/auto.master file and add the following line under the line for /misc, substituting your chosen user and group id&#8217;s</strong><br />
               This allows us to mount to any single directory of our choosing under root ( / ) as the local mounting point without having to use sub directories.</p>
<pre class="brush: bash; light: true; title: ; notranslate">
                /-              /etc/auto.sshfs  uid=0,gid=0,--timeout=30,--ghost
                </pre>
<p>                Also comment out the following line by placing a # in front of it to avoid nsswitch errors</p>
<pre class="brush: bash; light: true; title: ; notranslate">
                +auto.master
                </pre>
</li>
<li>
               <strong>Now create the file /etc/auto.sshfs and add the following line to it</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
                /mnt/sshfsMount/ -fstype=fuse,rw,nodev,nonempty,noatime,allow_other,max_read=65536  :sshfs\#user@192.168.1.1\:/mySharePath
                </pre>
<p>                Now this remote directory will mount into the folder /mnt/sshfsMount every time we access that folder. If the folder is not being used for more than 30 seconds, it will automatically be unmounted.
            </li>
<li>
                <strong>Restart autos:</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
                #service autofs restart
                </pre>
</li>
<li>
                <strong>test that the directory is mounted by listing its contents:</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
                #ls /mnt/sshfsMount
                </pre>
</li>
<li>
                <strong>To unmount the drive:</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
                #umount /mnt/sshfsMount/
                </pre>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.envision-systems.com.au/blog/2011/09/01/mounting-remote-directories-to-scientific-linux-centos-redhat-6-via-ssh-using-fuse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing VMWare Tools on a terminal only Scientific Linux / CentOS /RedHat 6 Machine</title>
		<link>http://www.envision-systems.com.au/blog/2011/09/01/installing-vmware-tools-on-a-terminal-only-scientific-linux-centos-redhat-6-machine/</link>
		<comments>http://www.envision-systems.com.au/blog/2011/09/01/installing-vmware-tools-on-a-terminal-only-scientific-linux-centos-redhat-6-machine/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 04:12:16 +0000</pubDate>
		<dc:creator>William Jamieson</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.envision-systems.com.au/blog/?p=171</guid>
		<description><![CDATA[VMWare Tools can greatly improve the speed, efficiency and manageability of your virtual environment as well as provide a number of other key benefits. This tutorial will step you through how to install VMWare tools on a Scientific Linux / &#8230; <a href="http://www.envision-systems.com.au/blog/2011/09/01/installing-vmware-tools-on-a-terminal-only-scientific-linux-centos-redhat-6-machine/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>VMWare Tools can greatly improve the speed, efficiency and manageability of your virtual environment as well as provide a number of <a href="http://reformedmusings.wordpress.com/2008/08/15/what-does-vmware-tools-do/">other key benefits</a>.</p>
<p>This tutorial will step you through how to install VMWare tools on a Scientific Linux / CentOS /RedHat 6 virtual machine with no GUI.</p>
<ol>
<li><strong>Start your virtual machine instance and log in as root using the actual VMWare window rather than a remote terminal session.</strong>
<p></li>
<li>
        <strong>Go to the /tmp directory</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
        #cd /tmp
        </pre>
</li>
<li>
        <strong>On the parent host system, select the menu option: Virtual Machine > Install VMWare Tools</strong></p>
<p>        VMWare will then download the latest version of VMWare Tools and ask you to authenticate using a valid admin account on the parent host system.<br />
        A dialog box will appear asking you to confirm the installation, click &#8216;Install&#8217;.</p>
</li>
<li>
        <strong>Mount the virtual CD-ROM and copy the files to /tmp</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
        #mount -o ro /dev/cdrom /mnt
        #cp /mnt/* .
        </pre>
</li>
<li>
        <strong>Extract the files from the archive</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
        #tar xvfz VMwareTools*
        #cd vmware-tools-distrib
        </pre>
</li>
<li>
        <strong>Run the installation script</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
        #perl vmware-install.pl
        </pre>
<p>        Press Enter at all of the prompts to accept the script default settings
    </li>
<li>
        <strong>Reboot the virtual machine</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
        #reboot
        </pre>
<p>        Then re-login as root when it comes back up
    </li>
<li>
        <strong>Check that the installation was successful</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
        #vmware-checkvm
        VMware software version 6 (good)
        </pre>
</li>
</ol>
<p><strong>You will need to reinstall VMWare tools each time you upgrade/change the kernel on the virtual machine</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.envision-systems.com.au/blog/2011/09/01/installing-vmware-tools-on-a-terminal-only-scientific-linux-centos-redhat-6-machine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to upgrade Scientific Linux / CentOS /RedHat From 6.0 to 6.1</title>
		<link>http://www.envision-systems.com.au/blog/2011/08/31/how-to-upgrade-scientific-linux-centos-redhat-from-6-0-to-6-1/</link>
		<comments>http://www.envision-systems.com.au/blog/2011/08/31/how-to-upgrade-scientific-linux-centos-redhat-from-6-0-to-6-1/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 06:44:52 +0000</pubDate>
		<dc:creator>William Jamieson</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[RedHat]]></category>
		<category><![CDATA[Scientific Linux]]></category>
		<category><![CDATA[SL]]></category>
		<category><![CDATA[Upgrade]]></category>
		<category><![CDATA[version]]></category>
		<category><![CDATA[yum]]></category>

		<guid isPermaLink="false">http://www.envision-systems.com.au/blog/?p=151</guid>
		<description><![CDATA[Problem Simply running the following command won&#8217;t upgrade your system from 6.0 to 6.1 as it will only draw updated packages from the repository associated with it&#8217;s current release (6.0): Solution First let&#8217;s check the version we are currently using: &#8230; <a href="http://www.envision-systems.com.au/blog/2011/08/31/how-to-upgrade-scientific-linux-centos-redhat-from-6-0-to-6-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>Problem</h2>
<p>
Simply running the following command won&#8217;t upgrade your system from 6.0 to 6.1 as it will only draw updated packages from the repository associated with it&#8217;s current release (6.0):</p>
<pre class="brush: bash; light: true; title: ; notranslate">
#yum update
</pre>
<hr />
<h2>Solution</h2>
<p>
First let&#8217;s check the version we are currently using:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
#cat /etc/redhat-release
Scientific Linux release 6.0 (Carbon)
</pre>
<p>All we need to do is tell yum the version number you&#8217;d like to source updates from as follows:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
#yum --releasever=6.1 update
</pre>
<p>Now lets check that the update worked:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
#cat /etc/redhat-release
Scientific Linux release 6.1 (Carbon)
</pre>
<p>Simple as that!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.envision-systems.com.au/blog/2011/08/31/how-to-upgrade-scientific-linux-centos-redhat-from-6-0-to-6-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up a self-signed SSL certificate using ModSSL, Apache 2 and Scientific / CentOS / RedHat</title>
		<link>http://www.envision-systems.com.au/blog/2011/07/25/setting-up-a-self-signed-ssl-certificate-using-modssl-apache-2-and-scientific-centos-redhat/</link>
		<comments>http://www.envision-systems.com.au/blog/2011/07/25/setting-up-a-self-signed-ssl-certificate-using-modssl-apache-2-and-scientific-centos-redhat/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 01:44:11 +0000</pubDate>
		<dc:creator>William Jamieson</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[443]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Certificate]]></category>
		<category><![CDATA[Encryption]]></category>
		<category><![CDATA[ModSSL]]></category>
		<category><![CDATA[mod_ssl]]></category>
		<category><![CDATA[OpenSSL]]></category>
		<category><![CDATA[Port 443]]></category>
		<category><![CDATA[RedHat]]></category>
		<category><![CDATA[Scientific Linux]]></category>
		<category><![CDATA[Secure connection]]></category>
		<category><![CDATA[Secure Socket Layer]]></category>
		<category><![CDATA[Self-signed]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[wget]]></category>

		<guid isPermaLink="false">http://www.envision-systems.com.au/blog/?p=138</guid>
		<description><![CDATA[Self-signed certificates are very handy for helping two known machines talk to each other in a secure (encrypted) manner over https. Self signed certificates are simply certificates that you vouch for (or trust) yourself, without having to be externally verified &#8230; <a href="http://www.envision-systems.com.au/blog/2011/07/25/setting-up-a-self-signed-ssl-certificate-using-modssl-apache-2-and-scientific-centos-redhat/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Self-signed certificates are very handy for helping two known machines talk to each other in a secure (encrypted) manner over https.  Self signed certificates are simply certificates that you vouch for (or trust) yourself, without having to be externally verified by a third party such as Thawte or Verisign.</p>
<p>Here&#8217;s how to set it up using ModSSL, Apache 2, and Scientific, CentOS, or RedHat Linux&#8230;</p>
<p></p>
<h2>Configure the Server</h2>
<hr />
<ol>
<li><strong>Install mod_ssl if you haven&#8217;t already:</strong>
<pre class="brush: bash; light: true; title: ; notranslate">
yum install mod_ssl openssl openssl-devel
</pre>
</li>
<li><strong>To generate a self signed certificate, login to the server as root and generate the private key, replacing www.mysite.com with the domain you require:</strong>
<pre class="brush: bash; light: true; title: ; notranslate">
cd ~/
openssl genrsa -out www.mysite.com.key 1024
</pre>
</li>
<li><strong>Now generate the certificate signing request (CSR) and answer the questions is asks you as guided:</strong>
<pre class="brush: bash; light: true; title: ; notranslate">
openssl req -new -key www.mysite.com.key -out www.mysite.com.csr

---------------------------------------------------------------------------------------
Country Name (2 letter code) [GB]: &lt;Your 2 Character Country Code&gt;
State or Province Name (full name) [Berkshire]: &lt;Your State&gt;
Locality Name (eg, city) [Newbury]: &lt;Your City&gt;
Organization Name (eg, company) [My Company Ltd]: &lt;Your Company Name&gt;
Organizational Unit Name (eg, section) []: &lt;Leave Empty Unless Required&gt;
Common Name (eg, your name or your server's hostname) []:&lt;Your Full Domain Name To Use With SSL&gt;
Email Address []:&lt;Generic Organisation Email Address.  eg. info@mysite.com&gt;

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: &lt;Leave Empty Unless Required&gt;
An optional company name []: &lt;Leave Empty Unless Required&gt;
---------------------------------------------------------------------------------------
</pre>
</li>
<li><strong>Now use the CSR and key to create a self-signed certificate:</strong>
<pre class="brush: bash; light: true; title: ; notranslate">
openssl x509 -req -in www.mysite.com.csr -signkey www.mysite.com.key -out www.mysite.com.crt
</pre>
</li>
<li><strong>Create the apache SSL certificate and key directories, copy the required files and set permissions:</strong>
<pre class="brush: bash; light: true; title: ; notranslate">
mkdir -p /etc/httpd/conf/ssl.crt
mkdir -p /etc/httpd/conf/ssl.key
cat ~/www.envision-systems.com.au.crt &gt; /etc/httpd/conf/ssl.crt/www.envision-systems.com.au.crt
cat ~/www.envision-systems.com.au.key &gt; /etc/httpd/conf/ssl.key/www.envision-systems.com.au.key
chmod -R 600 /etc/httpd/conf/ssl.key
chmod -R 600 /etc/httpd/conf/ssl.crt
</pre>
</li>
<li><strong>Configure apache SSL:</strong>
<pre class="brush: bash; light: true; title: ; notranslate">
vim /etc/httpd/conf.d/ssl.conf
</pre>
<pre class="brush: bash; light: true; title: ; notranslate">
&lt;VirtualHost _default_:443&gt;
        DocumentRoot /var/www/html/www.mysite.com
        DirectoryIndex index.php
        ServerName etc/httpd

        SSLEngine on
        SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

        SSLCertificateFile /etc/httpd/conf/ssl.crt/www.mysite.com.crt
        SSLCertificateKeyFile /etc/httpd/conf/ssl.key/www.mysite.com.key

        &lt;Files ~ &quot;\.(cgi|shtml|phtml|php3?)$&quot;&gt;
            SSLOptions +StdEnvVars
        &lt;/Files&gt;
        &lt;Directory &quot;/usr/local/apache/cgi-bin&quot;&gt;
            SSLOptions +StdEnvVars
        &lt;/Directory&gt;

        SetEnvIf User-Agent &quot;.*MSIE.*&quot; \
                 nokeepalive ssl-unclean-shutdown \
                 downgrade-1.0 force-response-1.0
        CustomLog /usr/local/apache/logs/ssl_request_log \
                  &quot;%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \&quot;%r\&quot; %b&quot;

&lt;/VirtualHost&gt;
</pre>
<p><strong>Ensure that your vim /etc/httpd/conf/httpd.conf contains a NameVirtualHost entry for port 443:</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
NameVirtualHost *:443
</pre>
</li>
<li><strong>Test apache configuration and restart if ok:</strong>
<pre class="brush: bash; light: true; title: ; notranslate">
apachectl configtest
apachectl restart
</pre>
</li>
</ol>
<h2>Configure the Client</h2>
<hr />
<ol>
<li><strong>Login to your client machine as root, and copy the www.mysite.com.crt file to your client machine then set permissions:</strong>
<pre class="brush: bash; light: true; title: ; notranslate">
cd ~/
chmod 600 www.envision-systems.com.au.crt
</pre>
</li>
<li><strong>Install wget if you haven&#8217;t already:</strong>
<pre class="brush: bash; light: true; title: ; notranslate">
yum install wget
</pre>
<p><strong>Test the certificate using wget:</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
wget --ca-certificate=www.mysite.com.crt https://www.mysite.com/
</pre>
<p><strong>If all went well you should see something like this:</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
--2011-07-25 10:36:56--  https://www.mysite.com/
Resolving www.mysite.com... 29.141.129.5
Connecting to www.mysite.com|29.141.129.5|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified 1
Saving to: `index.html.1'
    [ &lt;=&gt; ] 13,355      --.-K/s   in 0.001s
2011-07-25 10:36:56 (17.1 MB/s) - `index.html.1' saved [13355]
</pre>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.envision-systems.com.au/blog/2011/07/25/setting-up-a-self-signed-ssl-certificate-using-modssl-apache-2-and-scientific-centos-redhat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Get a list of ranked client IP addresses from your apache log</title>
		<link>http://www.envision-systems.com.au/blog/2011/07/15/get-a-list-of-ranked-client-ip-addresses-from-your-apache-log/</link>
		<comments>http://www.envision-systems.com.au/blog/2011/07/15/get-a-list-of-ranked-client-ip-addresses-from-your-apache-log/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 03:54:57 +0000</pubDate>
		<dc:creator>William Jamieson</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.envision-systems.com.au/blog/?p=133</guid>
		<description><![CDATA[Most of the software I write is for businesses that have multiple office locations. Even though the software is web based, my clients often want to lock access down so that the software can only be accessed from within one &#8230; <a href="http://www.envision-systems.com.au/blog/2011/07/15/get-a-list-of-ranked-client-ip-addresses-from-your-apache-log/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Most of the software I write is for businesses that have multiple office locations.  Even though the software is web based, my clients often want to lock access down so that the software can only be accessed from within one of their offices.  We do this by getting the public IP address of each office and allowing only that traffic through.  Because I block requests from non-registered IP addresses using PHP, apache will still handle the request.  Therefore all user IP addresses will be registered within the /var/log/http/access_log whether they are registered IP addresses or not.</p>
<p>Sometimes you need to see if a specific IP address is trying to access your server.  Here&#8217;s a handy little bash command that will list all of the IP addresses contained in the current apache log and rank them by the number of times they appear (# of requests they have made).</p>
<pre class="brush: bash; light: true; title: ; notranslate">
cat /var/log/http/access_log | awk '{print $1}' | sort | uniq -c | sort -n
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.envision-systems.com.au/blog/2011/07/15/get-a-list-of-ranked-client-ip-addresses-from-your-apache-log/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up automatic SSH login without password on CentOS</title>
		<link>http://www.envision-systems.com.au/blog/2010/08/23/setting-up-automatic-ssh-login-without-password-on-centos/</link>
		<comments>http://www.envision-systems.com.au/blog/2010/08/23/setting-up-automatic-ssh-login-without-password-on-centos/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 04:56:54 +0000</pubDate>
		<dc:creator>William Jamieson</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[automatic]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[keys]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[scp]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://williamjamieson.wordpress.com/?p=122</guid>
		<description><![CDATA[Its reasonably common for me to require one server to log into another server automatically over SSH. Whether you&#8217;re transferring backup files to a remote server using scp or just performing a scheduled remote function, automating the authentication process can &#8230; <a href="http://www.envision-systems.com.au/blog/2010/08/23/setting-up-automatic-ssh-login-without-password-on-centos/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Its reasonably common for me to require one server to log into another server automatically over SSH.  Whether you&#8217;re transferring backup files to a remote server using scp or just performing a scheduled remote function, automating the authentication process can make this a lot easier.</p>
<p>For the sake of this tutorial, my username on the local machine will be <em>localuser</em>@localserver and my username on the remote machine will be <em>remoteuser</em>@remoteserver.  If you are running these automated taks in your crontab remember to specify the <em>localuser</em> as the user account running the script in your /etc/crontab file:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
# Running backup for server conf files every night at 1.00 am
00  1   *   *   *   localuser   /backup/scripts/backupToRemoteServer.sh
</pre>
<p><span style="color:#8A0808;">WARNING: Allowing a local server to automatically log into a remote server means that if the local server gets compromised, then the intruders will also have automatic access to the remote server, compromising it also.</span></p>
<p>For this reason I always ensure that the remoteuser account has its privileges reduced to the point where it can&#8217;t do anything except what I require it to do. Setting up user privileges is outside the scope of this tutorial and depends greatly on the specific task you need to perform on the remote server.</p>
<h3>1.  Login to the local machine as localuser</h3>
<pre class="brush: bash; light: true; title: ; notranslate">
#ssh localuser@localserver
</pre>
<h3>2.  Create an .ssh directory on the local machine in the localuser&#8217;s home directory</h3>
<pre class="brush: bash; light: true; title: ; notranslate">
#mkdir ~/.ssh
#chmod 700 ~/.ssh
</pre>
<h3>3.  Generate the ssh keys on the local machine</h3>
<pre class="brush: bash; light: true; title: ; notranslate">
#ssh-keygen -t dsa -C '&lt;enter a description about your local server here&gt;'
</pre>
<p><strong>Output:</strong></p>
<pre class="brush: plain; light: true; title: ; notranslate">
Generating public/private dsa key pair.
Enter file in which to save the key (/home/localuser/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):  &lt;Leave Empty&gt;
Enter same passphrase again:  &lt;Leave Empty&gt;
Your identification has been saved in /home/localuser/.ssh/id_dsa.
Your public key has been saved in /home/localuser/.ssh/id_dsa.pub.
The key fingerprint is:
64:be:2f:ec:d4:30:61:28:d4:8b:58:e9:bd:ea:f4:65 &lt;local machine description as entered in above&gt;
</pre>
<h3>4.  Set permissions for the SSH key on the local server</h3>
<pre class="brush: bash; light: true; title: ; notranslate">
#chmod 600 ~/.ssh/id_dsa.pub
</pre>
<h3>5.  Open the ~/.ssh/id_dsa.pub file and copy its contents to your clipboard</h3>
<pre class="brush: bash; light: true; title: ; notranslate">
#cat ~/.ssh/id_dsa.pub
</pre>
<h3>6.  Login to the remote server</h3>
<pre class="brush: bash; light: true; title: ; notranslate">
#ssh remoteuser@remoteserver
</pre>
<h3>7.  Create an .ssh directory on the remote machine in the remoteuser&#8217;s home directory</h3>
<pre class="brush: bash; light: true; title: ; notranslate">
#mkdir ~/.ssh
#chmod 700 ~/.ssh
</pre>
<h3>8.  Paste your clipboard contents (the local servers id_dsa.pub file) at the bottom of the authorized_keys file on the remote server</h3>
<pre class="brush: bash; light: true; title: ; notranslate">
#vim ~/.ssh/authorized_keys
</pre>
<h3>9.  Set permissions on the remote servers authorized_keys file</h3>
<pre class="brush: bash; light: true; title: ; notranslate">
#chmod 600 ~/.ssh/authorized_keys
</pre>
<h3>10.  Go back to the local machine as localuser and then try to log into the remote machine</h3>
<p>Login to the local server:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
#ssh localuser@localserver
</pre>
<p>Then try to access the remote server from the local server:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
#ssh remoteuser@remoteserver
</pre>
<p>It should now login automatically.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.envision-systems.com.au/blog/2010/08/23/setting-up-automatic-ssh-login-without-password-on-centos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sending SMTP mail to gmail using PHP</title>
		<link>http://www.envision-systems.com.au/blog/2010/08/20/sending-smtp-mail-to-gmail-using-php/</link>
		<comments>http://www.envision-systems.com.au/blog/2010/08/20/sending-smtp-mail-to-gmail-using-php/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 04:02:28 +0000</pubDate>
		<dc:creator>William Jamieson</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[25]]></category>
		<category><![CDATA[465]]></category>
		<category><![CDATA[authorise]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[flag]]></category>
		<category><![CDATA[flagged]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[mail server]]></category>
		<category><![CDATA[MX]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[Pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[port]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[recipient]]></category>
		<category><![CDATA[send]]></category>
		<category><![CDATA[sendmail]]></category>
		<category><![CDATA[smtp]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[subject]]></category>
		<category><![CDATA[username]]></category>

		<guid isPermaLink="false">http://williamjamieson.wordpress.com/?p=105</guid>
		<description><![CDATA[Sending mail from your web server is a very common thing that many of us need to do. To do this, the most common approach is to use the following PHP code: This method sends a copy of the email, &#8230; <a href="http://www.envision-systems.com.au/blog/2010/08/20/sending-smtp-mail-to-gmail-using-php/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sending mail from your web server is a very common thing that many of us need to do.  To do this, the most common approach is to use the following PHP code:</p>
<pre class="brush: php; light: true; title: ; notranslate">mail($to, $subject, $message, $headers);</pre>
<p>This method sends a copy of the email, directly to the recipients mail server from the web server.  However generally speaking, the web server is not the real mail server for the domain you&#8217;re trying to send from which can cause major issues.</p>
<p>For example, lets say I have a website at www.myweb.com and when someone registers it sends them an email from the address website@myweb.com.  The recipients mail servers spam filtering facility may do an MX lookup on the myweb.com domain and notice that the real mail server for the myweb.com has a different IP address to the address where the email is originating from (the web servers IP address).  For this reason web server emails are often flagged as spam and thus never received by the intended recipient.</p>
<p>To avoid this, we can relay the mail through the domains real mail server using SMTP.  Using this method the mail will come to the recipients mail server from the real mail server for the senders domain as seen in its MX records.  This then avoids the problematic spam filter rule.</p>
<p>To achieve this I use the Mail.php class as found in the PEAR::Mail library located at <a href="http://pear.php.net/package/Mail">http://pear.php.net/package/Mail</a>.  If you&#8217;re using CentOS like me, you can easily install this package using the following command</p>
<pre class="brush: bash; light: true; title: ; notranslate">#yum install php-pear-Mail</pre>
<p>In this example I&#8217;m connecting to a gmail server which requires the connection to be over SSL:</p>
<p>&nbsp;</p>
<pre class="brush: php; light: true; title: ; notranslate">
&lt;?php
require_once('Mail.php');
$host = 'ssl://smtp.gmail.com';
$port = '465';
$username = '&lt;your email address&gt;';
$password = '&lt;yourPassword&gt;';
$subject = 'my subject';
$to = '&lt;to email address&gt;';

$from = $username;
$message = 'test';
$headers = array ('From' =&gt; $from,
   'To' =&gt; $to,
   'Subject' =&gt; $subject);
$smtp = Mail::factory('smtp',
   array ('host' =&gt; $host,
     'port' =&gt;; $port,
     'auth' =&gt; true,
     'username' =&gt; $username,
     'password' =&gt; $password));
$mail = $smtp-&gt;send($to, $headers, $message);
if (PEAR::isError($mail)) {
        echo('&lt;p&gt;'.$mail-&gt;getMessage().'&lt;/p&gt;');
}
?&gt;
</pre>
<p>If SSL wasn&#8217;t required I&#8217;d just need to remove the &#8216;ssl://&#8217; from in front of the host declaration and change the port to 25 like this:</p>
<pre class="brush: php; light: true; title: ; notranslate">
$host = 'mail.myweb.com';
$port = '25';
</pre>
<p>Obviously you&#8217;ll need to ensure that your firewall allows your web server to make connections to your smtp host over port 25 or 465 for SSL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.envision-systems.com.au/blog/2010/08/20/sending-smtp-mail-to-gmail-using-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Performance tuning a CentOS LAMP web server for high traffic volumes</title>
		<link>http://www.envision-systems.com.au/blog/2010/08/17/performance-tuning-a-centos-lamp-web-server-for-high-traffic-volumes/</link>
		<comments>http://www.envision-systems.com.au/blog/2010/08/17/performance-tuning-a-centos-lamp-web-server-for-high-traffic-volumes/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 15:48:36 +0000</pubDate>
		<dc:creator>William Jamieson</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Performance Tuning]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[chkconfig]]></category>
		<category><![CDATA[eAccelerator]]></category>
		<category><![CDATA[Hewlett Packard]]></category>
		<category><![CDATA[ip6tables]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[load runner]]></category>
		<category><![CDATA[load testing]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Performance Center]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[Tuning]]></category>

		<guid isPermaLink="false">http://geekcheats.wordpress.com/?p=46</guid>
		<description><![CDATA[In August 2010 I was contracted to performance tune a LAMP server to handle approximately 70 full page loads per second which equated to 4,250 concurrent virtual users. We ended up doubling this expectation to 140 full page loads per &#8230; <a href="http://www.envision-systems.com.au/blog/2010/08/17/performance-tuning-a-centos-lamp-web-server-for-high-traffic-volumes/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In August 2010 I was contracted to performance tune a LAMP server to handle approximately 70 full page loads per second which equated to 4,250 concurrent virtual users.  We ended up doubling this expectation to 140 full page loads per second without striking issue.  If this speed was maintained for 24 hours it would equate to over 12 million hits per day.  This article will let you know how we achieved it.</p>
<p>The load tests were conducted using the HP performance center; a technology that HP obtained as part of its acquisition of Mercury for approximately USD$4.5 billion in 2006.</p>
<p>To find out more about the load testing software visit <a href="http://en.wikipedia.org/wiki/HP_LoadRunner">http://en.wikipedia.org/wiki/HP_LoadRunner</a></p>
<p><strong>Goal:</strong><br />
Handle 4,250 concurrent users generating approximately 70 full page loads per second.</p>
<p><strong>1 full page load consisted of:</strong><br />
- 1 dynamically generated PHP file using MySQL<br />
- 4 JavaScript files<br />
- 7 CSS files<br />
- 8 image files</p>
<p><strong>Original starting environment:</strong><br />
- ServerModel: Dell R300<br />
- RAM: 2GB (2 x 1GB chips)<br />
- Operating System: CentOS release 5.5 (Final)<br />
- Apache: v2.2.3 (running in prefork mode)<br />
- MySQL: v5.0.77<br />
- PHP: v5.1.6 (as an apache module)<br />
- eAccelerator: v0.9.5.3<br />
- 120Mbits of bandwidth</p>
<h2>&nbsp;</h2>
<h2>Round 1: Initial Test</h2>
<h3>Round 1: Configuration</h3>
<p>At the start of the process we were pretty much using the default configurations for the entire lamp stack.  Linux was running iptables and ip6tables in its default configuration. eAccelerator was operating with 32MB of memory with optimization and caching enabled.</p>
<p><strong>Apache (/etc/httpd/conf/httpd.conf):</strong><br />
For more info on variables for Apache 2.0.x go to: <a href="http://httpd.apache.org/docs/2.0/mod/mpm_common.html">http://httpd.apache.org/docs/2.0/mod/mpm_common.html</a></p>
<pre class="brush: bash; light: true; title: ; notranslate">
&lt;IfModule prefork.c&gt;
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
&lt;/IfModule&gt;
</pre>
<p><strong>MySQL (/etc/my.cnf):</strong><br />
For more info on variables for MySQL 5.0.x go to: <a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html">http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html</a></p>
<pre class="brush: bash; light: true; title: ; notranslate">
[mysqld]
max_connections = 100
max_user_connections = 0
max_connect_errors = 10
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 2M
read_buffer_size = 131072
read_rnd_buffer_size = 262144
myisam_sort_buffer_size = 8M
thread_cache_size = 0
query_cache_size= 0
thread_concurrency = 10
</pre>
<h3>Round 1: Results</h3>
<p>With these settings we got up to 30 page loads per second which was 42% of our target.  Interestingly, we were only operating at about 8% CPU and about 50% of our memory capacity when we hit this limit.</p>
<h3>Round 1: Review</h3>
<p>Looking at the apache error logs we were getting a large number of MySQL errors:</p>
<pre class="brush: bash; light: true; title: ; notranslate">mysql_connect() [&lt;a href='function.mysql-connect'&gt;function.mysql-connect&lt;/a&gt;]: Too many connections in xxx.php on line 15</pre>
<p>So the MySQL configuration seemed to be our bottleneck:</p>
<h2>&nbsp;</h2>
<h2>Round 2</h2>
<h3>Round 2: Configuration</h3>
<p>We did our first major review of the Apache and MySQL performance settings and adjusted them accordingly.  We doubled the Apache settings and used the &#8216;huge&#8217; configuration as supplied with mysql (/usr/share/doc/mysql-server-5.0.77/my-huge.cnf).</p>
<p><strong>Apache (/etc/httpd/conf/httpd.conf):</strong><br />
For more info on variables for Apache 2.0.x go to: <a href="http://httpd.apache.org/docs/2.0/mod/mpm_common.html">http://httpd.apache.org/docs/2.0/mod/mpm_common.html</a></p>
<pre class="brush: bash; light: true; title: ; notranslate">
&lt;IfModule prefork.c&gt;
StartServers       16
MinSpareServers    10
MaxSpareServers   40
ServerLimit      512
MaxClients       512
MaxRequestsPerChild  8000
&lt;/IfModule&gt;
</pre>
<p><strong>MySQL (/etc/my.cnf):</strong><br />
For more info on variables for MySQL 5.0.x go to: <a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html">http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html</a></p>
<pre class="brush: bash; light: true; title: ; notranslate">
[mysqld]
# Memory usage
skip-locking
max_connections = 500
max_user_connections = 500
max_connect_errors = 999999
key_buffer = 384M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency (eHound has 4 CPU's)
thread_concurrency = 8

# Disable Federated by default
skip-federated

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout
</pre>
<p>As an extra precaution we locked the network card in the server to use 1Gbit:</p>
<pre class="brush: bash; light: true; title: ; notranslate">#ethtool -s eth0 speed 1000 duplex full</pre>
<p>Edit the configuration for the network card:</p>
<pre class="brush: bash; light: true; title: ; notranslate">#vim /etc/sysconfig/network-scripts/ifcfg-eth0</pre>
<p>Add the following line:</p>
<pre class="brush: bash; light: true; title: ; notranslate">ETHTOOL_OPTS='autoneg on speed 1000 duplex full'</pre>
<p>Restart the network:</p>
<pre class="brush: bash; light: true; title: ; notranslate">#service network restart</pre>
<h3>Round 2: Results</h3>
<p>With these settings we got up to 58 full page loads per second which was 59% of our target.  Interestingly, we were still only operating at about 10% CPU capacity when we hit this limit but we were using approximately 70-80% of our memory.</p>
<p>Our MySQL errors had disappeared and there were no more errors in the Apache logs.</p>
<h3>Round 2: Review</h3>
<p>We were concerned that the system was starting to use swap memory which was slowing the server to a halt.</p>
<h2>&nbsp;</h2>
<h2>Round 3</h2>
<h3>Round 3: Configuration</h3>
<p>We added an additional 2GB of RAM to the server so it now contained 4 x 1GB chips.</p>
<h3>Round 3: Results</h3>
<p>With the new RAM we still only got up to 58 full page loads per second which was 59% of our target.  We were still only operating at about 10% CPU capacity but now we were only using about 40% of our memory.</p>
<h3>Round 3: Review</h3>
<p>Still no errors in the Apache logs and the load test farm was not receiving Apache errors.  In fact it was reporting that it could not even connect to the server.  This led us to believe that it was either a lack of bandwidth or a NIC/network/firewall configuration issue.  After checking with our datacenter, we found that there were no inhibiting factors that would cause the problem described.</p>
<p>We increased the Apache &amp; MySQL Limits and ran a different style of test.</p>
<h2>&nbsp;</h2>
<h2>Round 4</h2>
<h3>Round 4: Configuration</h3>
<p>In this test we only loaded the dynamic components of the page as generated by PHP and MySQL and served by Apache.  This meant that we told the load test farm not to download static content such as images, CSS or JavaScript files.</p>
<p>Also we increased the MySQL and Apache limits as follows:</p>
<p><strong>Apache (/etc/httpd/conf/httpd.conf):</strong><br />
For more info on variables for Apache 2.0.x go to: <a href="http://httpd.apache.org/docs/2.0/mod/mpm_common.html">http://httpd.apache.org/docs/2.0/mod/mpm_common.html</a></p>
<pre class="brush: bash; light: true; title: ; notranslate">
&lt;IfModule prefork.c&gt;
StartServers     280
MinSpareServers   100
MaxSpareServers   300
ServerLimit      1536
MaxClients       1536
MaxRequestsPerChild  32000
&lt;/IfModule&gt;
</pre>
<p><strong>MySQL (/etc/my.cnf):</strong><br />
For more info on variables for MySQL 5.0.x go to: <a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html">http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html</a></p>
<pre class="brush: bash; light: true; title: ; notranslate">
[mysqld]
# Memory usage
skip-locking
max_connections = 764
max_user_connections = 764
max_connect_errors = 999999
key_buffer = 256M
max_allowed_packet = 1M
table_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU's*2 for thread_concurrency (eHound has 4 CPU's)
thread_concurrency = 8

# Disable Federated by default
skip-federated

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[isamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout
</pre>
<h3>Round 4: Results</h3>
<p>The results of this test were very interesting.  We got up to 263 page loads without any issue.  This consumed a lot more bandwidth than test 3 so we knew that bandwidth was not the issue.  However the number of connections that both tests started to fail at were very similar.</p>
<h3>Round 4: Review</h3>
<p>So we knew we had a connection limit issue.</p>
<p>We also knew that the eAccelerator optcode cache was not dying at these high volumes, nor was MySQL, PHP or Apache.</p>
<p>We reviewing the kernel messages and found thousands of the following messages that were logged at the time of testing:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
#cat /var/log/messages* | grep 'Aug 15'
...
Aug 15 01:04:27 localhost kernel: printk: 1395 messages suppressed.
Aug 15 01:04:27 localhost kernel: ip_conntrack: table full, dropping packet.
Aug 15 01:04:32 localhost kernel: printk: 1561 messages suppressed.
Aug 15 01:04:32 localhost kernel: ip_conntrack: table full, dropping packet.
Aug 15 01:04:37 localhost kernel: printk: 1274 messages suppressed.
Aug 15 01:04:37 localhost kernel: ip_conntrack: table full, dropping packet.
Aug 15 01:04:42 localhost kernel: printk: 1412 messages suppressed.
...
</pre>
<p>Further investigation revealed that the iptables/ip6tables was activated and limiting the number of connections to the box because its table was full.  Ordinarily when I set up a linux server I turn iptables off because I place hardware firewalls in front of the servers.  However I didn&#8217;t have the opportunity to setup this box initially, so they were still activated.  I however didn&#8217;t need them, so I deactivated them.</p>
<p><strong>If you still need to keep iptables running you can simply adjust the following settings:</strong><br />
Check the current connections limit (only works if iptables is running):</p>
<pre class="brush: bash; light: true; title: ; notranslate">
#sysctl net.ipv4.netfilter.ip_conntrack_max
65536
</pre>
<p>Change the connections limit:</p>
<pre class="brush: bash; light: true; title: ; notranslate">#vim /etc/sysctl.conf</pre>
<p>Add the following lines:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
# conntrack limits
#inet.ipv4.netfilter.ip_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_max = 196608
</pre>
<p>Reload the config file:</p>
<pre class="brush: bash; light: true; title: ; notranslate">#sysctl -p</pre>
<p>Check the new connections limit:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
#sysctl net.ipv4.netfilter.ip_conntrack_max
196608
</pre>
<p>Check the current buckets limit (only works if iptables is running):</p>
<pre class="brush: bash; light: true; title: ; notranslate">
#cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets
8192
</pre>
<p>To change the buckets limit:</p>
<pre class="brush: bash; light: true; title: ; notranslate">#vim /etc/modprobe.conf</pre>
<p>Add the following lines:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
options ip_conntrack hashsize=32768
</pre>
<p>Reboot the server:</p>
<pre class="brush: bash; light: true; title: ; notranslate">#shutdown -r now</pre>
<p>Check the new buckets limit:</p>
<pre class="brush: bash; light: true; title: ; notranslate">
#cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets
24576
</pre>
<p>&#8211;<br />
<strong>Alternatively if you don&#8217;t need iptables like me, you can just disable them:</strong></p>
<pre class="brush: bash; light: true; title: ; notranslate">
#service iptables stop
#service ip6tables stop
#chkconfig iptables off
#chkconfig ip6tables off
</pre>
<h2>&nbsp;</h2>
<h2>Round 5</h2>
<h3>Round 5: Configuration</h3>
<p>This test used exactly the same configuration with iptables disabled.</p>
<h3>Round 5: Results</h3>
<p>Success!!! We got to 4,250 concurrent users which is about 70 pages per second (loading all additional image, CSS and JavaScript files also) with zero errors and a 0.7 second average response time.  This used about 120Mbits worth of bandwidth pipe.  The datacenter ended up running out of pipe before the server had any issues.</p>
<p>At this rate we were running at about:<br />
- 15% CPU utilisation<br />
- 30% Memory usage (with 4GB RAM installed)<br />
- 400 apache threads<br />
- 100% Bandwidth</p>
<h3>Round 5: Review</h3>
<p>Key findings:<br />
- Increase your Apache and MySQL limits<br />
- Turn off iptables<br />
- Ensure that you have enough RAM<br />
- Ensure that you are checking logs from MySQL, Apache, and the kernel to pick up any errors and give you clues as to how to best solve them</p>
<h2>&nbsp;</h2>
<h2>Round 6</h2>
<h3>Round 6: Configuration</h3>
<p>This test used exactly the same configuration as round 5 with 250Mbit pipe instead of a 120Mbit pipe.</p>
<h3>Round 6: Results</h3>
<p>Success!!! We got to 140 full page loads per second (including additional images, CSS and JavaScript files also) with zero errors and still a stable 0.7 second average response time.  This used the full 250Mbits worth of bandwidth pipe.  The datacenter ended up running out of pipe again before the server had any issues.</p>
<p>At this rate we were running at about:<br />
- 30% CPU utilisation<br />
- 40% Memory usage (with 4GB RAM installed)<br />
- 800 apache threads<br />
- 100% Bandwidth</p>
<h3>Round 6: Review</h3>
<p>Key findings:<br />
- Even with 250Mbits of pipe, bandwidth is still the bottleneck in this configuration.</p>
<h2>&nbsp;</h2>
<h2>Round 7</h2>
<h3>Round 7: Configuration</h3>
<p>Even though our server was performing fine, we were given another server to experiment on with much higher specs.</p>
<p>It was a Dell R710 with 48GB of RAM and 8 2.53MHz Xeon processors running in hyper-threading mode (essentially making 16 processors).</p>
<p>We also had this box connected to a dedicated 4Gbit optical internet feed to give it as much bandwidth as it needed.</p>
<p>Everything on the box was configured the same except for Apache and MySQL (which we took the last settings and multipled them by 4) and sysctl.</p>
<p><strong>Apache (/etc/httpd/conf/httpd.conf):</strong><br />
For more info on variables for Apache 2.0.x go to: <a href="http://httpd.apache.org/docs/2.0/mod/mpm_common.html">http://httpd.apache.org/docs/2.0/mod/mpm_common.html</a></p>
<pre class="brush: bash; light: true; title: ; notranslate">
&lt;IfModule prefork.c&gt;
StartServers     1120
MinSpareServers   400
MaxSpareServers   1200
ServerLimit      6144
MaxClients       6144
MaxRequestsPerChild  128000
&lt;/IfModule&gt;
</pre>
<p><strong>MySQL (/etc/my.cnf):</strong><br />
For more info on variables for MySQL 5.0.x go to: <a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html">http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html</a></p>
<pre class="brush: bash; light: true; title: ; notranslate">
[mysqld]
# Memory usage
skip-locking
max_connections = 3056
max_user_connections = 3056
max_connect_errors = 999999
key_buffer = 1024M
max_allowed_packet = 4M
table_cache = 1024
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 16M
myisam_sort_buffer_size = 256M
thread_cache_size = 32
query_cache_size= 64M
# Try number of CPU's*2 for thread_concurrency (eHound has 4 CPU's)
thread_concurrency = 32

# Disable Federated by default
skip-federated

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqldump]
quick
max_allowed_packet = 64M

[mysql]
no-auto-rehash

[isamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M

[myisamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M

[mysqlhotcopy]
interactive-timeout
</pre>
<p>We also added the following lines to sysctl:<br />
ip_conntrack_max = 196608<br />
net.ipv4.ip_local_port_range = 1025 65535   <br />
net.ipv4.tcp_max_tw_buckets = 1000000<br />
net.core.somaxconn = 10000<br />
net.ipv4.tcp_max_syn_backlog = 2000<br />
net.ipv4.tcp_fin_timeout = 30</p>
<h3>Round 7: Results</h3>
<p>We got to 200 full page loads per second (including additional images, CSS and JavaScript files also) with zero errors and still a stable 0.8 second average response time.  This test used 330Mbits or about 8% worth of the bandwidth available.  We stopped the test simply because we didn&#8217;t need to go any higher, but potentially could have gone much higher.</p>
<p>At this rate we were running at about:<br />
- 16% CPU utilisation<br />
- 6% Memory usage (with 48GB RAM installed)<br />
- 1227 apache threads<br />
- 8% Bandwidth</p>
<h3>Round 7: Review</h3>
<p>Key findings:<br />
- Bandwidth seem to be a much bigger bottleneck than server capability.</p>
<h2>&nbsp;</h2>
<h2>Summary</h2>
<p>A Dell R300 with good specs can be acquired for about AUD$4,000-$4,500 and should handle over 2800 hits per second on a 20/1 dynamic/static file ratio or 140 full page loads per second in our case if it is configured correctly.</p>
<p>You don&#8217;t need a $25,000 server to get good performance, you just need to take some time to make sure that you are getting the most out of your hardware and ensure that your available bandwidth can handle the load you require.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.envision-systems.com.au/blog/2010/08/17/performance-tuning-a-centos-lamp-web-server-for-high-traffic-volumes/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Monitoring CentOS server performance using sar</title>
		<link>http://www.envision-systems.com.au/blog/2010/08/17/monitoring-centos-server-performance-using-sar/</link>
		<comments>http://www.envision-systems.com.au/blog/2010/08/17/monitoring-centos-server-performance-using-sar/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 05:54:08 +0000</pubDate>
		<dc:creator>William Jamieson</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Performance Tuning]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[Monitor]]></category>
		<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[sar]]></category>
		<category><![CDATA[sysstat]]></category>
		<category><![CDATA[yum]]></category>

		<guid isPermaLink="false">http://geekcheats.wordpress.com/?p=40</guid>
		<description><![CDATA[Sar can be used to record a large number of server resource utilisation statistics in a binary log format which you can then analyse. To install sar: To run sar and save the binary output to a file: sar parameters: &#8230; <a href="http://www.envision-systems.com.au/blog/2010/08/17/monitoring-centos-server-performance-using-sar/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sar can be used to record a large number of server resource utilisation statistics in a binary log format which you can then analyse.</p>
<p>To install sar:</p>
<pre class="brush: bash; light: true; title: ; notranslate">#yum install sysstat</pre>
<p>To run sar and save the binary output to a file:</p>
<pre class="brush: bash; light: true; title: ; notranslate">#sar -A -o /var/log/performanceTests/sarLog 5 0</pre>
<p><strong>sar parameters:</strong><br />
-A: records ALL server stats<br />
-o: elects the binary output file Path<br />
5 0: [interval count] in seconds: take stats every five seconds indefinitely</p>
<p>You can then use the sar tool to read and display the stats you require.  I&#8217;ll be writing another article on how to do this soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.envision-systems.com.au/blog/2010/08/17/monitoring-centos-server-performance-using-sar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Count lines of code in a linux web project</title>
		<link>http://www.envision-systems.com.au/blog/2010/08/03/count-lines-of-code-in-a-linux-web-project/</link>
		<comments>http://www.envision-systems.com.au/blog/2010/08/03/count-lines-of-code-in-a-linux-web-project/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 05:35:59 +0000</pubDate>
		<dc:creator>William Jamieson</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[Count]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[line count]]></category>
		<category><![CDATA[lines]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[project]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://geekcheats.wordpress.com/?p=32</guid>
		<description><![CDATA[Go into your directory containing your web code: Use the following command to count the lines of code in php, inc, js and css files:]]></description>
			<content:encoded><![CDATA[<p>Go into your directory containing your web code:</p>
<pre class="brush: bash; light: true; title: ; notranslate">#cd /var/www/html/myVirtualHost</pre>
<p>Use the following command to count the lines of code in php, inc, js and css files:</p>
<pre class="brush: bash; light: true; title: ; notranslate">#find . -type f -name '*.js' -o -name '*.css' -o -name '*.inc' -o -name '*.php'   | xargs wc -l | tail -n1</pre>
<pre class="brush: bash; light: true; title: ; notranslate">31065 total</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.envision-systems.com.au/blog/2010/08/03/count-lines-of-code-in-a-linux-web-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

