Enable PATH_INFO on Nginx with Lucee and Railo

Nginx logoUpdate, 2 hours after posting (11-aug-2015 15:30): I pasted an older code snippet. The correct one is underneath. (nginx: [emerg] "proxy_set_header" directive is not allowed here ...)


While setting up a new Ubuntu server, I decided to install Nginx instead of Apache httpd, having been jealous at the easy config files nginx has. I was really happy to find out Pete Freitag already created install scripts for Nginx + Lucee + Tomcat + some other goodies.

One of the first problems I encountered after install, while moving existing sites to this new server, was the absence of cgi.PATH_INFO. Especially on this blog, it is used on each page, except for the homepage.
It took me a few hours of Googling and trying, and almost gave up, since all examples on how to enable it included the use of fastcgi. Which is not what I am using: I am proxying to Tomcat.

Main problem I encountered was the fact that the PATH_INFO header was just not proxied to (or picked up at?) the Tomcat backend, even while adding "proxy_set_header PATH_INFO /bla/bla" to the config.

Lucee logoThen, it suddenly hit me. For the modcfml project, contributor Bilal Soylu added support for PATH_INFO to his AJP connector for IIS, called the BonCode connector. AJP does not natively support sending the path_info header to the AJP backend.
What Bilal did in the BonCode connector, is adding a request header xajp-path-info, which contains the actual path_info on the IIS side. He also made sure the 3 opensource CFML engines Lucee, Railo, and BlueDragon, accept this incoming header as the fallback path_info source. For example, see Lucee's cgi.path_info implementation at Github. The header is supported in Railo since May 2012, according to the JIRA ticket.

So that's cool: we can use a different header to send to Tomcat, which will still be picked up as regular path_info by Lucee/Railo/BlueDragon!

The following nugget should be placed somewhere in your nginx config:

set $pathinfo "";
# if the extension .cfm or .cfc is found, followed by a slash and optional extra
if ($uri ~ "^(.+?\.cf[mc])(/.*)") {
    # remember the filepath without path_info
    set $script $1;
    set $pathinfo $2;
    # rewrite the url to match the filepath wthout path_info
    rewrite ^.+$ $script break;
}
# set the custom path_info header
proxy_set_header XAJP-PATH-INFO $pathinfo;

After a reload of Nginx, your path_info should be working! If it isn't, let me know.

No Comments

Mod_cfml 1.1 is out – furiously fast, bugs smashed, and new features!

Logo Mod_cfmlMod_cfml is software which shares webserver configuration with Tomcat, eliminating the need to configure hosts (or websites) in Tomcat.
I am very proud to say that I had a major role in the current new release. I rewrote the Apache httpd component in native C, added new features, fixed bugs, and generally improved speed by a factor 5 to 10. That's at the moment when it's actually used by the way; on the first hit of a website after the server started up.

The Tomcat part is much improved:

 

  • Speed: creating a new host context now takes 1 second at most (5 – 10 times faster then before), because jar scanning is now disabled by default.
  • Speed: “waiting for context files”, the slow part of previous mod_cfml, is gone.
  • Speed and memory footprint: only one Tomcat Host container is created per Apache/IIS virtualhost. All aliases / default site hosts / IP-based hosts, are now added as aliases. Which takes about 200 milliseconds.
  • Thread safety bugs fixed

Apache connector improvements:

  • The Apache 2.4 connector is rewritten in C. No more need to install Perl, just compile or drop in the mod_cfml.so file, and add a few lines of config!
  • Full support for path_info. Previously, URLs like /some/page.cfm/id/123 would not work in Tomcat. With mod_cfml 1.1, now they do! Thanks to a great idea which was already implemented in the BonCode connector.
  • Security: a shared secret key implementation is added, to prevent unauthorized context creation.
  • Virtual directories, or “Aliases” in Apache, are now by default sent from Apache to Lucee, for the current request.

IIS connector:

The updated Documentation and Installation instructions can be found at www.modcfml.org.

 

So… what are you waiting for? Install! Upgrade! And have fun with CFML!

 

p.s. if you're interested, the source code can be found at https://github.com/utdream/mod_cfml

No Comments

Railo is dead; long live Lucee!

Lucee logoBig news came from the Railo front the 29th of January: Railo is abandoned by it's founders, and the same code project will now live on as Lucee. The underlying code remains the same, but the name changes, as does the organizational type. The new site is http://lucee.org

The commercial company The Railo Company became the copyright owner of Railo a few years ago, after investments done by some companies. Now it apparently lead to not much good. Even so bad, that the founders decided to "fork" (=~ copy) the project, and continue under a new name.

But, I have full confidence in the strength and continuous growth of Lucee, as the founders an community is samrt and strong. I hope we will all adjust to a new cool name, and say cheers to this new path for CFML!

Railo is dead; Long live Lucee!

P.s. My daughter's name is Luce, that's near-identical :-D

2 Comments

CFUG-NL meeting with Gert Franz and Bilal Soylu - 2 top-notch speakers in one evening!

My day couldn't be better... First thanks to Bilal Soylu, who told me a while back he would be kind-of-nearby The Netherlands in May 2014, and he was willing to do one of his always-awesome presentations! Bam, new CFUG-NL meeting planned for may 28, 2014.

And today I am chatting with Gert Franz, and the word CFUG drops. "I should come around once to do a presentation", Gert said. "You wouldn't happen to be in the vicinity around the 28th?" I replied. And bada-bing bada-boom, now we've got a super-awesome dual presentation evening!

If you're in The Netherlands may 28, 2014, then do come and check this evening out!

Notice in Dutch on www.cfug.nl, "Surprise!" :

Surprise! Gert Franz, CEO en boegbeeld van Railo, komt óók een presentatie geven! Dit wordt een avond om niet snel te vergeten, met 2 topsprekers op 1 avond!
Gert's presentatie Railo 5.0 and beyond kreeg vele lovende kritieken tijdens CF.Objective 2014, "it's just wow!". Dit is jouw kans om het zelf mee te maken!

No Comments

Phonegap: detecting correct connection type on iOS 7.1 iPad

I just spent 2 hours debugging a Phonegap iPad app. The app downloads a library of images and videos to localStorage, but only if the device is currently on WiFi. The iPads do have a cellular 4G connection as well, but the data transfer would be too costly, the client said.

In all tests the files downloaded fine, and all was good. Untill a few days back: now the app constantly shows my custom msg "downloading files (waiting for WIFI)". It turned out the iPads were updated to a newer iOS version. While debugging, the network.connection.type now always returned "cellular", even when cellular was disabled on the iPad.

Solution? Turned out to be simple: overwrite the old CDVReachability.m and .h files (version 2.2) with the latest ones, version 3.5. You'll need to rename references in the 2 files from "Reachability" to "CDVReachability".
Or... just download these 2 files here, and add them to:

/plugins/org.apache.cordova.network-information/src/ios/
/platforms/ios/{app name}/Plugins/org.apache.cordova.network-information/

Hope it helps you out, I will try to add a pull request as well.

No Comments