Slides and Demo Code from Scotch on the Rocks 2013 (Caching)

I had a great time attending and presenting at Scotch on the Rocks 2013 in Edinburgh. For the past several years now, I've been talking about the importance of caching as part of an overall application architecture consideration. Although I've presented on the topic a dozen or so times now, each presentation I give is different from the last.

If you would like a copy of the slides, along with demo code that illustrates all of the points I covered during the talk, you can download it here:

Caching for Performance and Scalability in ColdFusion 10 (zip) - Scotch on the Rocks 2013

Any questions about the content, please leave a comment!

Adobe ColdFusion 10 Web Application Construction Kit Ships

The wait is over - you were waiting, weren't you? The much anticipated book, Adobe ColdFusion Web Application Construction Kit: ColdFusion 10 Enhancements and Improvements, is now available and shipping from Amazon. I had the pleasure of working on the book along with Ben Forta, Chandan Kumar, Charlie Arehart, Hemant Khandelwal, Kenneth Fricklas, and Ray Camden.

If you're looking for the difinitive guide on what's new in ColdFusion 10, this is the book for you.

Help Test the Next Version of ColdFusion

Interested in helping to test the next version of ColdFusion (code name: Splendor) and/or ColdFusion Builder (code name Thunder)? If so, Adobe wants to hear from you. To sign up to be considered for the pre-release programs, simply fill out the ColdFusion Splendor Pre-release Survey.

There's no official word on the exact start date of the pre-release program, but this post on the official Adobe CF Blog indicates "soon".

Slides and Demo Code from My ColdFusion 10 Developer Week 2012 Presentation on Caching

I had a great turnout for my ColdFusion 10 Developer Week 2012 presentation "Speed Your Websites using Caching in ColdFusion 10". It's always hard to take such a vast subject and distill it into a one hour presentation. I had a little more material to cover than I could comfortably fit into an hour, and things got a bit rushed toward the end. Overall I think the presentation went well, and I hope everyone who turned up for it learned something new. As promised, I'm attaching my slides and all of the demo code I used in the presentation. The presentation recording should be posted by Adobe shortly. As soon as I have the link, I'll blog it as well.

As always, if you have questions about Caching in ColdFusion, hit me up via email or twitter (see my Contact page).

Speed Your Websites using Caching in ColdFusion 10 (zip)

Slides from my cf.Objective 2012 Talk: Ten Steps to Move your Use of Caching Beyond the Basics

Thanks to everyone who came out to hear my presentation on Ten Steps to Move your Use of Caching Beyond the Basics at cf.Objective 2012. As promised, here are the slides, demo code, and ehcache.xml config file from the session.

Ten Steps to Move your Use of Caching Beyond the Basics (zip)

Slides from my cf.Objective 2012 Presentation: Maintaining Healthy ColdFusion Servers

Below you'll find a link to the slides from my cf.Objective 2012 presentation on Maintaining Healthy ColdFusion Servers. Thanks to all those who came out to see the talk!

Maintaining Healthy ColdFusion Servers (zip)

Fixing 404 Errors When Trying to Implement REST in ColdFusion 10 with Apache

If you're working with ColdFusion 10's new REST implementation and experiencing 404 errors with Apache when trying to call your services, chances are your server is misconfigured. See this blog post for a complete step-by-step on how to configure multiple instances of ColdFusion 10 with Apache virtual hosts. It's relevant even if you only have a single instance of ColdFusion 10.

To the specific problem at hand, is how ColdFusion 10 and Tomcat handle mappings between services such as REST and ColdFusion (Tomcat) instances. There's a properties file called uriworkermap.properties that handles this:

