Script to automate adding virtual hosts to OpenBD (using Apache)

As mentioned in my post from yesterday, adding virtual hosts to OpenBD is slightly awkward in that it not only requires adding them in the Apache config but also in the Tomcat’s server.xml file.

The following shell script works for a standard Centos installation where the webserver used is Apache with the following default paths used:

Apache vhosts file -> /etc/httpd/conf/vhosts
Tomcat server.xml file -> /opt/openbd/tomcat/conf/server.xml

Assuming all virtual hosts live inside the same parent directory then this directory can be set in the script’s configuration on line 5. Once set, adding a new virtual host is as simple as saving it as something meaningful (in this case ‘’) and calling it with the full domain name of the virtual host passed as a parameter like so:

$ su
# ./

One important point: this script relies on Apache’s usage of a separate vhosts file in the /etc/httpd/conf directory. This file can be pulled in and read by the main httpd.conf file by adding the following line to it.

Include /etc/httpd/conf/vhosts

What the script does?

1. creates a new document root folder for the virtual host and places an index.cfm test page inside it.
2. adds the virtual host entry to the httpd.conf file
3. adds the virtual host entry to the server.xml file
4. restarts Apache
5. restarts OpenBD

Once the script has run then if all goes well you should be able to browse to your new virtual host and check the CFML parsing by typing http://<new virtual host domain>/index.cfm

Here’s the script:

# Configure the script
email=''		# email address of administrator
vhroot='/www' 				# no trailing slash 
# Create the new document root folder
if [ "$1" = "" ]
	echo "No arguments passed. Usage: addvh <vhostName> where <vhostName> is the full domain"
	echo "(or subdomain) of the virtual host. E.g,"
# Try to create the new document root
elif ! mkdir $vhroot/$1 
	echo "ERROR: "$vhroot"/"$1" could not be created."
	echo "Virtual host document root created in "$vhroot"/"$1
	# Add the virtual host to the vhosts file
	if ! echo "
<VirtualHost *:80>
	ServerAdmin $email
    	DocumentRoot $vhroot/$1
	ServerName $1
	ErrorLog logs/$1_log
</VirtualHost>" >> /etc/httpd/conf/vhosts
		echo "ERROR: the virtual host could not be added to the Apache vhosts file"
		echo "New virtual host added to the Apache vhosts file"
		# Update the Tomcat server.xml file with the new virtual host
		rs='	<Host name="'$1'" appBase="webapps"\
		unpackWARs="true" autoDeploy="true"\
		xmlValidation="false" xmlNamespaceAware="false">\
		<Context path="" docBase="'$vhroot'/'$1'/" />\
		sed 's|</Engine>|'"$rs"'|' </opt/openbd/tomcat/conf/server.xml >tmp 	
		mv /opt/openbd/tomcat/conf/server.xml /opt/openbd/tomcat/conf/server.xml.BAK
		mv tmp /opt/openbd/tomcat/conf/server.xml
		echo 'New virtual host added to the Tomcat server.xml file'
		# restart Apache
		service httpd restart
		# restart Tomcat/OpenBD
		/etc/init.d/openbd_ctl restart
		# create a demo script for testing the CFML works in the new vhost
		echo '<cfdump var="#CGI#">' > $vhroot/$1/index.cfm
		# show the finished message
		echo "Complete! The new virtual host has been created.
To check the CFML functionality browse http://"$1"/index.cfm
Document root is "$vhroot"/"$1

Setting up OpenBD on Centos with support for virtual hosts

I needed to set up a development platform that could serve different dev projects on separate subdomains with several of them using openBD to handle .CFM templates. My chosen platform is Centos 5.5 using the Apache 2.2 web server.

I first tried doing this over a year ago and spent quite a while reading through the various documentation provided by the openBD community but never managed to get it to work. Recently my hosting company (Vivio Technologies) changed their pricing and suggested that I switch from BlueDragon Server JX to OpenBD so I decided to have another go setting up my dev platform so I can test the CFML apps I have running there with openBD before making the switch on the production server.

Since my last attempt the installation process has been made a lot easier due to the OpenBD installer packages created by Jordan Michaels.

I started by installing a fresh VM with Centos 5.5, configuring a couple of subdomains as virtual hosts and creating their respective document root folders under /www. Then, by just running the installer (openbd-1.3-pl0-linux-installer.bin) and accepting all of the default options, I was able to get openBD to successfully serve its demo pages which are contained in the Tomcat webapps/ROOT folder by browsing <CentosVM IP address>/demo/cfdump.cfm.

OpenBD demo page <cfdump>

