NAME
Plack::Handler::FCGI - FastCGI handler for Plack
SYNOPSIS
# Run as a standalone daemonplackup -s FCGI --listen /tmp/fcgi.sock --daemonize --nproc 10# Run from your web server like mod_fastcgi#!/usr/bin/env plackup -s FCGImy $app = sub { ... };# Roll your ownmy $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 either a FCGI::ProcManager subclass, or an actual FCGI::ProcManager-compatible object. If you do not want a FCGI::ProcManager but instead run in a single process, set this to undef.
use FCGI::ProcManager::Dynamic;Plack::Handler::FCGI->new(manager => FCGI::ProcManager::Dynamic->new(...),);
- daemonize
-
Daemonize the process.
- proc-title
-
Specify process title
- keep-stderr
-
Send psgi.errors to STDERR instead of to the FCGI error stream.
- backlog
-
Maximum length of the queue of pending connections, defaults to 100.
EXTENSIONS
Supported PSGI::Extensions.
- psgix.cleanup
-
push @{ $env->{'psgix.cleanup.handlers'} }, sub { warn "Did this later" }if $env->{'psgix.cleanup'};Supports the
"psgix.cleanup"extension, in order to use it, just push a callback onto"$env->{'psgix.cleanup.handlers'". These callbacks are run after the"pm_post_dispatch"hook.
- psgix.harakiri
-
$env->{'psgix.harakiri.commit'} = 1if $env->{'psgix.harakiri'};If there is a "manager", then
"psgix.harakiri"will be enabled and setting"$env->{'psgix.harakiri.commit'}"to a true value will cause"$manager->pm_exit"to be called after the request is finished.
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 <https://www.nginx.com/resources/wiki/start/topics/examples/fastcgiexample/> 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 pathAlias /myapp/ /tmp/myapp.fcgi/# OR at the rootAlias / /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", mounting apps under the root causes wrong "SCRIPT_NAME" and "PATH_INFO" set. Also, mounting 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:
FcgidPassHeader Authorization
Server::Starter
This plack handler supports Server::Starter as a superdaemon. Simply launch plackup from start_server with a path option. The listen option is ignored when launched from Server::Starter.
start_server --path=/tmp/socket -- plackup -s FCGI app.psgi
SEE ALSO
Plack