<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><!-- generator="Joomla! 1.5 - Open Source Content Management" --><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
	<channel>
		<title>The Data Jelly Blog</title>
		<description>Data Jelly is the leading provider of on-demand data integration solutions.</description>
		<link>http://blog.datajelly.com/company/blog.html</link>
		<lastBuildDate>Fri, 17 Jul 2009 06:22:59 +0000</lastBuildDate>
		<generator>Joomla! 1.5 - Open Source Content Management</generator>
		<language>en-gb</language>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/datajelly" type="application/rss+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">datajelly</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
			<title>Adding a Prefix to All Page Titles in Joomla!</title>
			<link>http://blog.datajelly.com/company/blog/62-adding-a-prefix-to-all-page-titles-in-joomla.html</link>
			<guid>http://blog.datajelly.com/company/blog/62-adding-a-prefix-to-all-page-titles-in-joomla.html</guid>
			<description>&lt;p&gt;For our web site and blog, we wanted all of our page titles to start
with a prefix that said "Data Jelly". We use &lt;a href="http://www.joomla.org/" target="_blank" mce_href="http://www.joomla.org/"&gt;Joomla! 1.5&lt;/a&gt; as our Content Management System (CMS), so we couldn't just edit every page to add it in. There doesn't appear to be a native option to do this in the administration, but apparently there are some plugins that can help. However, in our experience, these plugins have been hit or miss, so we decided to simply try to edit the Joomla! source files ourselves. You've got to love open source software!&lt;/p&gt;&lt;p&gt;We used grep to search around and find the right place to edit. To save you some time, it seems the correct file is located under:&lt;/p&gt;&lt;code&gt;libraries/joomla/document/html/renderer/head.php&lt;/code&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt; Edit this file and search for the &amp;lt;title&amp;gt; tag, it should be around line 86. You can then add a prefix or suffix by editing this line.&lt;/p&gt;&lt;p&gt;That's all there is to it! The one caveat is that if you ever upgrade your version of Joomla!, these changes will be lost. However, the steps to edit the title are hopefully easy enough that you can simply re-apply your changes. &lt;br /&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=PX-S4-gUQbc:wYPtV-OgpQk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=PX-S4-gUQbc:wYPtV-OgpQk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=PX-S4-gUQbc:wYPtV-OgpQk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=PX-S4-gUQbc:wYPtV-OgpQk:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=PX-S4-gUQbc:wYPtV-OgpQk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=PX-S4-gUQbc:wYPtV-OgpQk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=PX-S4-gUQbc:wYPtV-OgpQk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=PX-S4-gUQbc:wYPtV-OgpQk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=PX-S4-gUQbc:wYPtV-OgpQk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=PX-S4-gUQbc:wYPtV-OgpQk:dcbBl_P6u8E"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=dcbBl_P6u8E" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
			<author>webmaster@datajelly.com (Data Jelly)</author>
			<category>The Data Jelly Blog</category>
			<pubDate>Sun, 21 Sep 2008 08:55:53 +0000</pubDate>
		</item>
		<item>
			<title>About Us: A (Re)Introduction to the Data Jelly Blog</title>
			<link>http://blog.datajelly.com/company/blog/61-about-us-a-reintroduction-to-the-data-jelly-blog.html</link>
			<guid>http://blog.datajelly.com/company/blog/61-about-us-a-reintroduction-to-the-data-jelly-blog.html</guid>
			<description>&lt;p&gt;Normally, the very first post on a blog would be the best spot for an "About Us" page. However, we seem to do things a little bit differently, and felt it was now finally a good time to introduce ourselves. Not really so much about &lt;a href="http://blog.datajelly.com/company.html" mce_href="http://blog.datajelly.com/company.html"&gt;our company&lt;/a&gt;, but more about our blog and our employees.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The Data Jelly Blog began as a single employee's own personal blog under a different name. The original idea was to publish various tips and tricks that were learned throughout the course of building and launching our software. The topics were generally technical in nature, ranging from hosting topics such as Tomcat, Apache, and MySQL, to programming topics such as Java, JSP, and automated testing. Any time he would get stuck on an issue, he would be sure to publish a