view plain print about
1/cfformgateway/* = cfusion
2/CFFormGateway/* = cfusion
3/flex2gateway/* = cfusion
4/flex2gateway = cfusion
5/cffileservlet/* = cfusion
6/CFFileServlet/* = cfusion
7/cfform-internal/* = cfusion
8/flashservices/gateway/* = cfusion
9/flex-internal/* = cfusion
10/rest/* = cfusion
11/*.cfml/* = cfusion
12/*.mxml = cfusion
13/*.as = cfusion
14/*.cfm = cfusion
15/*.cfm/* = cfusion
16/*.swc = cfusion
17/*.cfml = cfusion
18/*.cfc = cfusion
19/*.cfc/* = cfusion
20/*.cfr = cfusion
21/*.cfswf = cfusion
22/*.sws = cfusion
23/*.jsp = cfusion
24/*.hbmxml = cfusion

What you can see here is all the mappings between the various ColdFusion services and the default cfusion instance. The crux of the issue is that you must explicitly declare the uriworkermap.properties file in each Apache virtual host, including the default via a directive called JkMountFile. It looks like this:

view plain print about
1JkMountFile "C:\ColdFusion10\config\wsconfig\1\uriworkermap.properties"

Here's an example of what that looks like for the default virtual host in Apache:

view plain print about
1# Load mod_jk module
2LoadModule jk_module "C:\ColdFusion10\config\wsconfig\1\mod_jk.so"
3# Where to find workers.properties
4JkWorkersFile "C:\ColdFusion10\config\wsconfig\1\workers.properties"
5# Where to put jk logs
6JkLogFile "C:\ColdFusion10\config\wsconfig\1\mod_jk.log"
7# Where to put jk shared memory
8JkShmFile "C:\ColdFusion10\config\wsconfig\1\jk_shm"
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] "
13
14AddHandler jakarta-servlet .cfm .cfml .cfc .cfr .cfswf
15
16<Files ~ ".hbmxml$">
17Order allow,deny
18Deny from all
19</Files>
20
21<VirtualHost *:80>
22ServerName localhost
23DocumentRoot C:/_web/cf10/cfusion/localhost/wwwroot
24ErrorLog c:/_web/logs/cfusion-localhost.log
25
26JkMountFile "C:\ColdFusion10\config\wsconfig\1\uriworkermap.properties"
27
28<Directory "C:/_web/cf10/cfusion/localhost/wwwroot">
29 Options Indexes FollowSymLinks
30 AllowOverride None
31 Order allow,deny
32 Allow from all
33</Directory>
34
35 Alias /CFIDE "C:\ColdFusion10\cfusion\wwwroot\CFIDE"
36
37 <Directory "C:\ColdFusion10\cfusion\wwwroot\CFIDE">
38 Options Indexes FollowSymLinks
39 AllowOverride None
40 Order allow,deny
41 Allow from all
42 </Directory>
43</VirtualHost>

Note that this is done in the mod_jk.conf file by default. This is the file that CF 10 creates and includes via your httpd.conf file by default. You don't have to use mod_jk.conf if you don't want to, but you must make sure that the various mod_jk directives are called and that JkMountFile is specified for each virtual host you setup.

Ensuring a JkMountFile directive for each virtual host should resolve the majority of your 404 errors when configuring ColdFusion 10 rest services with Apache.

Configuring Multiple Instances of ColdFusion 10 with Apache Virtual Hosts

In my last blog post, I walked through the steps of installing ColdFusion 10 on Windows with Apache as the web server. I'm going to build on that in this post and show you how you can create additional ColdFusion instances and tie them to multiple virtual hosts in Apache (the multiple virtual hosts part is often referred to as multihoming).

For the purposes of this blog post, I'm going to assume that you've already installed ColdFusion 10 in the Server Configuration (Not EAR/WAR deployment). I'm also going to assume you chose to install Apache as your web server during the install process. This gives you a single instance of ColdFusion 10 (cfusion) with Apache connected to ColdFusion as localhost.

Now let's suppose I want to do two things. I want to have two instances of ColdFusion, cfusion (the default instance) and a new instance, cfusion2. For the cfusion instance I want two virtual hosts, one for localhost and one for zeus1.foo.com. For my cfusion2 instance, I want a single virtual host for zeus2.foo.com. Here are the steps to create that configuration. I'm doing this on a Windows install, but the basic process is the same across platforms. To visualize, the setup will look like this:

cfusion (instance 1)
+--localhost
+--zeus1.foo.com

cfusion2 (instance 2) +--zeus2.foo.com

The first thing we need to do is create our new ColdFusion instance (cfusion2). To do this, we need to fire up the ColdFusion Administrator. Once logged in, click on the Instance Manager link in the Enterprise Manager section. Here you'll see a list of currently configured instances. To create a new instance, click the Add New Instance button:

Enter cfusion2 in the Server Name box. Leave the Server Directory as-is, and make sure to check the Create Windows Service box. When you're finished, click Submit.

It generally takes a few minutes for ColdFusion to create the instance. When it's finished, you'll see a screen with a link back to the Enterprise Manager. Go ahead and click the link once it appears:

Once you're back in the Instance Manager, you should see the new cfusion2 instance. Notice how the HTTP Port column shows 8500? This is because the new instance is setup to use Tomcat's built-in web server. Don't worry about that right now, we'll get to fixing that in just a minute. For now, just note the value in the Remote Port column for your cfusion2 instance as we'll be needing it shortly.

If you're wondering where ColdFusion 10 physically puts the directory structure for your instances, it's directly in the /ColdFusion10 install root:

With our two instances created, it's time to make some changes to ColdFusion's underlying Tomcat server configuration and Apache Tomcat connector configuration. We'll tackle the Tomcat configuration for the cfusion2 instance first. Fire up your favorite text editor and open the server.xml file located in:

C:\ColdFusion10\cfusion2\runtime\conf

About halfway down the file, you should see a line of XML that looks like this:

view plain print about
1<Connector port="8013" protocol="AJP/1.3" redirectPort="8446" tomcatAuthentication="false">

Verify that the Connector Port matches the Remote Port you noted earlier from the Instance Manager for the cfusion instance.

At the bottom of the file, you should see some additional XML that looks like this:

view plain print about
1<Connector port="8500" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" executor="tomcatThreadPool">
2</Connector>

This code is used to configure Tomcat's built-in web server. Since we want to connect our ColdFusion instance to Apache, we need to disable this. To do that, simply comment it out and save the file:

view plain print about
1<!--
2<Connector port="8500" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" executor="tomcatThreadPool">
3</Connector>
4-->

Now that we've disabled the built-in web server, we need to tell Tomcat we want to use Apache as our web server instead. To do this, we have to make some changes to the Apache Tomcat connector ColdFusion previously installed. The connector and its associated configuration files can be found here:

C:\ColdFusion10\config\wsconfig\1

The connector itself is compiled and named mod_jk.so. There's not much to do with it other than to verify that it's there. The two files that we're interested in for our instance configuration are workers.properties and uriworkermap.properties.

The workers.properties file is used to configure your server instances. If you open it up in a text editor, you'll see that it's configured for your default cfusion instance:

view plain print about
1worker.list=cfusion
2
3worker.cfusion.type=ajp13
4worker.cfusion.host=localhost
5worker.cfusion.port=8012

To add our additional cfusion2 instance, we simply have to make two changes:

view plain print about
1worker.list=cfusion, cfusion2
2
3worker.cfusion.type=ajp13
4worker.cfusion.host=localhost
5worker.cfusion.port=8012
6
7worker.cfusion2.type=ajp13
8worker.cfusion2.host=localhost
9worker.cfusion2.port=8013

worker.list should contain a comma delimited list of all of the server instances you have. Below that, you need to configure the properties for each instance. You only need to concern yourself with the port here. Each ColdFusion instance gets its own port, which you can obtain from the Instance Manager in the ColdFusion Administrator.

Next, make a copy of your uriworkermap.properties file and name it uriworkermap_cfusion2.properties. The ColdFusion 10 docs tell you to rename it to uriworkermap1.properties, but I don't like that convention - especially if you have a lot of instances. Anyhow, change all of the mappings in the uriworkermap_cfusion2.properties file so that they apply to the cfusion2 instance. Here's how that should look:

view plain print about
1/cfformgateway/* = cfusion2
2/CFFormGateway/* = cfusion2
3/flex2gateway/* = cfusion2
4/flex2gateway = cfusion2
5/cffileservlet/* = cfusion2
6/CFFileServlet/* = cfusion2
7/cfform-internal/* = cfusion2
8/flashservices/gateway/* = cfusion2
9/flex-internal/* = cfusion2
10/rest/* = cfusion2
11/*.cfml/* = cfusion2
12/*.mxml = cfusion2
13/*.as = cfusion2
14/*.cfm = cfusion2
15/*.cfm/* = cfusion2
16/*.swc = cfusion2
17/*.cfml = cfusion2
18/*.cfc = cfusion2
19/*.cfc/* = cfusion2
20/*.cfr = cfusion2
21/*.cfswf = cfusion2
22/*.sws = cfusion2
23/*.jsp = cfusion2
24/*.hbmxml = cfusion2

That's it for the Apache Tomcat connector configuration. All that's left to do now is to setup our Apache virtual hosts, restart all of our servers and verify everything's working as expected.

Open your Apache http.conf file and notice that ColdFusion has placed the following directive at the bottom of the file:

view plain print about
1# Load mod_jk module
2Include "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\conf\mod_jk.conf"

Personally, I don't like the absolute path, so I usually make mine relative. I also like it in a subdirectory for virtual hosts. You don't have to move yours, it's just a personal preference of mine:

view plain print about
1# Load mod_jk module
2Include conf/vhosts/mod_jk.conf

This directive tells Apache to load the mod_jk.conf configuration file that ColdFusion created when you told it to configure Apache as your web server.

Open your mod_jk.conf file and create the virtual hosts. Here's my mod_jk.conf file (I added some space and moved some things around to make it easier to read):

view plain print about
1# Load mod_jk module
2LoadModule jk_module "C:\ColdFusion10\config\wsconfig\1\mod_jk.so"
3# Where to find workers.properties
4JkWorkersFile "C:\ColdFusion10\config\wsconfig\1\workers.properties"
5# Where to put jk logs
6JkLogFile "C:\ColdFusion10\config\wsconfig\1\mod_jk.log"
7# Where to put jk shared memory
8JkShmFile "C:\ColdFusion10\config\wsconfig\1\jk_shm"
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] "
13
14AddHandler jakarta-servlet .cfm .cfml .cfc .cfr .cfswf
15
16<Files ~ ".hbmxml$">
17Order allow,deny
18Deny from all
19</Files>
20
21 <VirtualHost *:80>
22 ServerName localhost
23 DocumentRoot C:/_web/cf10/cfusion/localhost/wwwroot
24 ErrorLog c:/_web/logs/cfusion-localhost.log
25
26 JkMountFile "C:\ColdFusion10\config\wsconfig\1\uriworkermap.properties"
27
28 <Directory "C:/_web/cf10/cfusion/localhost/wwwroot">
29        Options Indexes FollowSymLinks
30        AllowOverride None
31        Order allow,deny
32        Allow from all
33 </Directory>
34
35    Alias /CFIDE "C:\ColdFusion10\cfusion\wwwroot\CFIDE"
36
37    <Directory "C:\ColdFusion10\cfusion\wwwroot\CFIDE">
38        Options Indexes FollowSymLinks
39        AllowOverride None
40        Order allow,deny
41        Allow from all
42    </Directory>
43</VirtualHost>
44
45 <VirtualHost *:80>
46 ServerName zeus1.foo.com
47 DocumentRoot C:/_web/cf10/cfusion/zeus1/wwwroot
48 ErrorLog c:/_web/logs/cfusion-zeus1.log
49
50 JkMountFile "C:\ColdFusion10\config\wsconfig\1\uriworkermap.properties"
51
52 <Directory "C:/_web/cf10/cfusion/zeus1/wwwroot">
53        Options Indexes FollowSymLinks
54        AllowOverride None
55        Order allow,deny
56        Allow from all
57 </Directory>
58
59    Alias /CFIDE "C:\ColdFusion10\cfusion\wwwroot\CFIDE"
60
61    <Directory "C:\ColdFusion10\cfusion\wwwroot\CFIDE">
62        Options Indexes FollowSymLinks
63        AllowOverride None
64        Order allow,deny
65        Allow from all
66    </Directory>
67</VirtualHost>
68
69 <VirtualHost *:80>
70 ServerName zeus2.foo.com
71 DocumentRoot C:/_web/cf10/cfusion2/zeus2/wwwroot
72 ErrorLog c:/_web/logs/cfusion2-zeus2.log
73
74 JkMountFile "C:\ColdFusion10\config\wsconfig\1\uriworkermap_cfusion2.properties"
75
76 <Directory "C:/_web/cf10/cfusion2/zeus2/wwwroot">
77        Options Indexes FollowSymLinks
78        AllowOverride None
79        Order allow,deny
80        Allow from all
81 </Directory>
82
83    Alias /CFIDE "C:\ColdFusion10\cfusion2\wwwroot\CFIDE"
84
85    <Directory "C:\ColdFusion10\cfusion2\wwwroot\CFIDE">
86        Options Indexes FollowSymLinks
87        AllowOverride None
88        Order allow,deny
89        Allow from all
90    </Directory>
91</VirtualHost>

Note that for my cfusion instance where I want to have two virtual hosts, one for localhost and one for zeus1.foo.com, I've added the same jkmountfile directive to each virtual host like so:

view plain print about
1JkMountFile "C:\ColdFusion10\config\wsconfig\1\uriworkermap.properties"

All virtual hosts on a single instance should point to the same uriworkermap.properties file since that file specifies the mapping at the instance level.

For my cfusion2 instance, the single virtual host points to uriworkermap_cfusion2.properties:

view plain print about
1JkMountFile "C:\ColdFusion10\config\wsconfig\1\uriworkermap_cfusion2.properties"

That's it for configuration. Go ahead and stop and start both of your ColdFusion instances and your Apache web server just to make sure all changes are reflected.

Test out the URLs for each of your virtual hosts to make sure everything is pointing where it should be:

http://localhost http://zeus1.foo.com http://zeus2.foo.com Now open the ColdFusion administrator on localhost:

view plain print about
1http://localhost/CFIDE/administrator

Everything should load up fine. In the Mappings section of the Administrator, /CFIDE and /gateway point to the correct locations:

view plain print about
1C:/ColdFusion10/cfusion/wwwroot/CFIDE
2C:/ColdFusion10/cfusion/gateway/cfc

Repeat the same process for your other virtual hosts, making sure the /CFIDE and /gateway mappings point to the correct locations for your instances.

That's it, you should now be configured for multiple instances of ColdFusion with multiple Apache virtual hosts.

Installing ColdFusion 10 with Apache on Windows

Here's a quick visual walk through for installing ColdFusion 10 in Server Configuration with Apache as the web server on Windows.

Launch the installer, click next.

Accept the license terms, then click next.

Enter your serial number, choose the 30-Day Trial or Developer Edition. Click next.

Choose Server configuration. If you've installed other versions of ColdFusion in the past, you'll notice that there's no longer a Multi-Server option. This is because ColdFusion 10 has standardized the install/directory structure. The Server configuration creates a single, stand-alone instance of ColdFusion with Tomcat embedded as the JEE server. From there, you can create and configure additional instances of ColdFusion from withing the ColdFusion Administrator. To proceed, click Next.

Select the services you want installed and click next.

Enter a username and password for the remote server administration account. Click next.

A new feature in ColdFusion 10 will check the strength of the password you entered and make recommendations if it's found to be weak. Click yes if you want to modify the password you entered. If you want to ignore the warning and proceed, click No.

If you are installing ColdFusion 10 alongside a previous version, you may get a screen telling you that a previous version of the .Net service has been detected. Click next.

Select the directory where you want ColdFusion to install and click next.

It's now time to configure Apache as our web server. Click Add.

Select Apache as the web server.

Find the location of your Apache /conf directory:

Find the location of your Apache httpd.exe file:

Make sure everything is correct and click OK.

You should now have the configuration setup for Apache. Click next.

Enter a password to restrict access to the ColdFusion Administrator. Click next.

The password strength dialog may appear again. Click Yes to change your password or No to accept the one you just entered.

Choose whether or not you want to enable RDS. If you do enable it, provide a password. Click next when you are done.

You may get the password strength dialog again. Click Yes to change your password or No to accept the one you just entered.

If you want ColdFusion to automatically check for updates, check this box. This is a new feature in ColdFusion 10 and I highly recommend it. The check only occurs when you log into the ColdFusion Administrator. When you are done, click Next to proceed.

Review the information for the install. Click Install when you're ready to go.

The installer will now move through a series of screens highlighting features as the program installs.

You'll be greeted with a success message when the installer has completed. Click on the Done button to launch the ColdFusion Administrator and complete the install process.

You should now see the Configuration and Settings Migration Wizard in your browser. This step will completely your server configuration and migrate settings from any previous versions of ColdFusion the wizard detects. You'll need to enter the password you provided for the ColdFusion Administrator. Once you're ready, click Login.

You'll see a screen letting you know configuration is proceeding. The process can take several minutes.

When the process is complete, you can click Ok to launch the ColdFusion Administrator.

Congratulations, you've successfully installed ColdFusion 10 with Apache as your web server.

To see what changes ColdFusion 10 made to your Apache configuration, open your Apache http.conf file. You should see the following at the bottom of the file:

view plain print about
1# Load mod_jk module
2Include "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\conf\mod_jk.conf"

This directive tells Apache to load up the ColdFusion Tomcat/Apache connector configuration from an external file called mod_jk.conf. Go ahead and take a look at that file (I've added spacing to make it easier to read):

view plain print about
1# Load mod_jk module
2LoadModule jk_module "C:\ColdFusion10\config\wsconfig\1\mod_jk.so"
3
4# Where to find workers.properties
5JkWorkersFile "C:\ColdFusion10\config\wsconfig\1\workers.properties"
6
7JkMountFile "C:\ColdFusion10\config\wsconfig\1\uriworkermap.properties"
8
9# Where to put jk logs
10JkLogFile "C:\ColdFusion10\config\wsconfig\1\mod_jk.log"
11
12# Where to put jk shared memory
13JkShmFile "C:\ColdFusion10\config\wsconfig\1\jk_shm"
14
15# Set the jk log level [debug/error/info]
16JkLogLevel info
17
18# Select the timestamp log format
19JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
20
21AddHandler jakarta-servlet .cfm .cfml .cfc .cfr .cfswf
22
23Alias /CFIDE "C:\ColdFusion10\cfusion\wwwroot\CFIDE"
24
25<Directory "C:\ColdFusion10\cfusion\wwwroot\CFIDE">
26Options Indexes FollowSymLinks
27AllowOverride None
28Order allow,deny
29Allow from all
30</Directory>
31
32<Files ~ ".hbmxml$">
33Order allow,deny
34Deny from all
35</Files>

This file sets up various mapping and configuration options as well as maps the location for ColdFusion's /CFIDE directory. Note that it places /CFIDE inside of ColdFusion 10's default webroot. It's generally not a good idea to expose your /CFIDE directory to everyone. There are many ways to secure your /CFIDE directory. For specifics, see Pete Freitag's ColdFuion Lockdown Guide.

That's about it for the install. In my next post, I'll be showing how you can extend this installation to include multiple instances of ColdFusion, each with multiple Apache virtual hosts.

ColdFusion 10 Enters Public Beta

The title says it all. The much anticipated ColdFusion 10 (Zeus) has entered public beta and is available for download from Adobe Labs.

ColdFusion 10 represents a leap forward for ColdFusion with a nice combination of updated infrastructure and libraries as well as lots and lots of improvements to existing features. While they were at it the engineering team went ahead and added a slew of new features and language enhancements as well. Here's a small sampling of what's new:

  • Apache Tomcat replaces JRun - I was almost tempted to put a blink tag here.
  • Overhauled scheduler - Quartz scheduler under the hood. Lots and lots of new functionality.
  • Security - Adobe implemented the OWASP ESAPI library under the covers and it's now pervasive throughout ColdFusion.
  • AXIS2 upgrade - Much improved support for SOAP web services.
  • RESTful web services
  • HTML5 WebSockets
  • HTML5 Charting
  • ORM Search
  • Caching updates (updated ehcache, caching functions, query & login cache moved to ehcache).
  • Hotfix Updater - Keeping up with and installing hotfixes and updates has never been so easy.

This is just the tip of the iceberg. For a really nice overview of what's new from engineering team member Sagar Ganatra, check out his site.