=head1 Catalyst Advent - Day 17 - FastCGI Deployment As a companion to Day 7's mod_perl article, today's article is about production FastCGI deployment. =head2 Pros =head3 Speed FastCGI performs equally as well as mod_perl. Don't let the 'CGI' fool you; your app runs as multiple persistent processes ready to receive connections from the web server. =head3 App Server When using external FastCGI servers, your application runs as a standalone application server. It may be restarted independently from the web server. This allows for a more robust environment and faster reload times when pushing new app changes. The frontend server can even be configured to display a friendly "down for maintenance" page while the application is restarting. =head3 Load-balancing You can launch your application on multiple backend servers and allow the frontend web server to load-balance between all of them. And of course, if one goes down, your app continues to run fine. =head3 Multiple versions of the same app Each FastCGI application is a separate process, so you can run different versions of the same app on a single server. =head3 Can run with threaded Apache Since your app is not running inside of Apache, the faster mpm_worker module can be used without worrying about the thread safety of your application. =head2 Cons =head3 More complex environment With FastCGI, there are more things to monitor and more processes running than when using mod_perl. =head2 Setup =head3 1. Install Apache with mod_fastcgi mod_fastcgi for Apache is a third party module, and can be found at L. It is also packaged in many distributions, for example, libapache2-mod-fastcgi in Debian. =head3 2. Configure your application # Serve static content directly DocumentRoot /var/www/MyApp/root Alias /static /var/www/MyApp/root/static FastCgiServer /var/www/MyApp/script/myapp_fastcgi.pl -processes 3 Alias /myapp/ /var/www/MyApp/script/myapp_fastcgi.pl/ # Or, run at the root Alias / /var/www/MyApp/script/myapp_fastcgi.pl/ The above commands will launch 3 app processes and make the app available at /myapp/ =head2 Standalone server mode While not as easy as the previous method, running your app as an external server gives you much more flexibility. First, launch your app as a standalone server listening on a socket. script/myapp_fastcgi.pl -l /tmp/myapp.socket -n 5 -p /tmp/myapp.pid -d You can also listen on a TCP port if your web server is not on the same machine. script/myapp_fastcgi.pl -l :8080 -n 5 -p /tmp/myapp.pid -d You will probably want to write an init script to handle starting/stopping of the app using the pid file. Now, we simply configure Apache to connect to the running server. # 502 is a Bad Gateway error, and will occur if the backend server is down # This allows us to display a friendly static page that says "down for # maintenance" Alias /_errors /var/www/MyApp/root/error-pages ErrorDocument 502 /_errors/502.html FastCgiExternalServer /tmp/myapp -socket /tmp/myapp.socket Alias /myapp/ /tmp/myapp/ # Or, run at the root Alias / /tmp/myapp/ =head2 More Info Lots more information is available in the new and expanded FastCGI docs that will be part of Catalyst 5.62. For now you may read them here: L --Andy Grundman