I also got the openBD administrator by browsing <CentosVM IP address>:8888/bluedragon/administrator/index.cfm

openBD administrator

The next stage, getting virtual hosts was not quite so straightforward. There are some really good instructions on the OpenBD Wiki. The salient point here is that the server.xml file in the tomcat’s conf folder needs to have entries made for each virtual host in much the same way as the httpd.conf file does. But on my first attempt at doing this, something went wrong and I kept getting ‘Service Temporarily Unavailable’ errors from the browser when trying to browse a CFM page from a virtual host. I ended up rolling back my VM to a previous snapshot and reinstalling openBD. This time I re-added the virtual host to the server.xml file and it worked. Now, finally after over a year of trying I have a working dev server that uses OpenBD to parse CFM files and I can get on with the next steps….testing my CFML apps and then deploying them to an OpenBD production server and in the process save myself $10 a month for the BlueDragon Server JX license fee. :)

Update: I wrote this shell script that automates the addition of new virtual hosts

Starting and Stopping Bluedragon Server JX from the command line

Assuming that Bluedragon has been installed in the default way then there should have been an “rc” standard script created in the the /etc/init.d folder so that means the server can be started and stopped using the following command:

# service BlueDragon_Server_JX {start|stop|restart}

Install CFMX7.0.2 / Apache2.2 / Centos5.2 / Virtual PC 2007

I’ve just spent the last two days preparing a new development environment on a Virtual PC 2007 VM for the application I’m currently building.
The idea behind this setup is that it mirrors as closely as possible the production environment which is CFMX7.0.2 / Centos 5.2 / Apache 2.2.

It took a lot of abortive attempts to get this right but I finally managed it with the help of the very well written walkthrough by Bill Mitchell which itself refers greatly to another blog post by Steve Erat. Mr Mitchell’s guide is great – it covers several different methods of installing the Apache connector in CFMX7 – he can take all of the credit for this, in fact I copied large sections of his procedure (thanks Mr Mitchell :)).

