919 - 926 - 9847

New Railo plans and pricing

Crazy, crazy world out there.  It looks like I may get a green flag to have my company, Geodesic GraFX, on the community page at getrailo.org.  I wouldn't be hosting today without a great open source product like Railo, and I'm flattered to be given a chance to have my name out there as a recommended host.

Update on godaddy refugee plan

I know this is late, but I've got this plan offering up and in place!  In fact, even if you're not a GoDaddy refugee you can get 30 days of free hosting to see if Railo+MySQL+Apache works for you.  You can find details here.

Update on godaddy shared customer plan offer

It's been busy here at the ranch, but I promise to have a tiral hosting plan together for my hosting site (Geodesic GraFX) after NCDevCon is over. 

You do development on Apache+Tomcat+Railo+Adobe CF+Resin+etc

So let's say you support multiple customers, and a mix of Adobe ColdFusion, Railo, and multitudes of J2EE servers.  You want to remain true to the environment you're developing against, so you end up installing all the pieces to make that happen.  At one point, I had ACF 6.x - 8.x installed on my laptop, but for now I just need ACF 9.x and Railo+Resin or Tomcat.

I like to pipe everything through Apache.  I realize that most modern J2EE engines can handle tons of traffic, most still cannot (easily) match the power of mod_rewrite and Apache.

I won't be detailing how you install ACF, or Apache, etc in this post.  I do plan on doing so at some point down the line, but it won't be this post.

Firstly, in your httpd.conf, we set up our Resin/ACF DLLs.

LoadModule jrun_module "<JRUNpath>/lib/wsconfig/1/mod_jrun22.so"
LoadModule caucho_module "<railopath>/win32/apache-2.2/mod_caucho.dll"

Next, make a directory to hold your Apache virtual hosts configs and add this nifty line to your httpd.conf.  Note, this is the windows syntax.  You don't need the *.conf in *nix for whatever reason.

