Railo on Tomcat on Windows x64 - Part III

Now that we've got Tomcat, Railo and Apache httpd up and running, lets connect Tomcat and Apache.

For this we will need a mod_jk connector. The binary can be found here.

There is no x64 connector as there is no x64 official release of Apache httpd, so we will be using the x32 connector. In my case I downloaded mod_jk-1.2.28-httpd-2.2.3.so from the win32 folder. Download this file and put it in C:\Apache2\modules. Now rename it to mod_jk.so

Create a file in c:\Apache2\conf\extra called workers.properties and put this into the file

view plain print about
1# Define 1 real worker using ajp13
2 worker.list=worker1
3 # Set properties for worker1 (ajp13)
4 worker.worker1.type=ajp13
5 worker.worker1.host=localhost
6 worker.worker1.port=8009

Now lets download Railo and lets set it up. We want to get the custom one, the jars, in my case "railo-3.1.2.001-jars.zip (34 MB)". Create a Railo folder in the Tomcat folder, in my case "C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0".

Now open up the railo zip file and put the jar files from the railo-3.1.2.001-jars into the railo folder we just created.

Now edit the catalina.properties file that was in Tomcat conf folder, in my case "C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0\conf". Find the line that says "common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar" and edit it to say "common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.home}/railo/*.jar"

Now open tomcat-users.xml and change the encoding to utf-8. At the top where it says "<?xml version='1.0' encoding='cp1252'?>" and change it to "<?xml version='1.0' encoding='utf-8'?>" This is needed due to some weird Tomcat bug on windows.

Now lets open web.xml in the Tomcat's conf directory. Just before the "Built In Servlet Mappings" add the following:

view plain print about
1<servlet>
2 <servlet-name>RailoCFMLServlet</servlet-name>
3 <description>CFML runtime Engine</description>
4 <servlet-class>railo.loader.servlet.CFMLServlet</servlet-class>
5 <init-param>
6<param-name>configuration</param-name>
7<param-value>/WEB-INF/railo</param-value>
8<description>Configuration directory</description>
9</init-param>
10 <!-- init-param>
11<param-name>railo-server-root</param-name>
12<param-value>.</param-value>
13<description>directory where railo root directory is stored</description>
14</init-param -->

15 <load-on-startup>1</load-on-startup>
16</servlet>
17<servlet>
18 <servlet-name>RailoAMFServlet</servlet-name>
19 <description>AMF Servlet for flash remoting</description>
20 <servlet-class>railo.loader.servlet.AMFServlet</servlet-class>
21 <load-on-startup>1</load-on-startup>
22</servlet>
23<servlet>
24 <servlet-name>RailoFileServlet</servlet-name>
25 <description>File Servlet for simple files</description>
26 <servlet-class>railo.loader.servlet.FileServlet</servlet-class>
27 <load-on-startup>2</load-on-startup>
28</servlet>

Now at the end of the servlet mapping section, add the following