post describing the solution to help others who might run into the same
problem.&lt;/p&gt;&lt;p&gt;We felt this was a great idea, and wanted to turn it into a company-sponsored blog. We worked to shift the blog onto the company domain name, and just recently moved it off of Blogger and onto our own web site. Now, any employees are free to add their own writeup to our blog. Choosing to publish a corporate blog is always a risky decision, as it could expose some internal secrets or even mistakes we've made. However, we felt it was important to do this for a couple reasons. First, we've learned plenty from the online community, and felt it was only fair that we try to share some of our knowledge in return. Additionally, we felt it was a good way to share information about the tools, technologies, and methodologies that we use with our clients. Lastly, it is a great way to get feedback about our approach and learn about best practices, to help us in our quest to constantly improve our service.&lt;/p&gt;&lt;p&gt;Since this shift, we have expanded the role of the blog a bit. Rather than writing purely about technical problems and their solutions, we have begun posting some tutorials even for issues that are relatively straightforward. To be honest, the intent of some of these articles was so that we could remember how we setup our environment, as we often need to grow and reprovision systems. However, as we've seen with our earlier posts, we would expect that these tutorials will also prove useful for others. &lt;/p&gt;&lt;p&gt;Over time, we've found a couple issues in particular have gained a bit of popularity, which shows that we're not alone in dealing with these technical hurdles that seem to come up rather often. We appreciate all the comments that our readers have left, and have found many of them to be especially helpful. We do feel it is worth pointing out that, while we try our best, we may not be able to help out with all questions that are left on our blog. Regardless, we encourage all of our readers to keep leaving comments, and hope that we can build a community around our blog. &lt;/p&gt;&lt;p&gt;Moving forward, we are hoping to expand the blog even further into new topics. Now that we have successfully opened the blog to all employees, we'd like to begin blogging about a wide variety of topics, all centered around the theme of starting a web company. Of course, everything will still be technical in nature, but we also hope to show a bit of our company culture, things we learn about business, and most importantly hope to invite feedback about how we can improve our software and our company. &lt;/p&gt;&lt;p&gt;We hope you find our blog helpful, and now that you know a little bit about us we'd love to hear from you... feel free to reach us as blog@datajelly.com or leave a note in the comments! &lt;br /&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=x9HnNpuS4jE:kpy0j39Nbxo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=x9HnNpuS4jE:kpy0j39Nbxo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=x9HnNpuS4jE:kpy0j39Nbxo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=x9HnNpuS4jE:kpy0j39Nbxo:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=x9HnNpuS4jE:kpy0j39Nbxo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=x9HnNpuS4jE:kpy0j39Nbxo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=x9HnNpuS4jE:kpy0j39Nbxo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=x9HnNpuS4jE:kpy0j39Nbxo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=x9HnNpuS4jE:kpy0j39Nbxo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=x9HnNpuS4jE:kpy0j39Nbxo:dcbBl_P6u8E"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=dcbBl_P6u8E" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
			<author>webmaster@datajelly.com (Data Jelly)</author>
			<category>The Data Jelly Blog</category>
			<pubDate>Sun, 21 Sep 2008 07:35:46 +0000</pubDate>
		</item>
		<item>
			<title>We've Moved</title>
			<link>http://blog.datajelly.com/company/blog/60-weve-moved.html</link>
			<guid>http://blog.datajelly.com/company/blog/60-weve-moved.html</guid>
			<description>&lt;p&gt;Hopefully you've already noticed, but we've moved our blog onto the same platform as our web site. This should make it a little bit easier for us to maintain and have more control over the layout. We hope you enjoy the upgrade!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;We've done our best to copy all the original posts and comments from our Blogger account. You may notice some of the dates aren't quite right and there are a few more fixes we need still to make. If you notice any issues, don't hesitate to let us know. While we're at it, we'd like to thank everybody who has left comments and contributed to the knowledge we try to share on this blog. &lt;br /&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Wx8QCxuW2y4:TP_JOi7Wsq0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Wx8QCxuW2y4:TP_JOi7Wsq0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=Wx8QCxuW2y4:TP_JOi7Wsq0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Wx8QCxuW2y4:TP_JOi7Wsq0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Wx8QCxuW2y4:TP_JOi7Wsq0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=Wx8QCxuW2y4:TP_JOi7Wsq0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Wx8QCxuW2y4:TP_JOi7Wsq0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Wx8QCxuW2y4:TP_JOi7Wsq0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=Wx8QCxuW2y4:TP_JOi7Wsq0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Wx8QCxuW2y4:TP_JOi7Wsq0:dcbBl_P6u8E"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=dcbBl_P6u8E" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
			<author>webmaster@datajelly.com (Data Jelly)</author>
			<category>The Data Jelly Blog</category>
			<pubDate>Fri, 19 Sep 2008 21:53:44 +0000</pubDate>
		</item>
		<item>
			<title>Installing MySQL on Ubuntu</title>
			<link>http://blog.datajelly.com/company/blog/59-installing-mysql-on-ubuntu.html</link>
			<guid>http://blog.datajelly.com/company/blog/59-installing-mysql-on-ubuntu.html</guid>
			<description>&lt;p&gt;As we ramp up to begin using &lt;a href="http://aws.amazon.com/"&gt;Amazon Web Services&lt;/a&gt; as our host, we find ourselves having to re-install and re-configure alot of software. One of the most important pieces of any web application is your database server, so today's tutorial will be a quick walkthrough of how to install &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; on &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;Step 1 - Install MySQL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Installing MySQL is relatively simple using apt-get. During the installation, you will be prompted to enter a password for the root login. Note that MySQL will automatically configure itself to boot on startup, which is probably a good thing.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;apt-get install mysql-server&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;Step 2 - Create Your Schema&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are a couple ways to create a new schema, sometimes also known as a database. Our recommendation would be to first login to MySQL as follows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mysql -p&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You will be prompted to enter your password, after which you will be brought to a MySQL prompt. From there, create your new schema as follows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;create schema sample;&lt;br /&gt;use sample;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can then create tables, stored procedures, etc. using standard SQL. For example, to create a new table you could use the following commands:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;create table tbl (col1 int, col2 varchar(30));&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;Step 3 - Create Your User&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you are still logged into the MySQL prompt, you can create a new user that has access to the sample schema. It is generally good practice to create a user for each schema on your server, or in general dividing access among several user accounts. This ensures that if somebody hijacks an account (for example, through a SQL injection attack to one of your web sites), you limit the damage they can do and ensure they cannot access a different schema. For each user, you should only grant the permissions necessary for their role, but in our case we will grant full access to the sample schema for the sake of example:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;create user 'me'@'localhost' identified by 'pass1234';&lt;br /&gt;grant all on sample.* to 'me'@'localhost';&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can then login as this user to access the sample schema. First, leave the MySQL prompt by typing &lt;span style="font-style: italic"&gt;exit&lt;/span&gt;. Next, re-enter MySQL with the following command:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mysql -D sample -u me -p&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You will be prompted for your password, after which you can use the sample database (create tables, add data, and run queries using SQL).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;That's really all there is to it. From here, you would most likely want to install your web or application server and get it linked up to your brand new MySQL database. Best of luck!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=AG973-mnmDY:HvV_EVr4oAw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=AG973-mnmDY:HvV_EVr4oAw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=AG973-mnmDY:HvV_EVr4oAw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=AG973-mnmDY:HvV_EVr4oAw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=AG973-mnmDY:HvV_EVr4oAw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=AG973-mnmDY:HvV_EVr4oAw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=AG973-mnmDY:HvV_EVr4oAw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=AG973-mnmDY:HvV_EVr4oAw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=AG973-mnmDY:HvV_EVr4oAw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=AG973-mnmDY:HvV_EVr4oAw:dcbBl_P6u8E"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=dcbBl_P6u8E" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
			<author>webmaster@datajelly.com (Data Jelly)</author>
			<category>The Data Jelly Blog</category>
			<pubDate>Wed, 10 Sep 2008 00:00:00 +0000</pubDate>
		</item>
		<item>
			<title>Using SSL in Apache for Certain Pages</title>
			<link>http://blog.datajelly.com/company/blog/58-using-ssl-in-apache-for-certain-pages.html</link>
			<guid>http://blog.datajelly.com/company/blog/58-using-ssl-in-apache-for-certain-pages.html</guid>
			<description>&lt;p&gt;A commenter in an &lt;a href="http://blog.datajelly.com/2007/12/using-apache-for-ssl-offloading-and.html" mce_href="http://blog.datajelly.com/2007/12/using-apache-for-ssl-offloading-and.html"&gt;earlier thread&lt;/a&gt;
