<?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>All About LAMP</title>
	<atom:link href="http://allaboutlamp.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://allaboutlamp.com</link>
	<description>Create web applications with Linux, Apache, MySQL, PHP and other open source technologies</description>
	<lastBuildDate>Thu, 31 Dec 2009 09:33:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>How to Setup Virtual Machines using Xen</title>
		<link>http://allaboutlamp.com/2009/12/how-to-setup-virtual-machines-using-xen/</link>
		<comments>http://allaboutlamp.com/2009/12/how-to-setup-virtual-machines-using-xen/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 09:33:00 +0000</pubDate>
		<dc:creator>Daniel Lam</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[guest domain]]></category>
		<category><![CDATA[host domain]]></category>
		<category><![CDATA[lenny]]></category>
		<category><![CDATA[Xen]]></category>
		<category><![CDATA[xen-tools]]></category>

		<guid isPermaLink="false">http://allaboutlamp.com/?p=134</guid>
		<description><![CDATA[Xen is a great open source platform to create multiple virtual machines in one 
physical machine. This article describes how to setup a Xen host domain in a PC 
and how to create a Xen guest domain on it.
]]></description>
			<content:encoded><![CDATA[<p><!-- Title<br />
How to Setup Virtual Machines using Xen?<br />
--></p>
<p><span style="text-decoration: underline;"><strong>Overview</strong></span></p>
<p>Xen is a great open source platform to create multiple virtual machines in one physical machine. This article describes how to setup a Xen host domain in a PC and how to create a Xen guest domain on it.</p>
<p><span style="text-decoration: underline;"><strong>Context</strong></span></p>
<p>This article is for those who are new to Xen and with basic unix knowledge. It aims to provide easy-to-follow instructions for readers to start experimenting with Xen, as well as explaining the key concepts behind the setup. </p>
<p>Debian 5.0 Lenny is used as the operating system for the Xen host and guest domains in these instructions. Setup for other operating systems may be similar but are not covered in this article.</p>
<p><span style="text-decoration: underline;"><strong>Solution</strong></span></p>
<p>Virtualisation technologies like Xen make it possible to run multiple virtual machines concurrently in one physical machine. This allows you to, for example, </p>
<ul>
<li>Set up a team development environment and multiple testing environments in one physical machine, </li>
<li>Set up a 10-machine virtual network to test various network configurations, </li>
<li>Try out various linux distros and Windows in one PC. </li>
</ul>
<p>This is also the core technology that made cloud computing a reality. In fact, Xen is used by service providers like Rackspace to provide virtual machines to their customers.</p>
<p>Xen is not an operating system that lets you put new systems on it &#8211; it is more like a software package in a linux operating system, except that it is so tightly integrated with the core system processes that it becomes part of the operating system (the kernel). </p>
<p>A great way to see Xen in action is by downloading the <a href="http://wiki.xensource.com/xenwiki/LiveCD" target="new">Xen Live CD</a> image, create the CD and boot from it. It shows what a complete Xen system looks like. Note that the Xen Live CD is for demonstration only &#8211; you cannot install a host domain from it.</p>
<p>Another definitive knowledge source for Xen is through its <a href="http://wiki.xensource.com/xenwiki/XenDocs" target="new">User Manual</a>.</p>
<p>We will set up a Xen system with host and guest domains through the following steps:</p>
<ol>
<li>Pre-requisits</li>
<li>Install Debian 5.0 Lenny</li>
<li>Install Xen on Debian 5.0 Lenny to turn it to a Host Domain</li>
<li>Install Debian as a Guest Domain on the Host Domain</li>
</ol>
<p><span style="text-decoration: underline;"><strong>1. Pre-requisits</strong></span></p>
<p>Before you begin, first check if your physical PC has what you need:</p>
<ul>
<li><b>Memory</b> &#8211; As with other applications, the more the better. A 2GB RAM machine was used for the exercise in this article but less should be okay.</li>
<li><b>Hard disk</b> &#8211; Again, the more the better. It depends how many virtual machines you plan to create and what will be run in them. 10GB for each virtual machine will usually be more than enough. As a baseline indicator, the Xen Live CD is able to squeeze one host and one activated guest domain in one CD-ROM.</li>
<li><b>CPU</b> &#8211; Any modern Intel/AMD processor should do. For this exercise, the machine in use has an Intel Pentium 4 3.4 GHz processor.</li>
<li><b>Operating System</b> &#8211; According to the Xen User Manual, any &#8220;working Linux distribution using the GRUB bootloader&#8221; will do. More on this in the next section.</li>
</ul>
<p><span style="text-decoration: underline;"><strong>2. Install Debian 5.0 Lenny</strong></span></p>
<p>First of all, you need a linux operating system in the machine before you can install Xen on it. This OS will automatically become the <i>host domain</i>, also known as <i>domain 0</i> of Xen after Xen is installed, and will be used to control the other virtual machines (<i>guest domains</i>).</p>
<p>Personally, I recommend installing only the Xen host and guest domains in one PC (it is complex enough!), therefore you should wipe the PC clean when you do the installation described in this section.</p>
<p>Installing Debian 5.0 Lenny is simple &#8211; simply download the <a href="http://www.debian.org/CD/http-ftp/#stable" target="new">first CD-ROM image</a>, burn the CD, then boot from it and follow on-screen instructions. Note that there are 31 (!) CD-ROM images in total for Debian 5.0 Lenny, but only the first one is required to create a basic installation as the Xen host domain.</p>
<p>During installation, note that</p>
<ul>
<li><b>Partitioning</b> &#8211; Allocating 10 GB to the primary partition for the host domain will be more than enough. You probably also want to define a few logical partitions in the extended partition, so that Xen guest domains can be installed on them later. If 10 GB seems too much for you, consider at least allocating 4 GB to host domain, as Debian, Xen packages and related tools would have taken 3 GB of space. </li>
<li><b>Select and Install Software</b> &#8211; Select &#8220;Desktop Environment&#8221; and &#8220;Standard System&#8221; only. Your host domain should only do resource allocation and monitoring for your guest domains and should not carry other roles.</li>
</ul>
<p>Perhaps you wonder if the other linux distros will do a better job as a Xen host domain, like I did. Here are some analysis after a few hours of online research,</p>
<ul>
<li><b>Fedora Core</b> &#8211; Fedora Core used to be one of the popular candidates for Xen host domain OS, however it no longer supports Xen (as a host domain) starting from Fedora Core 8.</li>
<li><b>Ubuntu</b> &#8211; Ubuntu is one of the popular candidates for Xen host domain OS. It was almost used in this exercise &#8211; However, installing Ubuntu 9.10 was not successful and that was the end of the quest (the installation CD keeps being read after choosing &#8220;Install Ubuntu&#8221; in menu, and does not proceed).</li>
<li><b>Debian</b> &#8211; Debian is also popular. Plus, it was chosen as the Host Domain OS in the Xen Live CD, which provides a good source of reference for configuration issues.</li>
</ul>
<p><span style="text-decoration: underline;"><strong>3. Install Xen on Debian 5.0 Lenny to turn it to a Host Domain</strong></span></p>
<p>Because of the many Linux distributions and their many verions, combined with the multiple verisions of Xen for them, and also the fact that there are multiple ways to install Xen, online instructions can be very confusing.</p>
<p>According to the Xen User Manual, there are three approaches in installing Xen. </p>
<ol>
<li><b>Installing from Binary Tarball</b> &#8211; Download a tar file and running the install script</li>
<li><b>Installing from RPMs</b> &#8211; Use rpm command to get and install Xen</li>
<li><b>Installing from Source</b> &#8211; Download source codes and build binaries manually</li>
</ol>
<p>For Debian 5.0 Lenny, running the single command below as root user will be able to download and install Xen for you. This is similar to &#8220;Installing from RPMs&#8221; approach, except rpm is mainly used in Fedora Core.</p>
<p><code>apt-get install xen-linux-system-2.6.26-2-xen-686</code></p>
<p>After installation, reboot the computer. The GRUB boot loader should now have three new options, adding to the original two,</p>
<ul>
<li>Xen&#8230;</li>
<li>Debian&#8230; -xen &#8230; </li>
<li>Debian&#8230; -xen &#8230; (single user mode)</li>
<li>Debian&#8230;   </li>
<li>Debian&#8230; (single user mode)</li>
</ul>
<p>Boot with the first option will start up the Xen host domain. After logging in, run the command below as root user</p>
<p><code>xm list</code></p>
<p>It should show that Domain-0 is now running.</p>
<p><span style="text-decoration: underline;"><strong>4. Install Debian as a Guest Domain on the Host Domain</strong></span></p>
<p>Compared to installing host domain, online documentations for installing guest domains can be even more confusing due to the many combinations of host and guest linux distributions.</p>
<p>Fortunately, <i>xen-tools</i> has made the task of getting, deploying and managing Xen guest domains relatively simple. First of all, run the following command as root user to install xen-tools.</p>
<p><code>apt-get install xen-tools</code></p>
<p>Read through <a href="http://www.virtuatopia.com/index.php/Building_a_Xen_Guest_Domain_using_Xen-Tools" target="new">this tutorial from Virtuatopia.com</a> to understand how xen-tools help you create a guest domain. There are also some useful information from the <a href="http://www.xen-tools.org/software/xen-tools/" target="new">Xen Tools official site</a> and <a href="http://www.debian-administration.org/article/A_brief_introduction_to_xen-tools" target="new">another tutorial</a>.</p>
<p>These tutorials mentioned above should have answered most of your questions. Adding my my two-cents from my own experience,</p>
<ul>
<li>If you do not understand the differences between the <i>dir</i> and <i>lvm</i> options, consider reading chapter 6 <i>Storage and File System Management</i> in the <a href="http://tx.downloads.xensource.com/downloads/docs/user/" target="new">Xen User Manual</a>.</li>
<li>The LVM option is great &#8211; and there is a <a href="http://www.debian-administration.org/articles/410" target="new">detail tutorial here</a>.</li>
</li>
</ul>
<p>Assuming you have understood how xen-tools work and made required changes in <i>/etc/xen-tools/xen-tools.cfg</i> to suit your needs, you can run </p>
<p><code>xen-create-image --hostname &lt;hostname of virtual machine&gt; --ip &lt;IP of virtual machine&gt;</code></p>
<p>to create your guest domain. While the command is executing, you can use </p>
<p><code>tail -f /var/log/xen-tools/&lt;hostname of virtual machine&gt;.log</code></p>
<p>to check its progress.</p>
<p>If all went well, you should be able to see the your guest domain created as logical volumes in your specified volume group (or as files if you used that option), and also a Xen domain config file in /etc/xen/ with your virtual machine hostname as the filename. </p>
<p>Before you boot-up your newly created virtual machine, remember to modify the Xen config file, <i>/etc/xen/xend-config.sxp</i> and change &#8220;network-dummy&#8221; to &#8220;network-bridge&#8221; in the network-script option. Otherwise, if your virtual machine has been configured any network information (IP address, gateway, name server etc), you will see this error when booting up the virtual machine:</p>
<p><i>Error: Device 0 (vif) could not be connected. Could not find bridge, and none was specified</i></p>
<p>And remember to run</p>
<p><code>xend restart</code></p>
<p>for the change to take effect.</p>
<p>And finally, if all went well, run this </p>
<p><code>xm create /etc/xen/&lt;hostname of virtual machine&gt;.cfg -c</code></p>
<p>and your virtual machine will start up!</p>
]]></content:encoded>
			<wfw:commentRss>http://allaboutlamp.com/2009/12/how-to-setup-virtual-machines-using-xen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How does Facebook Connect Authentication work?</title>
		<link>http://allaboutlamp.com/2009/11/how-does-facebook-connect-authentication-work/</link>
		<comments>http://allaboutlamp.com/2009/11/how-does-facebook-connect-authentication-work/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 15:00:58 +0000</pubDate>
		<dc:creator>Daniel Lam</dc:creator>
				<category><![CDATA[Facebook Connect]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[interaction diagram]]></category>

		<guid isPermaLink="false">http://allaboutlamp.com/?p=98</guid>
		<description><![CDATA[Facebook Connect is a mechanism provided by Facebook that lets their users bring their identity and social experience to any website. The first step is authentication - let visitors login to your site with their Facebook accounts. This article explains how that works.]]></description>
			<content:encoded><![CDATA[<p><span style="text-decoration: underline;"><strong>Overview</strong></span></p>
<p>Facebook Connect is a mechanism provided by Facebook that lets their users bring their identity and social experience to any website. The first step is authentication &#8211; let visitors login to your site with their Facebook accounts. This article explains how that works.</p>
<p><span style="text-decoration: underline;"><strong>Context</strong></span></p>
<p>This article is for web application developers learning how to implement Facebook Connect authentication in their websites. It is introductory and explains the interaction between the browser, Facebook and your website during authentication. The article also contains references to the sample Facebook Connect web application, <a href="http://www.somethingtoputhere.com/therunaround/demo.tgz">The Turn Around</a>, to point out where the actual function calls are. </p>
<p><span style="text-decoration: underline;"><strong>Solution</strong></span></p>
<p>The authentication process begins when user clicks on the Facebook Connect login button in your website. User will see a pop-up from Facebook and sign in with Facebook account details. Once user logs in, your website can retrieve Facebook user info like profile photo and will be able to write back to Facebook (e.g. publishing feed story in profile) if user grants the required specific permissions.</p>
<p>Exchange of handshakes, credentials, cookies and various function calls occur between the user browser, your website and Facebook server during the authentication process. They are illustrated in the interaction diagram below.</p>
<p><center><br />
<div id="attachment_100" class="wp-caption alignnone" style="width: 260px"><a target="new" href="http://allaboutlamp.com/wp-content/uploads/2009/11/Facebook-Connect-Authentication.gif"><img src="http://allaboutlamp.com/wp-content/uploads/2009/11/Facebook-Connect-Authentication-250x300.gif" alt="Facebook Connect Authentication - Interaction Diagram" title="Facebook Connect Authentication - Interaction Diagram" width="250" height="300" class="size-medium wp-image-100" /></a><p class="wp-caption-text">Facebook Connect Authentication - Interaction Diagram (click to enlarge)</p></div><br />
</center></p>
<ol>
<li>User visits your website.
<li>Your website checks with Facebook to see if user has already signed in using Facebook Connect.
<li>Facebook says no. Using codes in TheRunAround as an example:
<ol type='i'>
<li>index.php &#8211; checks if user has logged in Facebook via User::getLoggedIn()
<li>getLoggedIn() in lib/user.php &#8211; calls facebook_client() and retrieve the facebook user via Facebook::get_loggedin_user()
<li>facebook_client() in lib/fbconnect.php &#8211; creates Facebook object
<li>Constructor in facebook.php (in Facebook PHP library) &#8211; connects to facebook server using api_client, retrieves params via validate_fb_params() but will not get anything. As a result no user will be set
<li>get_loggedin_user() in facebook.php returns null which eventually gets passed back to index.php
	</ol>
<li>Your website returns a page that displays a Connect with Facebook login button. In the sample app, this is done in render_fbconnect_button() in lib/fbconnect.php. Note how the button can be displayed by showing the image directly and calling the FB.Connect.requireSession(), or just by using the <fb:login-button> xFBML syntax.
<li>User clicks on login button. FB.Connect.requireSession() is called
<li>FB.Connect.requireSession() found that user has not logged in Facebook yet and display a &#8220;Connect with Facebook&#8221; pop-up. The pop-up could be in the form of pop-up window or an iFrame window depending on parameters. Note that starting from this step, it is part of the Facebook javascript library and is not open-sourced. Its <a target="new" href="http://wiki.developers.facebook.com/index.php/JavaScript_Client_Library">API</a> is available. This is also an example of the much-discussed <a target="new" href="http://wiki.developers.facebook.com/index.php/Cross_Domain_Communication">&#8220;cross-site scripting&#8221;</a>, as this is a page from your server dynamically loading a script from Facebook server.
<li>User enters Facebook credentials.
<li>Facebook verifies user credentials. Once verified, it calls the javascript callback function registered in waitUntilReady(). The callback function has been registered in facebook_onload() in fbconnect.js.
<li>The callback function in facebook_onload() detects that session status has changed and refresh the page.
<li>Step 1 is repeated again to check if user has logged in to Facebook.
<li>Facebook says yes. User::getLoggedIn() will create and return a user object with a valid Facebook user ID.
<li>Web page displays Facebook content such as profile photo, friends who are also using your website, etc.
</ol>
<p>Once connected, your website will be able to read from and write to the Facebook system on behalf of the logged in user via Facebook API.</p>
<p>Because of the many documents available online and the fact that many of them are outdated, downloading The Run Around sample application and studying it in detail is highly recommended.</p>
<p><span style="text-decoration: underline;"><strong>Reference</strong></span></p>
<ul>
<li><a target="new" href="http://wiki.developers.facebook.com/index.php/Getting_Started_with_Facebook_Connect">http://wiki.developers.facebook.com/index.php/Getting_Started_with_Facebook_Connect</a> &#8211; The beginner&#8217;s guide to Facebook Connect.
<li><a target="new" href="http://wiki.developers.facebook.com/index.php/Using_Facebook_Connect_with_Server-Side_Libraries">http://wiki.developers.facebook.com/index.php/Using_Facebook_Connect_with_Server-Side_Libraries</a> &#8211; Facebook wiki doc explaining how server-side libraries are used.
<li><a target="new" href="http://www.somethingtoputhere.com/therunaround/index.php">The Run Around</a> &#8211; Sample Facebook Connect application provided by Facebook. Its source code is available for <a href="http://www.somethingtoputhere.com/therunaround/demo.tgz">download</a>.
</ul>
]]></content:encoded>
			<wfw:commentRss>http://allaboutlamp.com/2009/11/how-does-facebook-connect-authentication-work/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why does the basic Facebook Connect example not work?</title>
		<link>http://allaboutlamp.com/2009/11/why-does-the-basic-facebook-connect-example-not-work/</link>
		<comments>http://allaboutlamp.com/2009/11/why-does-the-basic-facebook-connect-example-not-work/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 10:15:38 +0000</pubDate>
		<dc:creator>Daniel Lam</dc:creator>
				<category><![CDATA[Facebook Connect]]></category>
		<category><![CDATA[login]]></category>

		<guid isPermaLink="false">http://allaboutlamp.com/?p=77</guid>
		<description><![CDATA[You are trying to implement Facebook Connect in your site so that your visitors can log in to your site using their Facebook accounts. You followed the simplest example available in 
 <a target="new" href="http://wiki.developers.facebook.com/index.php/Connect/Setting_Up_Your_Site">a Facebook wiki document</a>, however for some reason the "Connect with Facebook" button does not seem to do anything - no pop-up, no error, nothing. Why is that?
]]></description>
			<content:encoded><![CDATA[<p><span style="text-decoration: underline;"><strong>Overview</strong></span></p>
<p>You are trying to implement Facebook Connect in your site so that your visitors can log in to your site using their Facebook accounts. You followed the simplest example available in<br />
 <a target="new" href="http://wiki.developers.facebook.com/index.php/Connect/Setting_Up_Your_Site">a Facebook wiki document</a>, however for some reason the &#8220;Connect with Facebook&#8221; button does not seem to do anything &#8211; no pop-up, no error, nothing. Why is that?</p>
<p><span style="text-decoration: underline;"><strong>Context</strong></span></p>
<p>This article is for those who want to implement Facebook Connect in their websites. It explains the scenario when a simple Facebook Connect login button does not seem to work.</p>
<p><span style="text-decoration: underline;"><strong>Solution</strong></span></p>
<p>The login button does not do anything most likely because you have not set it up to do anything.</p>
<p>The basic example shown in this Facebook developers wiki page: <a href="http://wiki.developers.facebook.com/index.php/Connect/Setting_Up_Your_Site">http://wiki.developers.facebook.com/index.php/Connect/Setting_Up_Your_Site</a> has instructions in great detail, however it has not mentioned clearly that it actually only shows you how to <em>display</em> a Facebook Connect login button.</p>
<p>The test.html described in the wiki page is </p>
<p><code><br />
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xmlns:fb=&quot;http://www.facebook.com/2008/fbml&quot;&gt;<br />
&lt;head&gt;&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;script src=&quot;http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&lt;fb:login-button&gt;&lt;/fb:login-button&gt;<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
    FB.init(&quot;YOUR_API_KEY_HERE&quot;, &quot;xd_receiver.htm&quot;);<br />
&lt;/script&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
</code></p>
<p>If all instructions in the wiki page have been followed correctly, clicking on the resultant Connect-with-Facebook login button should trigger a Facebook login form to appear in a pop-up window, <em>given that the user has not logged in to Facebook yet</em>.</p>
<p>If user has logged in to Facebook and clicks on the login button for the first time, a pop-up will appear to ask the user to authorize the integration between your website and Facebook. </p>
<p>Once user logs in via the pop-up window or agrees on the Facebook Connect authorization, clicking on the login button will no longer trigger any actions because user is now &#8220;connected&#8221; and there is no &#8220;callback function&#8221; specified in the html file. </p>
<p>To make it slightly more confusing, the authorization pop-up will only appear once: Even after you clear all the cookies and log out of Facebook in an attempt to start from the beginning, the login button will no longer trigger any actions if you log in Facebook again and click on the test login button. This is because Facebook remembers your authorisation from its servers.</p>
<p>When the wiki page says &#8220;Optionally, you can add a JavaScript handler to the callback function to call when the user logs in&#8221;, it actually meant &#8220;Unless you want user to see no changes after logging in, you need to add a JavaScript handler&#8230;&#8221;.</p>
<p>So how do you specify a &#8220;callback function&#8221; and how does Facebook Authentication work? A separate <a href="http://allaboutlamp.com/2009/11/why-does-the-basic-facebook-connect-example-not-work/">article</a> has been written to answer this question.</p>
]]></content:encoded>
			<wfw:commentRss>http://allaboutlamp.com/2009/11/why-does-the-basic-facebook-connect-example-not-work/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to avoid Time Reset in a Cloud Computing environment such as Xen VPS (Virtual Private Server)</title>
		<link>http://allaboutlamp.com/2009/10/how-to-avoid-time-reset-in-cloud-computing-environment-xen-vps/</link>
		<comments>http://allaboutlamp.com/2009/10/how-to-avoid-time-reset-in-cloud-computing-environment-xen-vps/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 03:34:39 +0000</pubDate>
		<dc:creator>Daniel Lam</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[clock drift]]></category>
		<category><![CDATA[ntpd]]></category>
		<category><![CDATA[ntpdate]]></category>
		<category><![CDATA[time reset]]></category>
		<category><![CDATA[time zone]]></category>
		<category><![CDATA[virtualisation]]></category>
		<category><![CDATA[Xen]]></category>

		<guid isPermaLink="false">http://allaboutlamp.com/?p=47</guid>
		<description><![CDATA[Your server is a virtual private server running Fedora (or other linux distro) on a cloud computing service such as RackSpace Cloud Server. For some reason, whenever you change the system time, it gets reset back after a system restart. Why did that happen? Could it be fixed?]]></description>
			<content:encoded><![CDATA[<p><span style="text-decoration: underline;"><strong>Overview</strong></span></p>
<p>Your server is a virtual private server running Fedora (or other linux distro) on a cloud computing service such as RackSpace Cloud Server. For some reason, whenever you change the system time, it gets reset back after a system restart. Why did that happen? Could it be fixed?</p>
<p><span style="text-decoration: underline;"><strong>Context</strong></span></p>
<p>Solution described in this article applies to Fedora Core 11 hosted in a Xen VPS environment. Other Fedora verions or linux distro in other virtualisation environment may have similar setup. Xen configuration is outside the scope of this article.</p>
<p><span style="text-decoration: underline;"><strong>Solution</strong></span></p>
<p>As a virtual server hosted using Xen virtualisation technology, such as those offered by RackSpace Cloud Server offer, system time will get reset by Xen to match the physical machine&#8217;s clock whenever the virtual server is restarted.</p>
<p>This time-reset behaviour can be modified if you can change the Xen configuration. However as a user of the cloud computing service, you most likely do not have such access.</p>
<p>You can however do the following to set your system to the time you want.</p>
<p><strong>1. Change time zone</strong></p>
<p>Changing the time zone of your system will set your system time to the correct time of that time zone, given that your virtualisation provider gives your server a correct <a href="http://en.wikipedia.org/wiki/Coordinated_Universal_Time">UTC time</a>.</p>
<p>To change the time zone in Fedora Core 11,</p>
<ul>
<li>Change the ZONE parameter value in <em>/etc/sysconfig/clock</em> according to your desired time zone, e.g. <em>ZONE=&#8221;Australia/Sydney&#8221;</em>. The list of possible values for ZONE can be found in <em>/usr/share/zoneinfo/</em>. The UTC parameter in <em>/etc/sysconfig/clock</em> can be omitted.</li>
<li>Copy the correct time zone file to <em>/etc/localtime</em>. For example, if you want to set time zone to Sydney in Australia, do <code>cp /usr/share/zoneinfo/Australia/Sydney /etc/localtime</code></li>
</ul>
<p><strong>2. Use a time-synchronising tool</strong></p>
<p>After you have set your system to the correct time zone, the time may still be inaccurate because it simply relies on the time given by the virtualisation provider.</p>
<p>To compensate any inaccuracy from virtualisation provider, use time-synchronising tool like <em>ntpdate</em> to sychronise your server with publicly-available time servers.</p>
<ol>
<li>Install ntpdate if it is not already installed in your system. Run <code>yum install ntpdate</code> to install ntpdate.</li>
<li>Turn on ntpdate service using <code>chkconfig --level 3 ntpdate on</code> so that time will be sync&#8217;d on boot time. Note that your &#8220;level&#8221; may be different, check <em>/etc/inittab</em> to be sure.</li>
<li>Use cron job to run ntpdate hourly or daily to keep an accurate time in the long term.</li>
</ol>
<p>Note that in a virtualisation environment, <em>ntpd</em> will not be able to set the time of guest system properly because of the CPU time-sharing nature of virtualisation technology. Refer to ntp docs for more information: <a href="http://support.ntp.org/bin/view/Support/VMWareNTP">http://support.ntp.org/bin/view/Support/VMWareNTP</a></p>
<p><strong>3. Use date command to change system date and do not restart</strong></p>
<p>If setting your system to match specific time zones accurately still does not fulfill your requirement (e.g. if you want your time to be 15 minutes behind, for testing purpose), you can still change your system time using date command. However keep in mind that this will be reset back to the correct time of your time zone after a restart.</p>
<p><span style="text-decoration: underline;"><strong>Reference</strong></span></p>
<ul>
<li><a href="http://support.ntp.org/bin/view/Support/VMWareNTP">http://support.ntp.org/bin/view/Support/VMWareNTP</a> Network Time Protocol documentation regarding the virtualisation environment.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://allaboutlamp.com/2009/10/how-to-avoid-time-reset-in-cloud-computing-environment-xen-vps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to Prevent Web Server Emails from being Marked as SPAM</title>
		<link>http://allaboutlamp.com/2009/09/how-to-prevent-web-server-emails-from-being-marked-as-spam/</link>
		<comments>http://allaboutlamp.com/2009/09/how-to-prevent-web-server-emails-from-being-marked-as-spam/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 17:36:05 +0000</pubDate>
		<dc:creator>Daniel Lam</dc:creator>
				<category><![CDATA[Email]]></category>
		<category><![CDATA[blacklist]]></category>
		<category><![CDATA[dkim]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[localhost]]></category>
		<category><![CDATA[mx]]></category>
		<category><![CDATA[reverse dns]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[spf]]></category>

		<guid isPermaLink="false">http://allaboutlamp.com/?p=20</guid>
		<description><![CDATA[This article describes what you can do, as the system administor / post master of your mail servers, to make sure emails sent from your mail servers go straight to the inboxes of the recipients instead of landing in their spam/junk folder. Because of the bad guys, good guys have to do a lot more to prove their innocence.]]></description>
			<content:encoded><![CDATA[<p><span style="text-decoration: underline;"><strong>Overview</strong></span></p>
<p>Web servers with web applications like forums or blogs often need to send out emails to users. These emails are often legitimate and useful to users, however email providers often incorrectly classify them as spam because of the amount of spam emails found in the internet today.</p>
<p>This article describes what you can do, as the system administor / post master of your mail servers, to make sure emails sent from your mail servers go straight to the inboxes of the recipients instead of landing in their spam/junk folder. Because of the bad guys, good guys have to do a lot more to prove their innocence.</p>
<p><span style="text-decoration: underline;"><strong>Context</strong></span></p>
<p>Solution described in this article has been tested in a Fedora / Postfix setup. Most of the steps are not specific to this setting and can be applied on other environments. Note that these are only possible actions one can *attempt* to prevent emails to be marked as spam. It is ultimately up to the recipient mail servers to decide whether emails are spam or not.</p>
<p>This article assumes reader to have a good understanding of DNS, Unix and web server-related terms and how they work in high level. Most changes described in this article require system-administration / root access to the server.</p>
<p><span style="text-decoration: underline;"><strong>Steps</strong></span></p>
<p><strong>1. Make sure Sender Username and Server Look Legitimate</strong></p>
<p>If you just configured your server to send email, chances are that your out-going emails have words like &#8220;apache&#8221;, &#8220;localhost&#8221;, &#8220;nobody&#8221;, &#8220;localdomain&#8221; all over the place in their mail headers. This is often a sign of improper setup and therefore such mails will be marked as spam by spam filters.</p>
<p>To get rid of them, check the following configurations:</p>
<ul>
<li><code>/etc/hosts</code> This file needs to be set up properly so that the &#8220;hostname&#8221; command returns the public hostname instead of &#8220;localhost&#8221;, and &#8220;hostname -f&#8221; returns the fully-qualified domain name, like &#8220;foo.fooworld.com&#8221;.</li>
<li><code>/etc/httpd/conf/httpd.conf</code> Check the ServerAdmin and SererName of this Apache config file and ensure that it is a valid email address and a fully-qualified domain name.</li>
<li><code>/etc/mail/trusted-users</code> If you need to send emails under a privileged user like apache as some other users such as no-reply@yourdomain.com, modify this file and add the username of the privileged user.</li>
<li><code>/etc/php.ini</code> If you are using php to send emails, you can enforce a different sender identify by adding -f&#8217;sender_address@domain.com&#8217; in the sendmail_path argument.</li>
<li>Use postfix instead of sendmail if you are sending emails from apache and want to ensure that the word &#8220;apache&#8221; is not in the headers of your out-going emails. This is required because in sendmail, even if a &#8220;-f&#8221; option is used to enforce a particular sender identity, the text &#8220;apache@localhost&#8221; will still appear in the first Receive mail header.</li>
<li>The mail header fields &#8220;From&#8221;, &#8220;Reply-To&#8221; and &#8220;Return-Path&#8221; should be the same and be a valid email address, and will not reply with a bounce message if an email is sent to it.</li>
</ul>
<p><strong>2. Setup Reverse DNS</strong></p>
<p>The usual DNS records allow everyone to lookup &#8220;foo.foobar.com&#8221; and find &#8220;123.124.125.126&#8243;. Reverse DNS does the opposite: It allows you to look up the IP address using the domain name. If the domain name and IP address can be used to look up each other, the sender is more likly to be what it claims it is. Therefore this check is employed by spam filter as well.</p>
<p>Note that Reverse DNS setting is not controlled by the domain name server of the domain in question. Using the example above, the DNS server of &#8220;foo.foobar.com&#8221; cannot control its Reverse DNS settings. It is the responsibility of the ISP that maintains 123.124.125.126 to set up its Reverse DNS mapping.</p>
<p>To verify that it has been set up, use &#8220;nslookup &lt;domain name&gt;&#8221; to check for its IP and &#8220;nslookup &lt;ip address&gt;&#8221; to check for its domain name. They should find each other if DNS and Reverse DNS have been set properly.</p>
<p><strong>3. Add SPF Record</strong></p>
<p>SPF record is a TXT record in the domain server, like the other A / CNAME / MX type DNS records, that describes the domain. Spam filter gets the SPF record from DNS server and check if the sender mail server has been allowed or disallowed to send mails.</p>
<p>SPF implementation is free and simple. You can create a SPF record manually if you understand its specification, or you can go to one of the following websites to generate it after answering some questions about your mail server settings.</p>
<p><a href="http://old.openspf.org/wizard.html">http://old.openspf.org/wizard.html</a><br />
<a href="http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/default.aspx">http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/default.aspx</a></p>
<p><strong>4. IP Blacklist Check</strong></p>
<p>Some of the bad guys might have used *your* IP address before to send out spam emails, and now any emails sent from your machine are classified as spam. A website like the one below lets you check if your machine falls into such category, and if it does, lets you request that your IP be taken out from the list. </p>
<p><a href="http://www.mxtoolbox.com/blacklists.aspx">http://www.mxtoolbox.com/blacklists.aspx</a></p>
<p><strong>5. Ensure Mail-Sending Server is listed on MX record</strong></p>
<p>The MX record in the DNS entries tells the whole world which machine should process emails for that domain. If the web server that sends outgoing emails is not listed on one of the MX records, spam filters may think that mails were sent without proper authorisation and therefore should be marked as spam.</p>
<p>As an example, let say you are sending emails from foo.foobar.com. A lookup of MX record of foobar.com shows that the mail server is mail.foobar.com instead. This could be a problem for spam-filter. Configure foo.foobar.com as a proper mail server, point to it using MX record and use it to send and receive emails for foobar.com.</p>
<p><strong>6. Implement DKIM (Domain Keys Identified Mail)</strong></p>
<p>DKIM is similar to SPF. The sender claims that it is from foobar.com and the recipient checks the DNS records of foobar.com to see if the sender is indeed from there. The difference is that, for DKIM, sender has to present a &#8220;signature&#8221; instead of just using its IP to prove its identity.</p>
<p>Refer to this <a href="http://allaboutlamp.com/2009/09/setup-dkim-for-postfix-in-fedora-using-dkim-milter/">article</a> for implementation details of DKIM.</p>
<p>Gmail in particular appear to put emails in inbox only after DKIM has been implemented.</p>
<p><strong>7. Contact Individual Providers</strong></p>
<p>The recipient mail servers may still decide that your emails are spam, even after you have done the whole lot above. </p>
<p>For example, official support from Microsoft stated that &#8220;&#8230; IPs that have little to no history of sending email to Hotmail are more likely to be targeted by SmartScreen&#8230;&#8221;. SmartScreen is one of their spam-filtering tools that filter emails based on machine learning algorithms. With such assumption made by this program, emails from new servers will inevitably go to the junk folder of hotmail addresses.</p>
<p>Advise from official Microsoft Support for this issue is that &#8220;Following all the recommendations (from their postmaster policy guidelines)&#8230; will really make a big difference. Have a nice day!&#8221;. There is not much you can do. However, your out-going emails may become non-junk after a few weeks of SmartScreen learning about your server IP, given that your emails are not labelled as junk by your recipients and emails are sent consistently.</p>
<p>As a last resort, you can try to contact the free email providers directly using the web pages they provide:</p>
<ul>
<li><a href="http://help.yahoo.com/l/us/yahoo/mail/postmaster/bulkv2.html">http://help.yahoo.com/l/us/yahoo/mail/postmaster/bulkv2.html</a> Yahoo Mail support page for marked-as-spam problem
<li><a href="https://support.msn.com/eform.aspx?productKey=edfsmsbl&#038;ct=eformts">https://support.msn.com/eform.aspx?productKey=edfsmsbl&#038;ct=eformts</a> Microsoft support page for marked-as-spam problem
</ul>
<p><span style="text-decoration: underline;"><strong>Errors / Configuration Problems</strong></span></p>
<p><strong>Mail source from Gmail shows &#8220;Received-SPF: neutral&#8221;</strong></p>
<p>This is a sign that your SPF record has not been implemented properly. If it has been done correctly, the header should say &#8220;Received-SPF: pass&#8221; instead. Have you specified the correct IP? Have the DNS records been updated properly?</p>
<p><strong>Mail source from Gmail shows &#8220;dkim=neutral (body hash did not verify)&#8221;</strong></p>
<p>A work-around for this problem is provided in <a href="http://allaboutlamp.com/2009/09/setup-dkim-for-postfix-in-fedora-using-dkim-milter/">http://allaboutlamp.com/2009/09/setup-dkim-for-postfix-in-fedora-using-dkim-milter/</a>.</p>
<p><span style="text-decoration: underline;"><strong>Reference</strong></span></p>
<ul>
<li><a href="http://dnsstuff.com">http://dnsstuff.com</a> A website that generates comprehensive report for your DNS records and tells you how &#8220;healthy&#8221; they are. Make use of the 7-day trial period!</li>
<li><a href="http://www.mxtoolbox.com/blacklists.aspx">http://www.mxtoolbox.com/blacklists.aspx</a> A website to check if the IP address of your mail-sending machine has been blacklisted by spam filters. </li>
<li><a href="http://postmaster.live.com/Troubleshooting.aspx">http://postmaster.live.com/Troubleshooting.aspx</a> Microsoft&#8217;s help for those trying to send emails to hotmail users but marked as spam.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://allaboutlamp.com/2009/09/how-to-prevent-web-server-emails-from-being-marked-as-spam/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to Setup DKIM for Postfix in Fedora using dkim-milter</title>
		<link>http://allaboutlamp.com/2009/09/setup-dkim-for-postfix-in-fedora-using-dkim-milter/</link>
		<comments>http://allaboutlamp.com/2009/09/setup-dkim-for-postfix-in-fedora-using-dkim-milter/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 16:02:29 +0000</pubDate>
		<dc:creator>Daniel Lam</dc:creator>
				<category><![CDATA[Email]]></category>
		<category><![CDATA[dkim]]></category>
		<category><![CDATA[dkim-milter]]></category>
		<category><![CDATA[fedora]]></category>
		<category><![CDATA[postfix]]></category>

		<guid isPermaLink="false">http://allaboutlamp.com/?p=1</guid>
		<description><![CDATA[This article describes how to implement DKIM for Postfix in Fedora using the dkim-milter open-source module. This solution has been tested with Fedora 10.]]></description>
			<content:encoded><![CDATA[<p><span style="text-decoration: underline;"><strong>Overview</strong></span></p>
<p>DKIM is a technology that allows mail senders to attach a signature in outgoing mails, so that recipients can check the signatures against DNS records of the sender to see if mail is indeed sent from there.</p>
<p>Because free email providers like gmail make use of DKIM to determine if sender is sending spam, i.e. &#8220;if your domain does not implement DKIM, you are a spammer&#8221;, it is important to implement DKIM for your mail servers to avoid your legitimate out-going emails be classified as spam.</p>
<p><span style="text-decoration: underline;"><strong>Context</strong></span></p>
<p>This article describes how to implement DKIM for Postfix in Fedora using the dkim-milter open-source module. This solution has been tested with Fedora 10.</p>
<p>DKIM allows a domain to be associated with multiple &#8220;signatures&#8221;. Each signature is identified by its &#8220;selector&#8221;. In this example, we are going to create only one signature with its selector named &#8220;default&#8221;.</p>
<p><span style="text-decoration: underline;"><strong>Steps</strong></span></p>
<p><strong>1. Generate a private key</strong></p>
<p><code>openssl genrsa -out default.private 1024</code></p>
<p>A &#8220;default.private&#8221; key file will be generated. It will be moved to a specific location later.</p>
<p><strong>2. Generate a public key for this private key</strong></p>
<p><code>openssl rsa -in default.private -pubout -out default.public -outform PEM</code></p>
<p>A file with filename &#8220;default.public&#8221; will be generated with content like</p>
<p>	<code>-----BEGIN PUBLIC KEY-----<br />
	MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVqyBW3CvurzAJrWvw/rbiMVL2<br />
	6lytBkhIrgEBWjGWEjjhM6mQpQWLq9VR46xlL4OT6UdVtO8QOMEVI23LN0fwtrPc<br />
	/auwHC2U9joUWTWVjOMZWEywOHwATGevh9TApt2hQJkWjMy/xmCIqBs9VZIweRlf<br />
	VFqc9WEu6VamGe9C3QIDAQAB<br />
	-----END PUBLIC KEY----</code></p>
<p>It will be used to create a DNS TXT record. See next step.</p>
<p><strong>3. Create a DNS record of type TXT</strong></p>
<p>Modify DNS records and add a record of type TXT:</p>
<p>TXT record name<br />
<code>default._domainkey</code></p>
<p>TXT record value<br />
<code>v=DKIM1; g=*; k=rsa; p=<i>&lt;content of default.public&gt;</i></code></p>
<p>Note that the prefix &#8220;&#8212;&#8211;BEGIN PUBLIC KEY&#8212;&#8211;&#8221; and suffix &#8220;&#8212;&#8211;END PUBLIC KEY&#8212;-&#8221; should not be put in the TXT record value.</p>
<p>This DNS record will be retrieved by mail receivers who want to verify emails with DKIM signatures. The record name &#8220;default._domainkey&#8221; tells verifier that the &#8220;selector&#8221; of this signature is  &#8220;default&#8221;, therefore if you are changing selector name to something else, make sure you change all of them consistently.</p>
<p><strong>4. Install dkim-milter in Fedora</strong></p>
<p>Run the following as root to install the dkim-milter pacakge.</p>
<p><code>yum install dkim-milter</code></p>
<p><strong>5. Enable dkim-milter to run on start-up</strong></p>
<p>Make sure dkim-milter service will run on start-up by running this command:</p>
<p><code>chkconfig --level 3 dkim-milter on</code></p>
<p>Note that your server may use a different &#8220;runlevel&#8221;. You can check &#8220;/etc/inittab&#8221; to see which run level you are on.</p>
<p><strong>6. Move private key to appropriate location</strong></p>
<p>As root, copy the private key to the location specified by the &#8220;keylist&#8221; (refer to next step) and make sure it is readable by dkim-milter:</p>
<p><code>mkdir /etc/dkim-milter/<br />
mv default.private /etc/dkim-milter/default<br />
chown dkim-milter.dkim-milter /etc/dkim-milter/default</code></p>
<p>Make sure the filename of private key file matches the &#8220;selector&#8221; name specified in the DNS record.</p>
<p><strong>7. Add an entry to the keylist for dkim-milter to read</strong></p>
<p>Add the following line to /etc/mail/dkim-milter/keys/keylist. Replace &lt;domain.com&gt; with your domain name.</p>
<p><code>*:&lt;domain.com&gt;:/etc/dkim-milter/default</code></p>
<p><strong>8. Configure postfix to use dkim-milter</strong></p>
<p>Add the following lines to /etc/postfix/main.cf to ask postfix to use dkim-milter.</p>
<p><code>smtpd_milters = unix:/var/run/dkim-milter/dkim-milter.sock<br />
non_smtpd_milters = unix:/var/run/dkim-milter/dkim-milter.sock</code></p>
<p><strong>9. Start dkim-milter and restart postfix</strong></p>
<p>Start dkim-milter service and restart postfix using the following commands. Or restart the server.</p>
<p><code>service dkim-milter start<br />
service postfix restart</code></p>
<p><strong>10. Change file permissions of the Mail Filter Socket file</strong></p>
<p>Change file permissions of the &#8220;Mail Filter Socket&#8221; file and its parent directory to allow postfix to write to it:</p>
<p><code>chmod 755 /var/run/dkim-milter<br />
chmod 777 /var/run/dkim-milter/dkim-milter.sock</code></p>
<p>Changing dkim-milter.sock permission unfortunately is required EVERYTIME after dkim-milter servuce is restarted. This is because dkim-milter resets the file to mode 755 that postfix cannot read.</p>
<p>For Fedora, one way to have this done automatically is to add the chmod command in /etc/rc.d/rc.local, so that it will be run on start-up everytime.</p>
<p><span style="text-decoration: underline;"><strong>Errors / Configuration Problems</strong></span></p>
<p><strong>Gmail header says &#8220;dkim=neutral (body hash did not verify)&#8221;</strong></p>
<p>If you are sending emails using mail() function in php, these out-going emails will not be verified by Gmail, for some unknown reason. Opening the mail source in Gmail shows that there is a line &#8220;dkim=neutral (body hash did not verify)&#8221;, hinting that the key in DKIM signature does not match the public key from DNS. Only Gmail knows why. </p>
<p>You may also notice that sending emails directly from the command-line in your server will be DKIM-verified by Gmail, resulting in a &#8220;dkim=pass&#8221; in the mail source headers. Therefore, a work-around for this problem is to modify your php scripts so that it will do a system call to a shell script, which will indirectly send your email out. This way, Gmail will verify your email and put it to the inbox of recipient instead of marking it as spam.</p>
<p><strong>Gmail header says &#8220;dkim=neutral (no key)&#8221; </strong></p>
<p>It means that gmail couldn&#8217;t find a matching key to verify your signature.</p>
<p>So, how does gmail (or any other dkim verifier) find a matching key? It relies on the &#8220;selector name&#8221; from the email header. In the email header there should be something like &#8220;DKIM-Signature: &#8230; s=some_selector_name; t=1254783208;&#8230;&#8221;, here the &#8220;some_selector_name&#8221; is the selector name. Dkim-milter specified that as your selector name as instructed by /etc/mail/dkim-milter/keys/keylist file.</p>
<p>Now if you look at the DNS record for your domain, it needs to have a DKIM public key record (TXT type DNS record) with the name &#8220;some_selector_name._domainkey&#8221; and value being the matching public key. If the name of the record is not &#8220;some_selector_name._domainkey&#8221;, the verifier will not be able to use the public key, because the selector name does not match.</p>
<p>You might have followed an example from internet to set your selector name to &#8220;domain.com_default.key.pem&#8221; and the DNS record name to &#8220;default._domainkey&#8221;, which are not matching each other and therefore getting this no-key message.</p>
<p><span style="text-decoration: underline;"><strong>Reference</strong></span></p>
<ul>
<li><a href="http://www.howtoforge.com/postfix-dkim-with-dkim-milter-centos5.1">http://www.howtoforge.com/postfix-dkim-with-dkim-milter-centos5.1</a> Instructions similar to this article, but for CentOS instead of Fedora. </li>
<li><a href="http://testing.dkim.org/reflector.html">http://testing.dkim.org/reflector.html</a> Free testing to check if your DKIM implementation works.</li>
<li>Config files related to dkim-milter in Fedora:
<p>	Socket file that Postfix connects to<br />
	<code>/var/run/dkim-milter/dkim-milter.sock</code></p>
<p>	Key List file<br />
	<code>/etc/mail/dkim-milter/keys/keylist</code></p>
<p>	Actual private key (can be anywhere as specified by &#8220;Key List&#8221;)<br />
	<code>/etc/dkim-milter/&lt;key filename&gt;</code></p>
<p>	Config file<br />
	<code>/etc/mail/dkim-milter/dkim-filter.conf</code></p>
<p>	Another config file but does not appear to be read by the service<br />
	<code>/etc/sysconfig/dkim-milter</code></p>
<p>	Postfix config that specifies where dkim-milter socket is:<br />
	<code>/etc/postfix/main.cf </code>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://allaboutlamp.com/2009/09/setup-dkim-for-postfix-in-fedora-using-dkim-milter/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
