X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FFastCGI.pm;h=30bb3a5aa1b979dc370ffe15b904f24519131278;hb=6ca7348595fbeb309bedfb2fa5ee35fc0e8f8a07;hp=280fee1e5c085b3908b11e835886e3e97083b66b;hpb=63630a22d1abb7c3de7afa2e5709b9eca894c40c;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine/FastCGI.pm b/lib/Catalyst/Engine/FastCGI.pm index 280fee1..30bb3a5 100644 --- a/lib/Catalyst/Engine/FastCGI.pm +++ b/lib/Catalyst/Engine/FastCGI.pm @@ -113,6 +113,7 @@ sub run { if ($listen) { $options->{manager} ||= "FCGI::ProcManager"; $options->{nproc} ||= 1; + $options->{proc_title} ||= "perl-fcgi-pm [$class]"; $self->daemon_fork() if $options->{detach}; @@ -123,6 +124,7 @@ sub run { { n_processes => $options->{nproc}, pid_fname => $options->{pidfile}, + pm_title => $options->{proc_title}, } ); @@ -157,6 +159,10 @@ sub run { sub write { my ( $self, $c, $buffer ) = @_; + # ->write will be called once with the body, even in a redirect (and + # in that case, the body is undef) + $buffer = '' if !defined $buffer; + unless ( $self->_prepared_write ) { $self->prepare_write($c); $self->_prepared_write(1); @@ -234,7 +240,12 @@ sub _fix_env if ( $env->{SERVER_SOFTWARE} =~ /lighttpd/ ) { $env->{PATH_INFO} ||= delete $env->{SCRIPT_NAME}; } - # Fix the environment variables PATH_INFO and SCRIPT_NAME when running under IIS + elsif ( $env->{SERVER_SOFTWARE} =~ /^nginx/ ) { + my $script_name = $env->{SCRIPT_NAME}; + $env->{PATH_INFO} =~ s/^$script_name//g; + } + # Fix the environment variables PATH_INFO and SCRIPT_NAME when running + # under IIS elsif ( $env->{SERVER_SOFTWARE} =~ /IIS\/[6-9]\.[0-9]/ ) { my @script_name = split(m!/!, $env->{PATH_INFO}); my @path_translated = split(m!/|\\\\?!, $env->{PATH_TRANSLATED}); @@ -292,7 +303,7 @@ static, and dynamic. =head3 Standalone server mode FastCgiExternalServer /tmp/myapp.fcgi -socket /tmp/myapp.socket - Alias /myapp/ /tmp/myapp/myapp.fcgi/ + Alias /myapp/ /tmp/myapp.fcgi/ # Or, run at the root Alias / /tmp/myapp.fcgi/ @@ -433,6 +444,76 @@ above modes. Note the required mod_rewrite rule. For more information on using FastCGI under Lighttpd, visit L +=head2 nginx + +Catalyst runs under nginx via FastCGI in a similar fashion as the lighttpd +standalone server as described above. + +nginx does not have its own internal FastCGI process manager, so you must run +the FastCGI service separately. + +=head3 Configuration + +To configure nginx, you must configure the FastCGI parameters and also the +socket your FastCGI daemon is listening on. It can be either a TCP socket +or a Unix file socket. + +The server configuration block should look roughly like: + + server { + listen $port; + + location / { + fastcgi_param QUERY_STRING $query_string; + fastcgi_param REQUEST_METHOD $request_method; + fastcgi_param CONTENT_TYPE $content_type; + fastcgi_param CONTENT_LENGTH $content_length; + + fastcgi_param SCRIPT_NAME /; + fastcgi_param PATH_INFO $fastcgi_script_name; + fastcgi_param REQUEST_URI $request_uri; + fastcgi_param DOCUMENT_URI $document_uri; + fastcgi_param DOCUMENT_ROOT $document_root; + fastcgi_param SERVER_PROTOCOL $server_protocol; + + fastcgi_param GATEWAY_INTERFACE CGI/1.1; + fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; + + fastcgi_param REMOTE_ADDR $remote_addr; + fastcgi_param REMOTE_PORT $remote_port; + fastcgi_param SERVER_ADDR $server_addr; + fastcgi_param SERVER_PORT $server_port; + fastcgi_param SERVER_NAME $server_name; + + # Adjust the socket for your applications! + fastcgi_pass unix:$docroot/myapp.socket; + } + } + +It is the standard convention of nginx to include the fastcgi_params in a +separate file (usually something like C) and +simply include that file. + +=head3 Non-root configuration + +If you properly specify the PATH_INFO and SCRIPT_NAME parameters your +application will be accessible at any path. The SCRIPT_NAME variable is the +prefix of your application, and PATH_INFO would be everything in addition. + +As an example, if your application is rooted at /myapp, you would configure: + + fastcgi_param SCRIPT_NAME /myapp/; + fastcgi_param PATH_INFO $fastcgi_script_name; + +C<$fastcgi_script_name> would be "/myapp/path/of/the/action". Catalyst will +process this accordingly and setup the application base as expected. + +This behavior is somewhat different than Apache and Lighttpd, but is still +functional. + +For more information on nginx, visit: +L + =head2 Microsoft IIS It is possible to run Catalyst under IIS with FastCGI, but only on IIS 6.0