had a terrific question that we thought would make for a good post. The
question was essentially, "How can I require the use of SSL for some
pages of my site, but not for others?"&lt;br /&gt;&lt;br /&gt;Assuming that you are using &lt;a href="http://httpd.apache.org/" mce_href="http://httpd.apache.org/"&gt;Apache's web server&lt;/a&gt;, and even possibly using it as a reverse proxy to host a J2EE server behind it (such as &lt;a href="http://tomcat.apache.org/" mce_href="http://tomcat.apache.org/"&gt;Tomcat&lt;/a&gt; or &lt;a href="http://www.jboss.org/" mce_href="http://www.jboss.org/"&gt;JBoss&lt;/a&gt;),
this is relatively easy to setup. There are probably a number of
different ways to accomplish this, but our approach has been that if
the user hits a page that requires SSL, we will do a redirect to send
them to the HTTPS version of the page.&lt;br /&gt;&lt;br /&gt;Again, in our earlier
post, we had shown the setup to enable SSL in Apache. Let's build upon
that configuration. You will need to edit your Apache config file (for
Windows it is typically conf/httpd.conf, for Ubuntu it may be under
apache2/sites-enabled/000-default). Say that you are starting with a
configuration similar to this:&lt;/p&gt;&lt;p&gt;&lt;code&gt;NameVirtualHost *:80&lt;br /&gt;NameVirtualHost *:443&lt;br /&gt;&lt;br /&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;ServerName www.domain.com&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Location /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProxyPass http://appserver:8080/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProxyPassReverse http://www.domain.com/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Location&amp;gt;&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;ServerName www.domain.com&lt;br /&gt;&amp;nbsp;&amp;nbsp;SSLEngine on&lt;br /&gt;&amp;nbsp;&amp;nbsp;SSLCipherSuite ALL:!ADH:! EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL&lt;br /&gt;&amp;nbsp;&amp;nbsp;SSLCertificateFile "C:/cert.pem"&lt;br /&gt;&amp;nbsp;&amp;nbsp;SSLCertificateKeyFile "C:/private.pem"&lt;br /&gt;&amp;nbsp;&amp;nbsp;BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Location /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProxyPass http://appserver:8080/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProxyPassReverse https://www.domain.com/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Location&amp;gt;&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;From
here, what we'd like to do is add in redirects so that if the user
connects to the wrong port, they get redirected to the correct one. For
this, the Redirect and RedirectMatch commands can come in handy.&lt;br /&gt;&lt;br /&gt;As an example, let's say that you want the directory /secure to require SSL. You might add a line like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Redirect permanent /secure https://www.domain.com/secure&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;So that your configuration would look like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;NameVirtualHost *:80&lt;br /&gt;NameVirtualHost *:443&lt;br /&gt;&lt;br /&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;ServerName www.domain.com&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Location /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Redirect permanent /secure https://www.domain.com/secure&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProxyPass http://appserver:8080/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProxyPassReverse http://www.domain.com/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Location&amp;gt;&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;ServerName www.domain.com&lt;br /&gt;&amp;nbsp;&amp;nbsp;SSLEngine on&lt;br /&gt;&amp;nbsp;&amp;nbsp;SSLCipherSuite ALL:!ADH:! EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL&lt;br /&gt;&amp;nbsp;&amp;nbsp;SSLCertificateFile "C:/cert.pem"&lt;br /&gt;&amp;nbsp;&amp;nbsp;SSLCertificateKeyFile "C:/private.pem"&lt;br /&gt;&amp;nbsp;&amp;nbsp;BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Location /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProxyPass http://appserver:8080/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProxyPassReverse https://www.domain.com/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Location&amp;gt;&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Again,
we added this line to say that if the user connects to port 80, and is
requesting anything under the /secure directory, to redirect them to
the HTTPS version.&lt;br /&gt;&lt;br /&gt;You can also use the RedirectMatch directive
to use regular expressions to control which directories should require
SSL. As an example, say that you wanted any directory that starts with
a number to require SSL:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;RedirectMatch permanent ^/(\d.*)$ https://www.domain.com/$1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;If
inclined, you can also update your configuration so that if the user
hits the HTTPS version of their site for pages that don't require SSL,
you can send them back to the plain HTTP version. We'll leave this as
an exercise for the reader, but feel free to leave comments if you need
some help.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=2Vq0J8D0Zl4:g91SXVww6yY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=2Vq0J8D0Zl4:g91SXVww6yY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=2Vq0J8D0Zl4:g91SXVww6yY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=2Vq0J8D0Zl4:g91SXVww6yY:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=2Vq0J8D0Zl4:g91SXVww6yY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=2Vq0J8D0Zl4:g91SXVww6yY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=2Vq0J8D0Zl4:g91SXVww6yY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=2Vq0J8D0Zl4:g91SXVww6yY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=2Vq0J8D0Zl4:g91SXVww6yY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=2Vq0J8D0Zl4:g91SXVww6yY:dcbBl_P6u8E"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=dcbBl_P6u8E" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
			<author>webmaster@datajelly.com (Data Jelly)</author>
			<category>The Data Jelly Blog</category>
			<pubDate>Fri, 05 Sep 2008 00:00:00 +0000</pubDate>
		</item>
		<item>
			<title>5 Things to Love (or Hate) About Google Chrome</title>
			<link>http://blog.datajelly.com/company/blog/57-5-things-to-love-or-hate-about-google-chrome.html</link>
			<guid>http://blog.datajelly.com/company/blog/57-5-things-to-love-or-hate-about-google-chrome.html</guid>
			<description>There's been alot of buzz about &lt;a href="http://googleblog.blogspot.com/2008/09/google-chrome-now-live.html"&gt;Google's new Chrome browser&lt;/a&gt;. We've downloaded it primarily so that we could do some testing to ensure &lt;a href="http://blog.datajelly.com//"&gt;our site&lt;/a&gt; works well with it, but we've ended up mostly playing around with all the new features. At first impression, there are a handful of things that we both love and dislike about Google's newest browser.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;5 Things to Love&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold"&gt;New Tab Thumbnails&lt;/span&gt; Granted, this idea was taken from Opera, but it is a terrific and easy way to get started visiting your favorite sites.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold"&gt;Tabs on Top&lt;/span&gt; We feel it is much more intuitive to include the address bar within the tab you are currently viewing. Tabs have always been meant to hold or contain content, so it is strange when things outside the tabs change when you switch.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold"&gt;Application Shortcuts&lt;/span&gt; It still needs a little work, but we love the concept of viewing a web site as if it were an application. Google obviously did this for their own apps, but it also suits us well as our site is essentially a web app as well.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold"&gt;Built-In Javascript Tools&lt;/span&gt; Again, nothing new, but we're happy to see that Google plans on supporting web developers with tools in their browser.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold"&gt;History/Downloads&lt;/span&gt; Not sure why, but we love the fact that your history and downloads are displayed as just another tab in the browser. No annoying popups or hover-overs to get in your way.&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;5 Things to Hate&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold"&gt;No Home Button&lt;/span&gt; Maybe we're missing something, but would love to be able to easily get back to the thumbnail dashboard navigation without having to open a new tab or restart the browser.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold"&gt;Non-Native Window&lt;/span&gt; We've always liked having a consistent GUI for our windows, and don't like that Google went with a non-native window GUI for their browser. We suppose they needed to do it due to the way the tabs are laid out.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold"&gt;CPU Bugs&lt;/span&gt; Our CPU sits at 50% utilization just because we have the Javascript console open.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold"&gt;Phishing&lt;/span&gt; Although we say we love the application view for web sites, we also worry about the implications it may have in terms of phishing. Seems relatively easy to trick somebody to sending off their sensitive data if you can't clearly see the URL.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold"&gt;Plugins&lt;/span&gt; Google says they tried to take the best parts of all the browsers when making their own, but they missed out on how awesome Firefox's plugin architecture is. Or perhaps they will soon be available?&lt;/li&gt;&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=_SjZBwwbvp4:DcwBcuKfFL0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=_SjZBwwbvp4:DcwBcuKfFL0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=_SjZBwwbvp4:DcwBcuKfFL0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=_SjZBwwbvp4:DcwBcuKfFL0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=_SjZBwwbvp4:DcwBcuKfFL0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=_SjZBwwbvp4:DcwBcuKfFL0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=_SjZBwwbvp4:DcwBcuKfFL0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=_SjZBwwbvp4:DcwBcuKfFL0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=_SjZBwwbvp4:DcwBcuKfFL0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=_SjZBwwbvp4:DcwBcuKfFL0:dcbBl_P6u8E"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=dcbBl_P6u8E" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
			<author>webmaster@datajelly.com (Data Jelly)</author>
			<category>The Data Jelly Blog</category>
			<pubDate>Thu, 04 Sep 2008 00:00:00 +0000</pubDate>
		</item>
		<item>
			<title>Setting the sender address in Ubuntu</title>
			<link>http://blog.datajelly.com/company/blog/56-setting-the-sender-address-in-ubuntu.html</link>
			<guid>http://blog.datajelly.com/company/blog/56-setting-the-sender-address-in-ubuntu.html</guid>
			<description>&lt;p&gt;Sometimes, you may want to be able to send an e-mail from a shell
