The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;


package Jifty::Script::FastCGI;
use base qw/Jifty::Script/;

use Plack::Handler::FCGI;

=head1 NAME

Jifty::Script::FastCGI - A FastCGI server for your Jifty application

=head1 SYNOPSIS

    AddHandler fastcgi-script fcgi
    FastCgiServer /path/to/your/jifty/app/bin/jifty -initial-env JIFTY_COMMAND=fastcgi 

  Options:
    --maxrequests      maximum number of requests per process

    --help             brief help message
    --man              full documentation

=head1 DESCRIPTION

FastCGI entry point for your Jifty application

=head2 options

=over 8

=item B<--maxrequests>

Set maximum number of requests per process. Read also --man.

=item B<--help>

Print a brief help message and exits.

=item B<--man>

Prints the manual page and exits.

=back

=cut

sub options {
    my $self = shift;
    return (
        $self->SUPER::options,
        'maxrequests=i' => 'maxrequests',
    );
}

=head1 DESCRIPTION

When you're ready to move up to something that can handle the increasing load your
new world-changing application is generating, you'll need something a bit heavier-duty
than the pure-perl Jifty standalone server.  C<FastCGI> is what you're looking for.

If you have MaxRequests options under FastCGI in your config.yml, or
command-line option C<--maxrequests=N> assigned, the FastCGI process
will exit after serving N requests.

=head1 SERVER CONFIGURATIONS

=head2 Apache + mod_fastcgi

 # These two lines are FastCGI-specific; skip them to run in vanilla CGI mode
 AddHandler fastcgi-script fcgi
 FastCgiServer /path/to/your/jifty/app/bin/jifty -initial-env JIFTY_COMMAND=fastcgi 

 DocumentRoot /path/to/your/jifty/app/share/web/templates
 ScriptAlias / /path/to/your/jifty/app/bin/jifty/

=head2 Apache + mod_fcgid + mod_rewrite

An alternative to Apache mod_fastcgi is to use mod_fcgid with mod_rewrite.
If you use mod_fcgid and mod_rewrite, you can use this in your Apache
configuration instead:

 DocumentRoot /path/to/your/jifty/app/share/web/templates
 ScriptAlias /cgi-bin /path/to/your/jifty/app/bin
 DefaultInitEnv JIFTY_COMMAND fastcgi
 <Directory /path/to/your/jifty/app/bin>
     Options ExecCGI
     SetHandler fcgid-script
 </Directory>
 <Directory /path/to/your/jifty/app/share/web/templates>
     RewriteEngine on
     RewriteRule ^$ index.html [QSA]
     RewriteRule ^(.*)$ /cgi-bin/jifty/$1 [QSA,L]
 </Directory>

It may be possible to do this without using mod_rewrite.

=head2 Lighttpd (L<http://www.lighttpd.net/>)

Version 1.4.23 or newer is recommended, and you may adapt this config:

 server.modules  = ( "mod_fastcgi" )
 server.document-root = "/path/to/your/jifty/app/share/web/templates"
 fastcgi.server = (
        "/" => (
            "your_jifty_app" => (
                "socket"              => "/tmp/your_jifty_app.socket",
                "check-local"         => "disable",
                "fix-root-scriptname" => "enable",
                "bin-path"            => "/path/to/your/jifty/app/bin/jifty",
                "bin-environment"     => ( "JIFTY_COMMAND" => "fastcgi" ),
                "min-procs"           => 1,
                "max-procs"           => 5,
                "max-load-per-proc"   => 1,
                "idle-timeout"        => 20,
            )
        )
    )

Versions before 1.4.23 will work, but you should read L<Plack::Handler::FCGI's lighttpd
documentation|http://search.cpan.org/dist/Plack/lib/Plack/Handler/FCGI.pm#lighttpd>
for how to configure your server.

=head2 More information

Since this uses L<Plack::Handler::FCGI>, you might also want to read
L<its documentation on webserver
configurations|http://search.cpan.org/dist/Plack/lib/Plack/Handler/FCGI.pm#WEB_SERVER_CONFIGURATIONS>.

=head1 METHODS

=head2 run

Creates a new FastCGI process.

=cut

sub run {
    my $self = shift;

    $self->print_help;

    Jifty->new();
    my $conf = Jifty->config->framework('Web')->{'FastCGI'} || {};
    $self->{maxrequests} ||= $conf->{MaxRequests}; # XXX: make it work

    my $server = Plack::Handler::FCGI->new(
        nproc  => $conf->{NProc} || 1,
        detach => 1,
    );

    $server->run(Jifty->handler->psgi_app);
}

1;