Plack::Handler::FCGI(3User Contributed Perl DocumentatiPlack::Handler::FCGI(3)NAMEPlack::Handler::FCGI - FastCGI handler for Plack
SYNOPSIS
# Run as a standalone daemon
plackup -s FCGI --listen /tmp/fcgi.sock --daemonize --nproc 10
# Run from your web server like mod_fastcgi
#!/usr/bin/env plackup -s FCGI
my $app = sub { ... };
# Roll your own
my $server = Plack::Handler::FCGI->new(
nproc => $num_proc,
listen => [ $port_or_socket ],
detach => 1,
);
$server->run($app);
DESCRIPTION
This is a handler module to run any PSGI application as a standalone
FastCGI daemon or a .fcgi script.
OPTIONS
listen
listen => [ '/path/to/socket' ]
listen => [ ':8080' ]
Listen on a socket path, hostname:port, or :port.
port
listen via TCP on port on all interfaces (Same as "listen =>
":$port"")
leave-umask
Set to 1 to disable setting umask to 0 for socket open
nointr
Do not allow the listener to be interrupted by Ctrl+C
nproc
Specify a number of processes for FCGI::ProcManager
pid Specify a filename for the pid file
manager
Specify a FCGI::ProcManager sub-class
daemonize
Daemonize the process.
proc-title
Specify process title
keep-stderr
Send STDERR to STDOUT instead of the webserver
backlog
Maximum length of the queue of pending connections
WEB SERVER CONFIGURATIONS
In all cases, you will want to install FCGI and FCGI::ProcManager. You
may find it most convenient to simply install Task::Plack which
includes both of these.
nginx
This is an example nginx configuration to run your FCGI daemon on a
Unix domain socket and run it at the server's root URL (/).
http {
server {
listen 3001;
location / {
set $script "";
set $path_info $uri;
fastcgi_pass unix:/tmp/fastcgi.sock;
fastcgi_param SCRIPT_NAME $script;
fastcgi_param PATH_INFO $path_info;
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 REQUEST_URI $request_uri;
fastcgi_param SERVER_PROTOCOL $server_protocol;
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;
}
}
}
If you want to host your application in a non-root path, then you
should mangle this configuration to set the path to "SCRIPT_NAME" and
the rest of the path in "PATH_INFO".
See <http://wiki.nginx.org/NginxFcgiExample> for more details.
Apache mod_fastcgi
After installing "mod_fastcgi", you should add the
"FastCgiExternalServer" directive to your Apache config:
FastCgiExternalServer /tmp/myapp.fcgi -socket /tmp/fcgi.sock
## Then set up the location that you want to be handled by fastcgi:
# EITHER from a given path
Alias /myapp/ /tmp/myapp.fcgi/
# OR at the root
Alias / /tmp/myapp.fcgi/
Now you can use plackup to listen to the socket that you've just
configured in Apache.
$ plackup -s FCGI --listen /tmp/myapp.sock psgi/myapp.psgi
The above describes the "standalone" method, which is usually
appropriate. There are other methods, described in more detail at
"Standalone_server_mode" in Catalyst::Engine::FastCGI (with regards to
Catalyst, but which may be set up similarly for Plack).
See also
<http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiExternalServer>
for more details.
lighttpd
To host the app in the root path, you're recommended to use lighttpd
1.4.23 or newer with "fix-root-scriptname" flag like below.
fastcgi.server = ( "/" =>
((
"socket" => "/tmp/fcgi.sock",
"check-local" => "disable",
"fix-root-scriptname" => "enable",
))
If you use lighttpd older than 1.4.22 where you don't have
"fix-root-scriptname", mouting apps under the root causes wrong
"SCRIPT_NAME" and "PATH_INFO" set. Also, mouting under the empty root
("") or a path that has a trailing slash would still cause weird values
set even with "fix-root-scriptname". In such cases you can use
Plack::Middleware::LighttpdScriptNameFix to fix it.
To mount in the non-root path over TCP:
fastcgi.server = ( "/foo" =>
((
"host" = "127.0.0.1",
"port" = "5000",
"check-local" => "disable",
))
It's recommended that your mount path does NOT have the trailing slash.
If you really need to have one, you should consider using
Plack::Middleware::LighttpdScriptNameFix to fix the wrong PATH_INFO
values set by lighttpd.
Authorization
Most fastcgi configuration does not pass "Authorization" headers to
"HTTP_AUTHORIZATION" environment variable by default for security
reasons. Authentication middleware such as
Plack::Middleware::Auth::Basic or
Catalyst::Authentication::Credential::HTTP requires the variable to be
set up. Plack::Handler::FCGI supports extracting the "Authorization"
environment variable when it is configured that way.
Apache2 with mod_fastcgi:
--pass-header Authorization
mod_fcgid:
FcgiPassHeader Authorization
SEE ALSO
Plack
perl v5.14.2 2012-08-13 Plack::Handler::FCGI(3)