script or manually from the command line. For example, you may want to
periodically send out a server health e-mail. We found that when doing
this, it is a little tough to control how the sender's e-mail address
will appear. The first problem we ran into was that our domain was
appearing as something like user@localhost.local. The second problem is
that we didn't want to expose the user's name, which could be &lt;span style="font-style: italic;"&gt;root&lt;/span&gt; or &lt;span style="font-style: italic;"&gt;www&lt;/span&gt;. We were looking for a way to have the sender's address appear as noreply@domain.com (or something along those lines).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 1 - Install Postfix &amp;amp; Mailutils&lt;/span&gt;&lt;br /&gt;In our environment, we had already installed &lt;a href="http://www.postfix.org/" mce_href="http://www.postfix.org/"&gt;Postfix&lt;/a&gt; to send outgoing mail. This can be done as follows:&lt;/p&gt;&lt;p&gt;&lt;code&gt;sudo ant-get install postfix&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;You
may need to step through some configurations to get it up and running.
Once installed, you then need to install additional mail tools to be
able to send email from the command line:&lt;/p&gt;&lt;p&gt;&lt;code&gt;sudo apt-get install mailutils&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 2 - The Easy Solution&lt;/span&gt;&lt;br /&gt;Once installed, you can send e-mails from the command line like so:&lt;/p&gt;&lt;p&gt;&lt;code&gt;echo Email body | mail -s "subject line" -a From:noreply@domain.com recipient@example.com&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;This will send an e-mail to recipient@example.com, and will use the address of noreply@domain.com.&lt;br /&gt;&lt;br /&gt;We
say this is the "easy solution" because, although it works, the
recipient would still be able to look at the mail message headers and
see the address of user@localhost.local. This simply sets the "From"
header of the email, but the sender envelope still contains the
original user's address.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 3 - Sender Aliases&lt;/span&gt;&lt;br /&gt;We
took this a step further to try to fully control the sender's e-mail
address. There were two configurations we made; one to control the
sender's domain, the other to apply an alias to our user name.&lt;br /&gt;&lt;br /&gt;First, edit your Postfix configuration file as follows:&lt;/p&gt;&lt;p&gt;&lt;code&gt;sudo nano /etc/postfix/main.cf&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;You must either change or add the following lines, using the domain you would like to show in the sender's address:&lt;/p&gt;&lt;p&gt;&lt;code&gt;myhostname = domain.com&lt;br /&gt;smtp_generic_maps = hash:/etc/postfix/generic&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Next,
you need to configure the alias file. This file maps users to the
proper external name to use. You can also have a catch-all alias.&lt;/p&gt;&lt;p&gt;&lt;code&gt;sudo nano /etc/postfix/generic&lt;br /&gt;&lt;br /&gt;user1@domain.com noreply@domain.com&lt;br /&gt;user2@domain.com noreply@domain.com&lt;br /&gt;@domain.com noreply@domain.com&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;After this file is created, you'll need to use postmap to install it, then reboot Postfix:&lt;/p&gt;&lt;p&gt;&lt;code&gt;sudo postmap /etc/postfix/generic&lt;br /&gt;sudo /etc/init.d/postfix restart&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;After
this is all done, you can send an email without needing to specify the
From header, and it will still show as our noreply address:&lt;/p&gt;&lt;p&gt;&lt;code&gt;echo Email body | mail -s "subject line" recipient@example.com&lt;/code&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=3dBjGr-PgtY:rY21Lo9GLjE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=3dBjGr-PgtY:rY21Lo9GLjE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=3dBjGr-PgtY:rY21Lo9GLjE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=3dBjGr-PgtY:rY21Lo9GLjE:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=3dBjGr-PgtY:rY21Lo9GLjE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=3dBjGr-PgtY:rY21Lo9GLjE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=3dBjGr-PgtY:rY21Lo9GLjE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=3dBjGr-PgtY:rY21Lo9GLjE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=3dBjGr-PgtY:rY21Lo9GLjE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=3dBjGr-PgtY:rY21Lo9GLjE:dcbBl_P6u8E"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=dcbBl_P6u8E" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
			<author>webmaster@datajelly.com (Data Jelly)</author>
			<category>The Data Jelly Blog</category>
			<pubDate>Sat, 30 Aug 2008 00:00:00 +0000</pubDate>
		</item>
		<item>
			<title>Running Multiple Instance of Tomcat in Ubuntu</title>
			<link>http://blog.datajelly.com/company/blog/55-running-multiple-instance-of-tomcat-in-ubuntu.html</link>
			<guid>http://blog.datajelly.com/company/blog/55-running-multiple-instance-of-tomcat-in-ubuntu.html</guid>
			<description>&lt;p&gt;As we hinted at in &lt;a href="http://blog.datajelly.com/2008/08/installing-apache-tomcat-6-on-ubuntu.html"&gt;our last post&lt;/a&gt;, it is possible to run multiple instances of &lt;a href="http://tomcat.apache.org/"&gt;Apache Tomcat&lt;/a&gt; in &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;,
