NAME
Plack::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 => $listen,
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.
- keep-stderr
-
Send STDERR to STDOUT instead of the webserver
WEB SERVER CONFIGURATIONS
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 SEREVR_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
You can use FastCgiExternalServer
as normal.
FastCgiExternalServer /tmp/myapp.fcgi -socket /tmp/fcgi.sock
See 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.