view plain print about
1<servlet-mapping>
2 <servlet-name>RailoCFMLServlet</servlet-name>
3 <url-pattern>*.cfm</url-pattern>
4</servlet-mapping>
5<servlet-mapping>
6 <servlet-name>RailoCFMLServlet</servlet-name>
7 <url-pattern>*.cfml</url-pattern>
8</servlet-mapping>
9<servlet-mapping>
10 <servlet-name>RailoCFMLServlet</servlet-name>
11 <url-pattern>*.cfc</url-pattern>
12</servlet-mapping>
13<servlet-mapping>
14 <servlet-name>RailoAMFServlet</servlet-name>
15 <url-pattern>/flashservices/gateway/*</url-pattern>
16</servlet-mapping>
17<servlet-mapping>
18 <!-- could be RailoFileServlet -->
19 <servlet-name>default</servlet-name>
20 <url-pattern>/</url-pattern>
21</servlet-mapping>

Now open up server.xml and at the end of the file inside the Engine tag, we'll add a new host definition.

view plain print about
1<Host name="railotest" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
2 <Context path="" docBase="c:/websites/railotest" />
3</Host>

Now lets go back to our httpd-vhosts.conf Apache file. We need to add the following (I do this outside of any virtualhost definitions.

view plain print about
1# Load mod_jk module
2LoadModule jk_module modules/mod_jk.so
3# Where to find workers.properties
4JkWorkersFile conf/extra/workers.properties
5# Where to put jk shared memory
6JkShmFile logs/mod_jk.shm
7# Where to put jk logs
8JkLogFile logs/mod_jk.log
9# Set the jk log level [debug/error/info]
10JkLogLevel info
11# Select the timestamp log format
12JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

We also need to add the following to the VirtualHost definition

view plain print about
1# Send requests for cfm files to worker named worker1
2    JkMount /*.cfm     worker1

The full virtualhost definition should look like

view plain print about
1<VirtualHost *:80>
2    DocumentRoot "C:/websites/railotest"
3    ServerName railotest
4    ErrorLog "logs/railotest.com-error.log"
5    CustomLog "logs/railotest-access.log" common
6    # Send requests for cfm files to worker named worker1
7    JkMount /*.cfm     worker1
8</VirtualHost>

Now if we restart Tomcat and Apache we should be able to hit http://railotest in our browser and see the debugging info. We will also see a WEB-INF folder created inside c:\websites\railotest.

Now lets put in an alias for the railo-context so that we can get to the admin. Inside the virtual host add

view plain print about
1Alias /railo-context C:\websites\railotest\WEB-INF\railo\context

Now restart Apache and we should be able to get to the Web Administrator for this host by going to http://railotest/railo-context/admin.cfm

Railo on Tomcat on Windows x64 - Part II

In the previous two parts we installed Tomcat. Now lets set up Apache httpd server.

I suggest downloading Apache from Apache Lounge. The nice thing about Apache Lounge's builds is that they include mod_rewrite and mod_ssl.

The latest version at the time of this writing is 2.2.14. Download httpd-2.2.14-win32-x86-ssl.zip and open it in your favorite archiver (mine is WinRar).

I recommend taking the Apache2 folder inside the zip file and placing it on c:\. After you've done this you should have a c:\Apache2 folder with many files and subfolders in it.

Open c:\Apache2\conf\httpd.conf file in your favorite text editor. I recommend Textpad.

I usually change a few things from the defaults. Your configuration may differ.

Change

view plain print about
1ServerAdmin admin@example.com
to your email address.

Uncomment the following modules:

view plain print about
1#LoadModule proxy_module modules/mod_proxy.so
2#LoadModule proxy_http_module modules/mod_proxy_http.so
3#LoadModule rewrite_module modules/mod_rewrite.so
by removing the # sign in front of the line.

Find the line that says

view plain print about
1<Directory "c:/Apache2/htdocs">

After closing directory tag lets add one allowing access to our web root. I usually set up a folder or a new drive for it. Lets say we set up a webroot of "c:\websites". Create a folder websites on c: and then inside it create another folder called railotest. We will use this to set up our test site.

After the closing tag, add a new one allowing access to our web root.

view plain print about
1<Directory "c:/websites">
2 Options Indexes FollowSymLinks
3 AllowOverride None
4 Order allow,deny
5 Allow from all
6</Directory>

This will allow Apache to serve from anywhere inside c:\websites. Alternatively, you can set up a new directory entry for every site that you create, but I find that this makes things easier without significantly impacting security.

Find the line that says

view plain print about
1DirectoryIndex index.html

and add index.cfm to that list

view plain print about
1DirectoryIndex index.html index.cfm

Uncomment the line that says

view plain print about
1#Include conf/extra/httpd-vhosts.conf
by removing the # sign.

Now open up httpd-vhosts.conf file that is located in "C:\Apache2\conf\extra".

There are two sample virtual hosts defined. Lets comment them both out. Alternatively you can just delete them.

view plain print about
1<VirtualHost *:80>
2 ServerAdmin webmaster@dummy-host.example.com
3 DocumentRoot "c:/Apache2/docs/dummy-host.example.com"
4 ServerName dummy-host.example.com
5 ServerAlias www.dummy-host.example.com
6 ErrorLog "logs/dummy-host.example.com-error.log"
7 CustomLog "logs/dummy-host.example.com-access.log" common
8</VirtualHost>
9
10<VirtualHost *:80>
11 ServerAdmin webmaster@dummy-host2.example.com
12 DocumentRoot "c:/Apache2/docs/dummy-host2.example.com"
13 ServerName dummy-host2.example.com
14 ErrorLog "logs/dummy-host2.example.com-error.log"
15 CustomLog "logs/dummy-host2.example.com-access.log" common
16</VirtualHost>
should look like this:

view plain print about
1#<VirtualHost *:80>
2# ServerAdmin webmaster@dummy-host.example.com
3# DocumentRoot "c:/Apache2/docs/dummy-host.example.com"
4# ServerName dummy-host.example.com
5# ServerAlias www.dummy-host.example.com
6# ErrorLog "logs/dummy-host.example.com-error.log"
7# CustomLog "logs/dummy-host.example.com-access.log" common
8#</VirtualHost>
9#
10#<VirtualHost *:80>
11# ServerAdmin webmaster@dummy-host2.example.com
12# DocumentRoot "c:/Apache2/docs/dummy-host2.example.com"
13# ServerName dummy-host2.example.com
14# ErrorLog "logs/dummy-host2.example.com-error.log"
15# CustomLog "logs/dummy-host2.example.com-access.log" common
16#</VirtualHost>

Now lets add a new entry for our test server

view plain print about
1<VirtualHost *:80>
2 DocumentRoot "C:/websites/railotest"
3 ServerName railotest
4 ErrorLog "logs/railotest.com-error.log"
5 CustomLog "logs/railotest-access.log" common
6</VirtualHost>

Now save the files and lets try running apache and see if it worked. Open up command prompt (Start -> Run -> cmd.exe)

view plain print about
1Microsoft Windows [Version 5.2.3790]
2(C) Copyright 1985-2003 Microsoft Corp.
3
4C:\Documents and Settings\Administrator>
cd \apache2\bin
5
6C:\Apache2\bin>httpd
7httpd: Could not reliably determine the server's fully qualified domain name, using xxx.xxx.xxx.xxx for ServerName
We can ignore that warning since we don't care about the default configuration.

Now we will need to define a host called railotest using windows hosts file. Open up "C:\windows\system32\drivers\etc\hosts" file in your favorite text editor.

After a bunch of comments, you should see

view plain print about
1127.0.0.1 localhost

Lets add an entry for railotest

view plain print about
1127.0.0.1 railotest

Now this computer knows that railotest points to 127.0.0.1.

Lets put a test cfm file in the webroot for railotest. Create a new file called index.cfm and put it in c:\websites\railotest.

Inside the file lets put some basic cf code

view plain print about
1<cfdump var="#server#">

If you still have apache running and put in http://railotest in your browser you should see the code being output. It is not being interpreted yet because we have not hooked up Apache httpd to Railo. We will do this in Part IV.

For now lets set up apache to run as a service.

First stop the httpd that you ran earlier by entering ctrl-c and do the following.

view plain print about
1C:\Apache2\bin>httpd -k install
2Installing the Apache2.2 service
3The Apache2.2 service is successfully installed.
4Testing httpd.conf....
5Errors reported here must be corrected before the service can be started.
6httpd: Could not reliably determine the server's fully qualified domain name, using xxx.xxx.xxx.xxx for ServerName

The Apache service is now installed. I recommend also adding the "Apache Monitor" app to your startup folder.

Click Start->All Programs and right click on Startup. Now click "Explore All Users". In another explorer window open up C:\Apache2\Bin and right drag ApacheMonitor.exe to the Startup folder. Let go of the right mouse button and select "Create shortcut here".

Double click on the shortcut and the monitor App should appear in your taskbar next to the clock and next to Tomcat's icon.

Double click it to open it and click start. Now you have a working Apache installation that will start as a service.

If you enter http://railotest in your browser, you should see the code we wrote earlier. This will persist across reboots.

In the next part, we'll hook it up to Railo and be able to actually execute this code.

Railo on Tomcat on Windows x64 - Part I

I tried following Sean Corfield's excellent post on how to get Railo running on Tomcat, but ran into a few snags on my x64 windows system.

First download Tomcat 6 from the Apache Foundation. I picked the "Windows Service Installer" of the Core.

Start up the installer and hit next a few times until you get to the "Choose Components" section. Select Full install and then uncheck the Examples item as we won't be needing it.

Pick the installation folder, and the default port, and set a password for the administrator. At the next step it will ask for a path to a J2SE 5.0 JRE installation. Finding this on Sun's site is a bit of a pain, so here is a link to the J2SE 5.0 Update 22, which is the latest as of this writing.

Download it, install it and make a note of what folder it installs in. In my case it was "C:\Program Files\Java\jre1.5.0_22". This is the path I provided to Tomcat installer.

Finish the tomcat installation and you will see that the service is installed, but will not start. This is because we need the 64bit service wrapper

The only file that should be in there is tomcat6.exe. Download it and replace the one in your tomcat's installation bin folder. In my case that folder is "C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0\bin".

Now if you go to "http://localhost:8080/", you should see The Tomcat default start page.

In part II, we will cover getting setting up Apache.

Using SQL 2000's "Client Network Utility" to create aliases in Windows x64

As we all know running SQL server on a non-standard port can help improve security. What makes the matter a little difficult is that on Windows x64, SQL Server 2000's Client Network Utility doesn't work quite as it should. Any aliases that you create in there will not be picked up by enterprise manager or any other tool that uses the libraries.

In order to get around this problem, you need to use the client network utility from c:\windowsfolder\syswow64 (replace windowsfolder with the name of the folder where windows is installed, such as c:\winnt or c:\windows)

You can also update the the Program menu's shortcut to point to cliconfg.exe that's located in C:\windowsfolder\SysWOW64\

Now it will make the proper registry entries and the programs that depend on it will work.