without having to install it twice. Multiple Tomcat servers can be
helpful for several reasons. Although we do all our QA testing on a
local staging network, we still like to host a beta server next to our
live server to help us verify proper functionality in our production
environment.&lt;br /&gt;&lt;br /&gt;Before diving into how we run two Tomcat servers,
let's first look at the directory structure of the Tomcat installation.
Assuming that you already have a single Tomcat server up and running
within /usr/local/tomcat/, you might see the following sub-directories:&lt;/p&gt;&lt;p&gt;&lt;code&gt;bin/&lt;br /&gt;conf/&lt;br /&gt;lib/&lt;br /&gt;logs/&lt;br /&gt;temp/&lt;br /&gt;webapps/&lt;br /&gt;work/&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;To
run two Tomcat instances, we only need to copy the sub-directories that
contain information specific to each instance (such as configurations),
but the binaries can stay in this home location and be shared.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 1 - Create the Directories&lt;/span&gt;&lt;br /&gt;To begin, create two directories that will hold the information for each server:&lt;/p&gt;&lt;p&gt;&lt;code&gt;mkdir /path/to/server1 /path/to/server2&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Next, make a copy of the necessary sub-directories into these locations:&lt;/p&gt;&lt;p&gt;&lt;code&gt;cp -rd /usr/local/tomcat/conf /usr/local/tomcat/webapps /path/to/server1&lt;br /&gt;cp -rd /usr/local/tomcat/conf /usr/local/tomcat/webapps /path/to/server2&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Let's also create empty directories for things like log files and temp space:&lt;/p&gt;&lt;p&gt;&lt;code&gt;mkdir /path/to/server1/logs /path/to/server1/temp /path/to/server1/work&lt;br /&gt;mkdir /path/to/server2/logs /path/to/server2/temp /path/to/server2/work&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 2 - Configure Each Instance&lt;/span&gt;&lt;br /&gt;Each
instance will need to use its own set of ports, to ensure there are no
conflicts. In Tomcat, the ports are controlled within the server.xml
file. We'll leave server1 alone, but we'll change server2's to use
different ports.&lt;/p&gt;&lt;p&gt;&lt;code&gt;nano /path/to/server2/conf/server.xml&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;First, look for the line that says something like:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;Server port="8005" shutdown="..."&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Change
the port to 8006, or any other of your choosing. Next, look for any
other lines that contain ports. There should be at least one other, but
may be more:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;Connector port="8080" protocol="HTTP/1.1" ... /&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Change
this port to listen on 8081, or any other of your choosing. Note that
this is the port that web browsers will connect to. Or, in our case, &lt;a href="http://blog.datajelly.com/2008/08/using-apache-front-end-with-tomcat-for.html"&gt;our reverse proxy will connect to&lt;/a&gt; so that our users don't need to type in crazy ports in their URL.&lt;br /&gt;&lt;br /&gt;Of
course, you'll need to deploy your J2EE application to each server.
Deploying is beyond the scope of this article. However, if you already
had your app up and running and you've followed the steps so far, you
should be able to boot up the same app twice for the purposes of
learning.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 3 - Configure Your Bootup Scripts&lt;/span&gt;&lt;br /&gt;Now
the only part left is to boot up each instance. This is done by
specifying an environment variable called CATALINA_BASE, which points
to the new directories we've created. A sample bootup script might look
like this (read our &lt;a href="http://blog.datajelly.com/2008/08/installing-apache-tomcat-6-on-ubuntu.html"&gt;previous tutorial&lt;/a&gt; for installing this as a bootup script):&lt;/p&gt;&lt;p&gt;&lt;code&gt;export JAVA_HOME=/usr/lib/jvm/java-6-sun&lt;br /&gt;export CATALINA_BASE=/path/to/server1&lt;br /&gt;export CATALINA_OPTS="-server -Xmx512m"&lt;br /&gt;case $1 in&lt;br /&gt;start)&lt;br /&gt;sh /usr/local/tomcat/bin/startup.sh&lt;br /&gt;;;&lt;br /&gt;stop)&lt;br /&gt;sh /usr/local/tomcat/bin/shutdown.sh&lt;br /&gt;;;&lt;br /&gt;restart)&lt;br /&gt;sh /usr/local/tomcat/bin/shutdown.sh&lt;br /&gt;sh /usr/local/tomcat/bin/startup.sh&lt;br /&gt;;;&lt;br /&gt;esac&lt;br /&gt;exit 0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;For the other server, you'll need to use the same script again, but this time use /path/to/server2 as your CATALINA_BASE.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;That
should be all you need to boot two Tomcats. You can use the same
technique to run even more instances if necessary. As new fixes or
upgrades are made to Tomcat, you only need to update one set of
binaries in the original location, and it will take effect for all
instances you have running.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=JTsNitq6jmw:79Wnhnd06og:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=JTsNitq6jmw:79Wnhnd06og:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=JTsNitq6jmw:79Wnhnd06og:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=JTsNitq6jmw:79Wnhnd06og:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=JTsNitq6jmw:79Wnhnd06og:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=JTsNitq6jmw:79Wnhnd06og:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=JTsNitq6jmw:79Wnhnd06og:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=JTsNitq6jmw:79Wnhnd06og:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=JTsNitq6jmw:79Wnhnd06og:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=JTsNitq6jmw:79Wnhnd06og:dcbBl_P6u8E"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=dcbBl_P6u8E" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
			<author>webmaster@datajelly.com (Data Jelly)</author>
			<category>The Data Jelly Blog</category>
			<pubDate>Mon, 25 Aug 2008 00:00:00 +0000</pubDate>
		</item>
		<item>
			<title>Installing Apache Tomcat 6 on Ubuntu</title>
			<link>http://blog.datajelly.com/company/blog/54-installing-apache-tomcat-6-on-ubuntu.html</link>
			<guid>http://blog.datajelly.com/company/blog/54-installing-apache-tomcat-6-on-ubuntu.html</guid>
			<description>&lt;p&gt;I recently had to re-install &lt;a href="http://tomcat.apache.org/"&gt;Apache Tomcat&lt;/a&gt; on our Ubuntu box, when I realized that version 6 was not available in &lt;a href="https://help.ubuntu.com/8.04/serverguide/C/aptitude.html"&gt;aptitude&lt;/a&gt;. As such, I had to manually install it from a download, and figured I'd share these steps with everybody.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 1 - Make Sure Java is Installed&lt;/span&gt;&lt;br /&gt;Getting Java installed is relatively pain-free. Just run this command:&lt;/p&gt;&lt;p&gt;&lt;code&gt;sudo apt-get install sun-java6-jdk&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 2 - Download the Latest Tomcat&lt;/span&gt;&lt;br /&gt;Check Tomcat's web site and download the &lt;span style="font-style: italic;"&gt;Core &lt;/span&gt;binaries