Include <apachepath>/conf/mysites/*.conf

Make a site1.conf in the mysites folder, and this is what it would look like for ACF.

<VirtualHost *:80>
<Directory "<projectpath>\site1">
AllowOverride None
Options None
Order allow,deny
Allow from all

alias /CFIDE C:\JRun4\servers\cfusion\cfusion-ear\cfusion-war\CFIDE
alias /cfide C:\JRun4\servers\cfusion\cfusion-ear\cfusion-war\CFIDE

# JRun Settings
<IfModule mod_jrun22.c>
JRunConfig Verbose false
JRunConfig Apialloc false
JRunConfig Ignoresuffixmap false
JRunConfig Serverstore "C:/JRun4/lib/wsconfig/1/jrunserver.store"
JRunConfig Bootstrap
AddHandler jrun-handler .jsp .jws .cfm .cfml .cfc .cfr .cfswf

DocumentRoot "<projectpath>\site1"
ServerName site1.local
ServerAdmin contact@localhost
ErrorLog <projectpath>\site1\apache_logs\error.log
TransferLog <projectpath>\site1\apache_logs\access.log

For Resin+Railo, it'd look like this for site2.conf

<VirtualHost *:80>
<Directory "<projectpath>\site2">
AllowOverride None
Options None
Order allow,deny
Allow from all

ResinConfigServer localhost 6800
<Location /caucho-status>
SetHandler caucho-status

DocumentRoot "<projectpath>\site2"
ServerName site2.local
ServerAdmin contact@localhost
ErrorLog <projectpath>\site2\apache_logs\error.log
TransferLog <projectpath>\site2\apache_logs\access.log

For our last example, site3.conf, we'll use Tomcat+Railo

<VirtualHost *:80>
<Directory "<projectpath>\site3">
AllowOverride None
Options None
Order allow,deny
Allow from all

<Proxy *>
Allow from

ProxyPreserveHost On
ProxyPassMatch ^/(.+\.cf[cm])(/.*)?$ ajp://localhost:8009/$1$2

DocumentRoot "<projectpath>\site3"
ServerName site3.local
ServerAdmin contact@localhost
ErrorLog <projectpath>\site3\apache_logs\error.log
TransferLog <projectpath>\site3\apache_logs\access.log

Cool, I'm a Railo case study!

I'd like to thank AJ Mercry for the push to submit my story, Gert Franz and Micha for offering the platform, and the Railo community for helping me sort out issues the last few years.

Without Railo, I'd not be able to have the server offerings that exist today.  That's not a kang on Adobe ColdFusion, merely saying that without open source tools (apache/mysql/eclipse/subversion), I'd have to charge much higher prices, and shove more clients on a server just to break even.

Thank you Railo community, I can't wait for the goodies coming down the pipe!

Link to the case study is here

GoDaddy drops (shared) ColdFusion support

For whatever reason I only saw this yesterday, but it looks like GoDaddy is dropping out of the CF arena.

I would like to help some of these lost souls out. In the next few weeks, I'm going to put together a server offering with a free 30 day trial just for GoDaddy customers that would like to see if Railo will meet their needs. I don't have all the details formulated yet, but it will include 500 Megs storage, 1 domain, email, etc. I don't yet have the capital together to transfer domains to my own services, but re-pointing to my NS servers will get the job done.

If there's any GoDaddy users ready to just jump ship, before I get the promotion together, you can always hit up my contact link.

Gobless you Daemon, and Gobless open source

I've been tracking down a funky memory issue as of late, and it's down to some of the caching being done on one of my FarCry HTML objects. Essentially, the PS Old Gen fills up, and during the course of trying to run a GC on it, one of my four CPU cores just goes AWOL. I'll kill the thread in htop, and the Resin watchdog service will automagically fire back up, and within about 3 minutes we're good to go.

After having something concrete to pass to team Daemon, I'm truly thrilled to have gotten a response back in just a few hours time. Turns out, Daemon has already been working on the objectBroker caching abilities. They now keep a watch on memory use, and automatically start clearing objects out of cache should memory start to go downhill.

I've been watching FusionReactor off and on for the past 3 hours, and I think this fix has nailed the problem. Before, a GC wouldn't bring memory down past 70% or so. Now, it's coming back down to 50%. Combine that with FusionReactor watching for super long running requests, and I think I can now go back to my customer and tell them we can expect no more major slow downs or memory issues. I love open source communities!

If you're looking for this fix, you can find it in both the p610 branch and p600 branch

Might be the newest Railo case study

May wonders never cease. AJ Mercer and I were having a chat about FarCry, and the conversation turned to Railo hosting. I did catch the post from Sean about needing more marketing by us (the people in the trenches), but didn't really think myself a candidate for this. But, AJ pointed out it'd make for a good case study.

So, I've submitted my information to Gert, and I guess we'll see if it shows up on the case study page. I haven't look over the sites we host in awhile, but it surprised me to see it's up to 30+ as of now. It truly wouldn't be possible, at least on a VPS plan such as those that linode.com offers, without a great product like Railo. Way to go, team Railo, I eagerly await Railo 4.0!

Railo scope dumper

I'm presently trying to run down a memory (perceived) leak issue on an application that I've hosted for 3 years. In the past 3 months, this app has moved to the FarCry framework from a... less than stellar homebrew solution

At first, I thought it was Lucene shorting out, but I didn't have anything concrete beyond the amount of traffic hitting it. I installed FusionReactor, and although it's very helpful to watch the graphs, it still didn't give all that much accuracy into what was going on. Until...

A heap dump from yesterday revealed that railo.runtime.type.scope.ApplicationImpl had grown to 450 megs for just one site (the one converted recently). After asking around the Railo list, this object appears to be the application scope. Further suggestion was to loop over the keys, and use the built-in sizeOf and countOf functions to see what's going on (yay Railo!).

With some manual dumping of those keys, it appears that the cached HTML object types had grown far beyond expected. Way, far beyond. Ooops. So I cleared the cached objects, and poof, memory was manageable again.

So, on to a handy little file/CFC that will dump out scopes in Railo (I don't think these functions exist in Adobe CF, but I've not tested yet). Much thanks to Gert Franz, Michael Offner, Jay, and Peter Boughton (especially for those key loops Peter!)

First, you need this template. scopeDump.cfm

<!--- instantiate scope object --->
<cfset oGetScopeDetail=createObject("component", "scopeDump")>
<form action="" method="post">
<!--- set what scopes you want to dump --->
<select name="scope" id="scope">
    <option value="application">Application</option>
    <option value="session">Session</option>    
    <option value="cgi">CGI</option>

<input id="submit" name="submit" type="submit" value="GO!">
<cfif structkeyExists(form,"submit")>

<!--- You MUST get the struct to pass into the function --->
    <cfset stScope=oGetScopeDetail.getDetail(structGet(form.scope))>
    <cfif structkeyExists(stScope,'countOf')>
        <p>Count of #form.scope#: #stScope.countOf#</p>
    <cfif structkeyExists(stScope,'sizeOf')>
        <p>Size of #form.scope#: #stScope.sizeOf#</p>
<!--- Looping over the returned objects in the structure --->
    <cfif structkeyExists(stScope,'aItems')>
        <table border="1">
            <cfloop from="1" to="#arraylen(stScope.aItems)#" index="i">

You'll also need this little CFC, scopeDump.cfc

<cfcomponent displayname="scopeDump" >

    <cffunction name="getDetail" access="remote" returntype="struct">
        <cfargument name="scopeVar" required="yes" type="struct">
        <cfset var rStruct=structnew()>
        <cfset rStruct.countOf=numberformat(StructCount(arguments.scopeVar),',')>
        <cfset rStruct.sizeOf=numberformat(SizeOf(arguments.scopeVar),',')>
        <cfset var aItems=arraynew(1)>
        <cfset var stItems=structnew()>
        <cfset var tmp="">
        <cfloop item="CurItem" collection=#arguments.scopeVar#>
            <cfset stItems.name=CurItem>
            <cfif isStruct(arguments.scopeVar[CurItem])>
                <cfset stItems.countOf=numberformat(StructCount(arguments.scopeVar[CurItem]),',')>
                <cfset stItems.countOf=0>
            <cfset stItems.sizeOf=numberformat(SizeOf(arguments.scopeVar[CurItem]),',')>
            <cfset tmp=arrayappend(aItems,structcopy(stItems))>
            <cfset tmp=structclear(stItems)>
        <cfset rStruct.aItems=aItems>

        <cfreturn rStruct>

Facelift (mostly) complete

It's been a long time since I've done a site redesign. I've split off "me" from "business".

Part of this process was moving my blog to a subdomain of my main site. I've thought about making this change for years, but the time has finally come. I really want to be more visible in the hosting/site development sphere, but it's doubtful that those end users really care about my chuck e' cheese experiences ;)

One thing I didn't want to do was lose any traffic (not that I get all that much). So I stumbled around the intertubes for a bit to come up with this

RewriteCond %{REQUEST_URI} (^/blog)($|/)
RewriteRule ^(.*)$ http://matthewwilliams.geodesicgrafx.com$1 [R=301,L]

The above redirects where my blog used to be, geodesicgrafx.com/blog to matthewwilliams.geodesicgrafx.com/blog. In theory, it should change all the search engine links to point to the new address, but there's not much I can do about links out on other pages. Provided I never make a new blog at the old address, it should be fine.

More Entries