So I’m going to now give a set of precise instructions on how to set up and configure this dev environment that should work first time. I’m also going to be a bit naughty and provide the wsconfig file for download off my server – this will save some more time.

  1. Begin by installing Centos 5.2 on a virtual machine running in Virtual PC – make sure to use “text mode” for the installation as VPC doesn’t support 24bit graphics and will not display the installer properly.
  2. Once installed, open the ports you need in the Centos firewall
  3. Install LAMP (Apache, PHP & MySQL) using Yum (see this article for details).
  4. Reboot the server and check that everything works properly so far. Once you’re sure it is then it is a good time to enable undo disks in VPC as the next phase of the install can go wrong and if it does you can just revert back to this safe position and try again. To enable undo disks:
    1. shut down the virtual machine
    2. in the VPC console open the VM’s settings
    3. select undo disks (6th item) and enable it
    4. restart the VM
  5. Download the coldfusion-702-lin.bin installer from the Adobe download site – on the main Coldfusion download page you will need to click the "related downloads" link to find the correct download
  6. Disable Selinux (find out how here)
  7. Install libXp
    yum install libXp
  8. Add a coldfusion runtime user
    adduser username
  9. Rename the binary installer
    [root@machine]# cp coldfusion-702-lin.bin coldfusion-702-lin.bin.backup 
  10. Use the following string replace command on the binary to comment out a line that causes problems
    [root@machine]# cat coldfusion-702-lin.bin.backup | sed "s/export LD_ASSUME/#xport LD_ASSUME/" > coldfusion-702-linux.bin 
  11. Make the modified binary executable
    [root@machine]# chmod 755 coldfusion-702-lin.bin 
  12. Execute the installer and select the “Built-In Webserver” option (don’t worry this will be replace with Apache later) IMPORTANT – DON’T LAUNCH THE COLDFUISON SERVER YET – if you do then you’ll have to start all over again.
  13. Open the /opt/coldfusionmx7/runtime/servers/coldfusion/SERVER-INF/jrun.xml file and
    1. Find the entry labeled ProxyService
    2. Add <attribute name=”deactivated”>false</attribute> (changed from true)
    3. Find the entry labeled WebService
    4. Add <attribute name="deactivated">true</attribute> (changed from false)
    5. Find the entry cacheRealPath
    6. Add <attribute name="cacheRealPath">true</attribute> (changed from false)
    7. Save the file
  14. In /opt/coldfusionmx7/runtime/lib/ create a directory called ‘wsconfig’
  15. In /opt/coldfusionmx7/runtime/lib/wsconfig create a driectory called ’1′ (one)
  16. In /opt/coldfusionmx7/runtime/lib/wsconfig create a file called and populate it with:
    #JRun Web Server Configuration File
    # edited by bill 10.31 Thur May 24
    1 .srv=localhost,"coldfusion"

    and save the file

  17. In /opt/coldfusionmx7/runtime/lib/wsconfig/1 create a file called and populate it with:
    proxyservers= The 51011 is for ColdFusion MX 7:
  18. Download this file and place it into the /opt/coldfusionmx7/runtime/lib/wsconfig/1 directory
  19. Change ownership of the wsconfig directory and its contents to the coldfusion user:
    chown -R <coldfusion user> /opt/coldfusionmx7/runtime/lib/wsconfig

    for example, I created a user named ‘coldfusion’ so I entered:

    chown -R coldfusion /opt/coldfusionmx7/runtime/lib/wsconfig

    (when you manually create this folder / file structure everything will be owned by the root user. This will cause problems when Apache attempts to connect to coldfusion – hence the above step)

  20. Edit the httpd config file:
    vi /etc/httpd/conf/httpd.conf

    and find the line containing DirectoryIndex. Add index.cfm to the list of default file names so it should now look something like this:

    DirectoryIndex index.html index.html.var index.cfm

    and then append the following section to the end of the file and re-save it:

    # JRun Settings
    LoadModule jrun_module /opt/coldfusionmx7/runtime/lib/wsconfig/1/
    JRunConfig Verbose false
    JRunConfig Apialloc false
    JRunConfig Ssl false
    JRunConfig Ignoresuffixmap false
    JRunConfig Serverstore /opt/coldfusionmx7/runtime/lib/wsconfig/1/
    JRunConfig Bootstrap
    #JRunConfig Errorurl 
    AddHandler jrun-handler .cfm .cfml .cfc .jsp .jws .cfr .cfswf
  21. Create a symlink to the CFIDE folder in the document root:
    cd /var/www/html
    ln -s /opt/coldfusionmx7/wwwroot/CFIDE
  22. Restart the apache server
    [root@machine ~]# service httpd restart 
  23. Start the Coldfusion server
    [root@machine ~]# service coldfusionmx7 start 
  24. Test everything works properly by putting an index.cfm containing some CFML scripting (eg <cfdump var=”#CGI#”>) into the apache web root and type:

    You should see the CGI dump. Then test the coldfusion administrator works


    where centos-VM is either a domain that you’ve set up for your new VM or its IP address on your LAN

  25. Now you should have a fully working virtual Centos server with CFML (& PHP) support. Don’t forget to install the MySQL connector J Driver too – I already blogged that one here

    Finally you really should should close the VM saving the changes. Before re-launching the VM I would recommend that you copy the VM folder to an archive location – you never know when you might need a freshly installed VM with this environment in the future. Leaving undo disks enabled in Virtual PC is a good idea if you can afford the extra disk space required – if you do break your dev environment in the future and can’t fix it but don’t want to restore the initial image then leaving undo disks enabled will allow you to roll back to the last time you saved your changes. Just remember to save your changes regularly.

    Good luck with it!

CFML Upload file checklist

I always forget how to build upload forms in CFML so here’s a little checklist to remind myself (and anyone else who is interested)

  1. use an HTML form with the following attributes:
    • method=”post”
    • enctype=”multipart/form-data”
    •             <cfform action="index.cfm" enctype="multipart/form-data" method="post">
                      <cfinput type="file" name="inputfile">
                      <cfinput type="submit" name="upload" value="Upload file">
  2. Use a <cffile action=”upload”> tag something along the lines of…
            <cffile  action="upload" 
            <cfcatch type="any">There was an error uploading the file</cfcatch>
  3. use the CFFILE scope to access the structure containing all information about the upload. Here is a sample listing:
    attemptedserverfile	bookmark.htm
    clientdirectory	[empty string]
    clientfile		bookmark.htm
    clientfileext		htm
    clientfilename		bookmark
    contentsubtype		html
    contenttype		text
    datelastaccessed	{ts '2009-06-03 08:52:40'}
    fileexisted		NO
    filesize		10599
    filewasappended	NO
    filewasoverwritten	NO
    filewasrenamed		NO
    filewassaved		YES
    oldfilesize		0
    serverdirectory	/home/myAccount/myaccount/WORK/uploadtest
    serverfile		bookmark.htm
    serverfileext		htm
    serverfilename		bookmark
    timecreated		{ts '2009-06-03 08:52:40'}
    timelastmodified	{ts '2009-06-03 08:52:40'}