for the latest version of Tomcat (.tar.gz file). Extract this .tar.giz
file to a directory of your choosing, such as /usr/local. For example:&lt;/p&gt;&lt;p&gt;&lt;code&gt;wget http://apache.mirrors.redwire.net/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.tar.gz&lt;br /&gt;tar xvzf apache-tomcat-6.0.18.tar.gz&lt;br /&gt;sudo mv apache-tomcat-6.0.18 /usr/local/tomcat&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 3 - Setup Tomcat to Boot on Startup&lt;/span&gt;&lt;br /&gt;First,
create the script that will start and stop Tomcat. In this script, you
need to add the JAVA_HOME environment variable which is required by
Tomcat. Optionally, you can also set the CATALINA_BASE variable which
allows you to &lt;a href="http://blog.datajelly.com/2008/08/running-multiple-instance-of-tomcat-in.html"&gt;run multiple Tomcat servers&lt;/a&gt; and the CATALINA_OPTS variable which will pass in extra Java Virtual Machine arguments.&lt;/p&gt;&lt;p&gt;&lt;code&gt;sudo nano /etc/init.d/tomcat&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Copy and paste this script, making sure to either configure or remove CATALINA_BASE and CATALINA_OPTS:&lt;/p&gt;&lt;p&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;export JAVA_HOME=/usr/lib/jvm/java-6-sun&lt;br /&gt;export CATALINA_BASE=/path/to/catalina/base&lt;br /&gt;export CATALINA_OPTS="-server -Xmx512m"&lt;br /&gt;case $1 in&lt;br /&gt;start)&lt;br /&gt;        sh /usr/local/tomcat/bin/startup.sh&lt;br /&gt;        ;;&lt;br /&gt;stop)&lt;br /&gt;        sh /usr/local/tomcat/bin/shutdown.sh&lt;br /&gt;        ;;&lt;br /&gt;restart)&lt;br /&gt;        sh /usr/local/tomcat/bin/shutdown.sh&lt;br /&gt;        sh /usr/local/tomcat/bin/startup.sh&lt;br /&gt;        ;;&lt;br /&gt;esac&lt;br /&gt;exit 0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Press Ctrl+X to exit, and answer &lt;span style="font-style: italic;"&gt;Yes&lt;/span&gt; to save. Next, make the script executable, and install it as a startup script:&lt;/p&gt;&lt;p&gt;&lt;code&gt;sudo chmod 755 /etc/init.d/tomcat&lt;br /&gt;sudo update-rc.d tomcat defaults&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 4 - Startup Tomcat and Test&lt;/span&gt;&lt;br /&gt;Tomcat
should now be properly installed and ready to go. You'll need to
configure Tomcat's server.xml according to your needs, and deploy your
webapp. After you've done that, you can start Tomcat by calling:&lt;/p&gt;&lt;p&gt;&lt;code&gt;sudo /etc/init.d/tomcat start&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Tomcat should boot up and you should be able to access your Java app via your web browser.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Gv27lV2KUMA:NcQTN5a7VQE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Gv27lV2KUMA:NcQTN5a7VQE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=Gv27lV2KUMA:NcQTN5a7VQE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Gv27lV2KUMA:NcQTN5a7VQE:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Gv27lV2KUMA:NcQTN5a7VQE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=Gv27lV2KUMA:NcQTN5a7VQE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Gv27lV2KUMA:NcQTN5a7VQE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Gv27lV2KUMA:NcQTN5a7VQE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=Gv27lV2KUMA:NcQTN5a7VQE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=Gv27lV2KUMA:NcQTN5a7VQE:dcbBl_P6u8E"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=dcbBl_P6u8E" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
			<author>webmaster@datajelly.com (Data Jelly)</author>
			<category>The Data Jelly Blog</category>
			<pubDate>Sun, 24 Aug 2008 00:00:00 +0000</pubDate>
		</item>
		<item>
			<title>Using Apache Front-End with Tomcat for JSP</title>
			<link>http://blog.datajelly.com/company/blog/53-using-apache-front-end-with-tomcat-for-jsp.html</link>
			<guid>http://blog.datajelly.com/company/blog/53-using-apache-front-end-with-tomcat-for-jsp.html</guid>
			<description>&lt;p&gt;In a &lt;a href="http://blog.datajelly.com/2007/12/using-apache-for-ssl-offloading-and.html" mce_href="http://blog.datajelly.com/2007/12/using-apache-for-ssl-offloading-and.html"&gt;previous post&lt;/a&gt;,
