How to enable verbose logging at connector level in ColdFusion

Increasing logging verbosity at the connector level can be helpful in quick problem identification and resolution as it can pinpoint where the problem is, when an external web server is being used with  Adobe ColdFusion.

ColdFusion 10 and 11 supports IIS and Apache web server. I will show how to enable verbose logging on both web servers.

When we configure connector with an external web server. ColdFusion creates configuration file and store them at <cf_install_root>/config/wsconfig/<Magic Number>.

IIS

To enable verbose logging at IIS level,

  • Set log_level property value from info to debug, in the isapi_redirect.properties file located at <cf_install_root>/config/wsconfig/<Magic Number>.
  • Restart web server for changes to take effect.

Now, It should start logging verbose information about each and every request served over connector in log file named isapi_redirect.log available in the same configuration directory.

If you have more than one website configured with ColdFusion, each website has its own numbered directory available at <cf_install_root>/config/wsconfig/. You should make the changes only in the intended website.

To ensure the configuration directory for specific website, navigate to IIS Manager > Sites > {Site Name} > Jakarta virtual directory. Right click on jakarta virtual directory and click on explore, it will open connector configuration directory for that specific website.

Apache

To enable verbose logging at Apache level,

  • Set JkLogLevel property value from info to debug, in the mod_jk.conf file located at <cf_install_root>/config/wsconfig/<Magic Number>.
  • Restart web server for changes to take effect.

For Apache, it logs verbose information into a log file named mod_jk.log available in the same configuration directory.

 

 Important Notes:

  • In production environment, verbose logging should not be enable for long span of time as it logs very detailed information which may lead to high memory consumption and it also impacts performance.
  • Before making any changes, you need to ensure you are making changes to the intended connector configuration file.

 

 

ColdFusion 11 Update 1 is available now.

Adobe releases ColdFusion 11 update 1 today.

This update includes important bug fixes for databases listed below.

Bug #3217374

It includes support for Geography, Geometry and HierarchyID data types in SQL Server.

Bug #3785178

When a cfstoredproc executes an SQL statement in an Oracle PLSQL statement that returns many empty values for a varchar2 data type  column it becomes extremely slow. This issue was observed in ColdFusion 11.  After applying this update, I have noticed significant improvement in the performance .

Bug #3759846

In ColdFusion 11, there was issue while creating ODBC Socket data source on windows platform. It does not allow you to create the ODBC Socket data source.

For more details refer tech note article.

How to configure ColdFusion WebSocket service over SSL

In this blog, I will discuss how to configure ColdFusion WebSocket service over SSL using self-signed certificate created using keytool. If you are using self-signed certificate to configure WebSocket over SSL, then ColdFusion server should also be running over SSL. I will be explaining it with the help of simple example.

NOTE: This feature is introduced in ColdFusion 11. 

To configure ColdFusion server over SSL follow below mentioned steps:

1. Create Keystore:
keytool -genkey -keyalg RSA -keystore C:\websocket.crt -storepass changeit -alias wss -keypass changeit -validity 365

Keystore contains the private key and certificate. The supported certificate type are JKS(Java Keystore) and pkcs12.
2. Configure ColdFusion to run over SSL:

a. Uncomment “<Connector port=”8443″ protocol=”HTTP/1.1″ SSLEnabled=”true”  maxThreads=”150″ scheme=”https” secure=”true”   clientAuth=”false” sslProtocol=”TLS” />” this section in server.xml file available at <cf_install_root>/cfusion/runtime/conf.
b. Change value of “Protocol” attribute from “HTTP/1.1” to “org.apache.coyote.http11.Http11NioProtocol” in the Connector tag.
c. Add these attributes to above mentioned tag:
i. keystoreFile
ii. keystorePass
d. After adding these attributes, it should look like: “<Connector port=”8443″ protocol=”org.apache.coyote.http11.Http11NioProtocol” SSLEnabled=”true”  maxThreads=”150″ scheme=”https” secure=”true”   clientAuth=”false” sslProtocol=”TLS” keystoreFile=”C:\websocket.crt” keystorePass=”changeit”/>
e. Save Changes.
f. Restart ColdFusion service.
g. Access ColdFusion administrator console using the following URL: https://127.0.0.1:8443/CFIDE/administrator/index.cfm

3. Configure Websocket to run over SSL:
a. Access ColdFusion administrator console.
b. Navigate to ColdFusion Administrator > Server Settings > WebSocket.
c. Check “SSL Port” checkbox.
d. Enter keystore location and password [which we created in step #1 Create Keystore ].
e. Submit Changes.
f. Restart ColdFusion service.

4. Create a sample CFML template to verify the configuration.

Application.cfc

component
{
this.name = “sample”;
this.wschannels = [{name=”demo”}];
}

Index.cfm

<html>
<head>
<title>Websocket Example</title>
<script>
//messagehandler recieves all the messages from websocket
function mycbHandler( messageobj)
{
var message = ColdFusion.JSON.encode(messageobj);
var txt=document.getElementById(“myDiv”);
txt.innerHTML +=message  +”<br>”;
}//openhandler is invoked when socket connection is
function openHandler()
{
var txt=document.getElementById(“myDiv”);
txt.innerHTML +=”open Handler invoked <br>”;
}
</script>
</head>
<cfwebsocket name=”mywsobj” onMessage=”mycbHandler” subscribeTo=”demo” onOpen=”openHandler” secure=”true”/>
<div id=”myDiv”></div>
</html>


5
. Try to access this CFML template using ColdFusion over SSL port using Chrome web browser or any other browser with debugging capability.

6
. In my case, it is Google chrome.  Press F12 and navigate to the Network section to check whether websocket request is being served over SSL or not.





Please leave your comments and queries about this post in the comment sections in order for me to improvise my skills.

How to configure JVisualVM with ColdFusion


Java VisualVM is a powerful tool which is used to monitor and improve the application performance. It allows users to generate and analyze heap dumps, track down memory leaks, perform and monitor garbage collection. It also provides functionality offered by jmap, jinfo, jstat and jstack. If it is required, JConsole can also be integrated with JVisualVM which I discussed in my previous blog.

JVisualVM tool is shipped as part of Java Development Kit. It is located at <JDK_Home>\bin.

We can also utilize this powerful tool with ColdFusion to troubleshoot memory leaks and performance issues.

To configure JVisualVM with ColdFusion, we need to append below mentioned JVM flags to “java.args” section in the “jvm.config” file.

  • -Dcom.sun.management.jmxremote 
  • -Dcom.sun.management.jmxremote.port=<port_number>
  • -Dcom.sun.management.jmxremote.authenticate=false
  • -Dcom.sun.management.jmxremote.ssl=false

In ColdFusion 10, “jvm.config” file is located at <cf_install_root>\<instance_name>\bin.

In ColdFusion 9, “jvm.config” file is located at <cf_install_root>\runtime\bin [Standalone installation] or <jrun_root>\bin [Multi-Server installation].

After appending these JVM flags, save changes and restart ColdFusion server.

Now, your ColdFusion server is configured, and now you can launch JVisualVM utility to monitor the performance and resource consumption.

JVisualVM need not to be run on the same box where ColdFusion server is installed.



Please leave your comments and queries about this post in the comment sections in order for me to improve my writing skills and to showcase more useful posts.