SpringOne 2GX 2014 is being held in Dallas, TX and I've been lucky enough to be selected to speak again this year. I'll be co-presenting at the event with Stuart Williams, our presentation is Fastest Servlets in the West. The session will talk about, you guessed it, performance of Servlet based applications running in Apache Tomcat. We'll also talk about load testing, tuning the container and offer some tips for squeezing every bit of performance out of your app when it's running on Apache Tomcat.
The conference runs from Sept 8th to Sept 11th this year, with our talk scheduled for the first day at 12:45 PM. If you're planning to come, register soon as early bird registration (saves you $150) ends, August 9th!
Thursday, July 31, 2014
Tips on Migrating to Tomat 8 - Resources
One of the major changes from Tomcat 7 to Tomcat 8 was a refactoring with how Tomcat handles web application resources. With Tomcat 7, there are features like aliases, VirtualLoader and VirtualDirContext that provide admins with a way to pull external resources into an app. Unfortunately, each one of these features was implemented separately so to consolidate things and make them easier to maintain in Tomcat 8, all of these different implementations were combined into one resources framework which now handles all of that functionality.
Because of the consolidation and refactoring, several attributes from the Context configuration were removed and replaced with the Resources configuration. This migration tip discusses how to switch from using common variations of the old Tomcat 7 configuration to the new Tomcat 8 Resources configuration.
Here's an example configuration using aliases.
Here's an example of the same configuration using Tomcat 8's Resources.
Here is an example of how this was used under Tomcat 7. In this case, I'm using it to point to picture and movie assets that need to be included with the application.
It's also possible to use a PreResources tag, instead of the PostResources. The difference would be that resources listed with a PostResources tag are checked after resources bundled in the web applications and resources with the PreResources tag are checked prior to resources bundled in the web application. In other words, PreResources can be used to override a resource that is included with an application.
Here's an example of how this was configured with Tomcat 7.
Because of the consolidation and refactoring, several attributes from the Context configuration were removed and replaced with the Resources configuration. This migration tip discusses how to switch from using common variations of the old Tomcat 7 configuration to the new Tomcat 8 Resources configuration.
Aliases
In Tomcat 7, the Context configuration tag has an attribute called aliases which can be used to provide a list of external locations from which Tomcat will load resources for the context. There were a few reasons to use this, but one common reason was to use it to include static resources or configuration that an administrator wanted to place outside of a WAR file.Here's an example configuration using aliases.
<Context aliases="/images=/var/www/images" />
Here's an example of the same configuration using Tomcat 8's Resources.
<Context>
<Resources>
<PostResources className="org.apache.catalina.webresources.DirResourceSet"
base="/var/www/images" webAppMount="/images" />
</Resources>
</Context>
VirtualDirContext
The VirtualDirContext feature is similar to aliases but was targeted as a development feature. The suggestion for using it is so that you do not have to deploy an entire WAR file. Instead, you can point to the location of your static resources in your project and only copy, zip and deploy the code itself.Here is an example of how this was used under Tomcat 7. In this case, I'm using it to point to picture and movie assets that need to be included with the application.
<Context>
<Resources className="org.apache.naming.resources.VirtualDirContext"
extraResourcePaths="/pictures=/Users/theuser/mypictures,/movies=/Users/theuser/mymovies" />
</Context>
The same configuration under Tomcat 8 would look like this.<Context>
<Resources>
<PostResources className="org.apache.catalina.webresources.DirResourceSet"
base="/Users/theuser/mypictures" webAppMount="/pictures" />
<PostResources className="org.apache.catalina.webresources.DirResourceSet"
base="/Users/theuser/mymovies" webAppMount="/movies" />
</Resources>
</Context>
It's also possible to use a PreResources tag, instead of the PostResources. The difference would be that resources listed with a PostResources tag are checked after resources bundled in the web applications and resources with the PreResources tag are checked prior to resources bundled in the web application. In other words, PreResources can be used to override a resource that is included with an application.
VirtualWebappLoader
The VirtualWebappLoader feature is used to add additional directories or JAR files onto the class path. This is different from the previous two options because it allows you to add JAR files, classes or configuration to the class path and not just the file system. Again, there are a few reasons why you might want to do this, one common reason was so that you could pull JAR files out from the WAR file to a centralized location.Here's an example of how this was configured with Tomcat 7.
<Context>
<Loader className="org.apache.catalina.loader.VirtualWebappLoader"
virtualClasspath="/apps/shared/lib/*.jar,/apps/shared/classes" />
</Context>
Here's an example of how this is configured with Tomcat 8.<Context>
<Resources>
<PostResources className="org.apache.catalina.webresources.DirResourceSet"
base="/apps/shared/lib" webAppMount="/WEB-INF/lib" />
<PostResources className="org.apache.catalina.webresources.DirResourceSet"
base="/apps/shared/classes" webAppMount="/WEB-INF/classes" />
</Resources>
</Context>
If you were using the searchExternalFirst attribute of the VirtualWebappLoader class, switching from using a PostResource tag to a PreResource tag should allow you to achieve the same behavior.Additional Information
That covers some of the common configuration scenarios that have been changed due to the new Resources API. For more information on this change, I would suggest the following resources.
Feel free to drop me a comment if I missed anything.
Thursday, March 20, 2014
SpringOne2GX Video
My presentation from SpringOne2 GX 2013 is now available online. It's hosted on InfoQ here.
http://www.infoq.com/presentations/apache-tomcat-8
This is similar to the Webinar that Stuart and I presented last month, but a bit longer (90 mins vs 60 mins).
If you're curious about one of the other sessions from SpringOne 2GX 2013, you can the list of currently available sessions online here.
http://www.infoq.com/springone-2gx-2013/
or on the SpringSourceDev YouTube channel.
http://www.youtube.com/user/SpringSourceDev
Don't see the session you want yet, hang in there. More sessions are being posted all the time.
http://www.infoq.com/presentations/apache-tomcat-8
This is similar to the Webinar that Stuart and I presented last month, but a bit longer (90 mins vs 60 mins).
If you're curious about one of the other sessions from SpringOne 2GX 2013, you can the list of currently available sessions online here.
http://www.infoq.com/springone-2gx-2013/
or on the SpringSourceDev YouTube channel.
http://www.youtube.com/user/SpringSourceDev
Don't see the session you want yet, hang in there. More sessions are being posted all the time.
Tuesday, March 11, 2014
CloudFoundry & PHP: Update
Back in July, I released a build pack for running PHP applications on CloudFoundry. Today I'm happy to announce a significant update to the build pack!
https://github.com/dmikusa-pivotal/cf-php-build-pack
This effort is a total rewrite of the original build pack with the following goals.
https://github.com/dmikusa-pivotal/cf-php-build-pack
This effort is a total rewrite of the original build pack with the following goals.
- Maintain clean and easily understandable detect, compile and release scripts
- Execute quickly. Run detect, compile and release scripts with minimal effort, downloading as little as possible.
- Utilize a default configuration that "just works" for the majority of users.
- Allow application developers to override default build pack behavior and settings through configuration.
- Allow the build pack to be extended easily via extensions.
- Allow application developers to include custom extensions.
- Not be tied to one particular HTTP server. Support multiple and allow application developers to pick which they use.
- Provide better insight into the application environment. Allow application and servers to be easily monitored.
- Integrate all logs and output into loggregator.
The result is a huge improvement, with all the functionality of the old CF PHP & Apache Build Pack and lots of new features including...
- Executes quickly. Run detect, compile and release scripts with minimal effort, downloading as little as possible.
- Support for the latest versions of Apache HTTPD 2.4 and Nginx 1.5
- Support for the latest versions of PHP 5.4 and 5.5
- Support for a large set of PHP extensions, including amqp, apc, bz2, curl, dba, gd, gettext, gmp, imap, ldap, mcrypt, mongo, openssl, pdo_pgsql, pgsql, pspell, redis, xdebug and zlib
- Versions of HTTPD, Nginx and PHP are automatically upgraded to the latest release just by re-staging an application
- Allows for application developers to control which PHP extensions are installed
- Allows for application developers to custom configure HTTPD, Nginx and / or PHP
- Download location is configurable, allowing users to host binaries on the same network (i.e. run without an Internet connection)
- Support for an extension mechanism that allows the build pack to provided additional functionality
- Allows for application developers to provide custom extensions
- Support for NewRelic with both bound services and when manually specifying a license key
- Easy troubleshooting with the BP_DEBUG environment variable
- All logging output is routed through stderr & stdout which is sent to loggregator
If you’re interested in developing PHP applications or running a packaged PHP application on CloudFoundry, please take a look at our “30 Second Tutorial” or one of the build pack samples like PHPMyAdmin, Wordpress or the CodeIgniter Tutorial.
Enjoy, and as always, feed back and PR’s are welcome!
Labels:
apache httpd,
build pack,
cloudfoundry,
nginx,
php
Subscribe to:
Posts (Atom)