we discussed how it's possible to use Apache as a reverse proxy to
offload SSL and GZip compression from a Tomcat (or similar) J2EE
server. Originally, we had set this up on Windows, but we have since
moved it over to Ubuntu with no problems.&lt;br /&gt;&lt;br /&gt;Another useful setup
is to use Apache to serve up your static resources (such as images,
javascript files, and CSS sheets), while only sending JSP or servlet
requests over to Tomcat. This can be useful because Apache is generally
much faster at serving up static content, not to mention that you
remove any extra overhead of proxying these requests. Even better, you
can continue to use Apache to handle SSL and compression.&lt;br /&gt;&lt;br /&gt;This
tutorial assumes that you've been able to get Apache and Tomcat up and
running independently, and we'll walk through how to connect them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;First Attempt: Proxying All Traffic&lt;/span&gt;&lt;br /&gt;Remember
from our previous post, you simply need to use the Location tag in your
Apache config file to proxy requests over to Tomcat. (For us, this
configuration file is located at &lt;span style="font-style: italic;"&gt;/path/to/apache2/sites-enabled/000-default&lt;/span&gt;, but this could vary based on your setup.)&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;VirtualHost&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;Location /&amp;gt;&lt;br /&gt;ProxyPass http://appserver:8080/&lt;br /&gt;ProxyPassReverse http://www.domain.com/&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Real Attempt: Proxying JSP/Servlet Traffic&lt;/span&gt;&lt;br /&gt;All
we need to do is slightly modify this configuration so that it will
only proxy JSP or servlet traffic, rather than all traffic:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;VirtualHost&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;Location /path/to/servlet&amp;gt;&lt;br /&gt;ProxyPass http://appserver:8080/path/to/servlet&lt;br /&gt;ProxyPassReverse http://www.domain.com/path/to/servlet&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If
your JSP files aren't all in the same directory, you could also use the
LocationMatch tag to match files ending with .jsp. Keep in mind that
LocationMatch uses a regular expression, which might look something
like this:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;LocationMatch .+\.jsp$&amp;gt;&lt;br /&gt;ProxyPass http://appserver:8080/&lt;br /&gt;ProxyPassReverse http://www.domain.com/&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;Assuming
the remainder of your Apache was already correctly setup, that should
be all there is to it. Apache will serve up most files itself, but will
use Tomcat where the Location or LocationMatch tags are matched.&lt;br /&gt;&lt;br /&gt;A
special note: This tutorial was proxying to Tomcat using HTTP, but you
could also use the AJP connector. AJP is a binary protocol which should
reduce the amount of data that needs to be transferred between Apache
and Tomcat. To do this, make sure that mod_proxy.so and
mod_proxy_ajp.so are loaded, then simply tweak the ProxyPass directive:&lt;/p&gt;&lt;p&gt;&lt;code&gt;ProxyPass ajp://appserver:8080/&lt;/code&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=78VD36zubU4:jm-MGDC4btA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=78VD36zubU4:jm-MGDC4btA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=78VD36zubU4:jm-MGDC4btA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=78VD36zubU4:jm-MGDC4btA:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=78VD36zubU4:jm-MGDC4btA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=78VD36zubU4:jm-MGDC4btA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=78VD36zubU4:jm-MGDC4btA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=78VD36zubU4:jm-MGDC4btA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?i=78VD36zubU4:jm-MGDC4btA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/datajelly?a=78VD36zubU4:jm-MGDC4btA:dcbBl_P6u8E"&gt;&lt;img src="http://feeds.feedburner.com/~ff/datajelly?d=dcbBl_P6u8E" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
			<author>webmaster@datajelly.com (Data Jelly)</author>
			<category>The Data Jelly Blog</category>
			<pubDate>Tue, 12 Aug 2008 00:00:00 +0000</pubDate>
		</item>
	</channel>
</rss>
