I think the nginx hackery can just die with the new code in ::Engine::CGI
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine / FastCGI.pm
CommitLineData
d1d9793f 1package Catalyst::Engine::FastCGI;
ffb41d94 2
7fa2c9c1 3use Moose;
4extends 'Catalyst::Engine::CGI';
5
0fc2d522 6# eval { Class::MOP::load_class("FCGI") };
6f409682 7eval "use FCGI";
500a1679 8die "Unable to load the FCGI module, you may need to install it:\n$@\n" if $@;
ffb41d94 9
10=head1 NAME
11
fbcc39ad 12Catalyst::Engine::FastCGI - FastCGI Engine
ffb41d94 13
14=head1 DESCRIPTION
15
fbcc39ad 16This is the FastCGI engine.
ffb41d94 17
e2fd5b5f 18=head1 OVERLOADED METHODS
19
fbcc39ad 20This class overloads some methods from C<Catalyst::Engine::CGI>.
e2fd5b5f 21
b5ecfcf0 22=head2 $self->run($c, $listen, { option => value, ... })
b0ad47c1 23
5898abae 24Starts the FastCGI server. If C<$listen> is set, then it specifies a
25location to listen for FastCGI requests;
26
b799b493 27=over 4
28
29=item /path
30
31listen via Unix sockets on /path
32
33=item :port
34
35listen via TCP on port on all interfaces
36
37=item hostname:port
38
39listen via TCP on port bound to hostname
40
41=back
5898abae 42
43Options may also be specified;
44
b799b493 45=over 4
46
47=item leave_umask
48
88eee38e 49Set to 1 to disable setting umask to 0 for socket open
50
51=item nointr
b799b493 52
53Do not allow the listener to be interrupted by Ctrl+C
54
55=item nproc
56
57Specify a number of processes for FCGI::ProcManager
58
59=item pidfile
60
61Specify a filename for the pid file
62
63=item manager
64
65Specify a FCGI::ProcManager sub-class
66
b0ad47c1 67=item detach
b799b493 68
69Detach from console
70
71=item keep_stderr
72
73Send STDERR to STDOUT instead of the webserver
74
75=back
e2fd5b5f 76
77=cut
78
fbcc39ad 79sub run {
5898abae 80 my ( $self, $class, $listen, $options ) = @_;
81
5db46287 82 my $sock = 0;
5898abae 83 if ($listen) {
84 my $old_umask = umask;
85 unless ( $options->{leave_umask} ) {
86 umask(0);
87 }
88 $sock = FCGI::OpenSocket( $listen, 100 )
89 or die "failed to open FastCGI socket; $!";
90 unless ( $options->{leave_umask} ) {
91 umask($old_umask);
92 }
93 }
6f2e0021 94 elsif ( $^O ne 'MSWin32' ) {
5898abae 95 -S STDIN
96 or die "STDIN is not a socket; specify a listen location";
97 }
98
99 $options ||= {};
6f409682 100
84528885 101 my %env;
6fc58422 102 my $error = \*STDERR; # send STDERR to the web server
103 $error = \*STDOUT # send STDERR to stdout (a logfile)
85d9fce6 104 if $options->{keep_stderr}; # (if asked to)
cfd31158 105
5898abae 106 my $request =
6fc58422 107 FCGI::Request( \*STDIN, \*STDOUT, $error, \%env, $sock,
5898abae 108 ( $options->{nointr} ? 0 : &FCGI::FAIL_ACCEPT_ON_INTR ),
109 );
110
111 my $proc_manager;
6f409682 112
113 if ($listen) {
526b698a 114 $options->{manager} ||= "FCGI::ProcManager";
115 $options->{nproc} ||= 1;
b5ecfcf0 116
526b698a 117 $self->daemon_fork() if $options->{detach};
b5ecfcf0 118
526b698a 119 if ( $options->{manager} ) {
120 eval "use $options->{manager}; 1" or die $@;
121
b5ecfcf0 122 $proc_manager = $options->{manager}->new(
123 {
526b698a 124 n_processes => $options->{nproc},
125 pid_fname => $options->{pidfile},
b5ecfcf0 126 }
127 );
128
526b698a 129 # detach *before* the ProcManager inits
130 $self->daemon_detach() if $options->{detach};
131
132 $proc_manager->pm_manage();
cfd31158 133
134 # Give each child its own RNG state.
135 srand;
dc2fc680 136 }
526b698a 137 elsif ( $options->{detach} ) {
138 $self->daemon_detach();
b5ecfcf0 139 }
5898abae 140 }
e2fd5b5f 141
fbcc39ad 142 while ( $request->Accept >= 0 ) {
5898abae 143 $proc_manager && $proc_manager->pm_pre_dispatch();
cfd31158 144
c46dd4e8 145 $self->_fix_env( \%env );
cfd31158 146
84528885 147 $class->handle_request( env => \%env );
cfd31158 148
9f778270 149 $proc_manager && $proc_manager->pm_post_dispatch();
fbcc39ad 150 }
e2fd5b5f 151}
152
b5ecfcf0 153=head2 $self->write($c, $buffer)
e2fd5b5f 154
155=cut
156
fbcc39ad 157sub write {
158 my ( $self, $c, $buffer ) = @_;
4f5ebacd 159
02570318 160 unless ( $self->_prepared_write ) {
4f5ebacd 161 $self->prepare_write($c);
02570318 162 $self->_prepared_write(1);
fbcc39ad 163 }
b0ad47c1 164
e512dd24 165 # XXX: We can't use Engine's write() method because syswrite
166 # appears to return bogus values instead of the number of bytes
167 # written: http://www.fastcgi.com/om_archive/mail-archive/0128.html
b0ad47c1 168
e512dd24 169 # Prepend the headers if they have not yet been sent
02570318 170 if ( $self->_has_header_buf ) {
171 $buffer = $self->_clear_header_buf . $buffer;
e512dd24 172 }
4f5ebacd 173
fbcc39ad 174 # FastCGI does not stream data properly if using 'print $handle',
175 # but a syswrite appears to work properly.
4f5ebacd 176 *STDOUT->syswrite($buffer);
e2fd5b5f 177}
178
b5ecfcf0 179=head2 $self->daemon_fork()
526b698a 180
181Performs the first part of daemon initialisation. Specifically,
182forking. STDERR, etc are still connected to a terminal.
183
184=cut
185
186sub daemon_fork {
187 require POSIX;
188 fork && exit;
189}
190
b5ecfcf0 191=head2 $self->daemon_detach( )
526b698a 192
193Performs the second part of daemon initialisation. Specifically,
194disassociates from the terminal.
195
196However, this does B<not> change the current working directory to "/",
197as normal daemons do. It also does not close all open file
198descriptors (except STDIN, STDOUT and STDERR, which are re-opened from
199F</dev/null>).
200
201=cut
202
203sub daemon_detach {
204 my $self = shift;
205 print "FastCGI daemon started (pid $$)\n";
b5ecfcf0 206 open STDIN, "+</dev/null" or die $!;
207 open STDOUT, ">&STDIN" or die $!;
208 open STDERR, ">&STDIN" or die $!;
526b698a 209 POSIX::setsid();
210}
211
c46dd4e8 212=head2 $self->_fix_env( $env )
213
214Adjusts the environment variables when necessary.
215
216=cut
217
218sub _fix_env
219{
220 my $self = shift;
221 my $env = shift;
222
b0ad47c1 223 # we are gonna add variables from current system environment %ENV to %env
0c913601 224 # that contains at this moment just variables taken from FastCGI request
225 foreach my $k (keys(%ENV)) {
226 $env->{$k} = $ENV{$k} unless defined($env->{$k});
227 }
228
c46dd4e8 229 return unless ( $env->{SERVER_SOFTWARE} );
230
231 # If we're running under Lighttpd, swap PATH_INFO and SCRIPT_NAME
232 # http://lists.scsys.co.uk/pipermail/catalyst/2006-June/008361.html
233 # Thanks to Mark Blythe for this fix
234 if ( $env->{SERVER_SOFTWARE} =~ /lighttpd/ ) {
235 $env->{PATH_INFO} ||= delete $env->{SCRIPT_NAME};
236 }
5351e13d 237 # Fix the environment variables PATH_INFO and SCRIPT_NAME when running
238 # under IIS
52c5e714 239 # FIXME - How does this handle %7F?
63630a22 240 elsif ( $env->{SERVER_SOFTWARE} =~ /IIS\/[6-9]\.[0-9]/ ) {
c46dd4e8 241 my @script_name = split(m!/!, $env->{PATH_INFO});
242 my @path_translated = split(m!/|\\\\?!, $env->{PATH_TRANSLATED});
243 my @path_info;
244
245 while ($script_name[$#script_name] eq $path_translated[$#path_translated]) {
246 pop(@path_translated);
247 unshift(@path_info, pop(@script_name));
248 }
249
250 unshift(@path_info, '', '');
251
252 $env->{PATH_INFO} = join('/', @path_info);
253 $env->{SCRIPT_NAME} = join('/', @script_name);
254 }
255}
256
198b0efa 2571;
258__END__
259
198b0efa 260=head1 WEB SERVER CONFIGURATIONS
261
d7d72ad9 262=head2 Standalone FastCGI Server
263
b0ad47c1 264In server mode the application runs as a standalone server and accepts
d7d72ad9 265connections from a web server. The application can be on the same machine as
266the web server, on a remote machine, or even on multiple remote machines.
267Advantages of this method include running the Catalyst application as a
268different user than the web server, and the ability to set up a scalable
269server farm.
198b0efa 270
d7d72ad9 271To start your application in server mode, install the FCGI::ProcManager
272module and then use the included fastcgi.pl script.
198b0efa 273
d7d72ad9 274 $ script/myapp_fastcgi.pl -l /tmp/myapp.socket -n 5
b0ad47c1 275
d7d72ad9 276Command line options for fastcgi.pl include:
277
278 -d -daemon Daemonize the server.
279 -p -pidfile Write a pidfile with the pid of the process manager.
280 -l -listen Listen on a socket path, hostname:port, or :port.
281 -n -nproc The number of processes started to handle requests.
b0ad47c1 282
d7d72ad9 283See below for the specific web server configurations for using the external
284server.
198b0efa 285
d7d72ad9 286=head2 Apache 1.x, 2.x
287
288Apache requires the mod_fastcgi module. The same module supports both
289Apache 1 and 2.
290
b0ad47c1 291There are three ways to run your application under FastCGI on Apache: server,
d7d72ad9 292static, and dynamic.
293
294=head3 Standalone server mode
295
3f0911d3 296 FastCgiExternalServer /tmp/myapp.fcgi -socket /tmp/myapp.socket
297 Alias /myapp/ /tmp/myapp/myapp.fcgi/
b0ad47c1 298
d7d72ad9 299 # Or, run at the root
3f0911d3 300 Alias / /tmp/myapp.fcgi/
b0ad47c1 301
d7d72ad9 302 # Optionally, rewrite the path when accessed without a trailing slash
303 RewriteRule ^/myapp$ myapp/ [R]
b0ad47c1 304
3f0911d3 305
306The FastCgiExternalServer directive tells Apache that when serving
307/tmp/myapp to use the FastCGI application listenting on the socket
303c087d 308/tmp/mapp.socket. Note that /tmp/myapp.fcgi B<MUST NOT> exist --
3f0911d3 309it's a virtual file name. With some versions of C<mod_fastcgi> or
303c087d 310C<mod_fcgid>, you can use any name you like, but some require that the
3f0911d3 311virtual filename end in C<.fcgi>.
d7d72ad9 312
b0ad47c1 313It's likely that Apache is not configured to serve files in /tmp, so the
d7d72ad9 314Alias directive maps the url path /myapp/ to the (virtual) file that runs the
315FastCGI application. The trailing slashes are important as their use will
316correctly set the PATH_INFO environment variable used by Catalyst to
317determine the request path. If you would like to be able to access your app
318without a trailing slash (http://server/myapp), you can use the above
319RewriteRule directive.
320
321=head3 Static mode
322
323The term 'static' is misleading, but in static mode Apache uses its own
324FastCGI Process Manager to start the application processes. This happens at
325Apache startup time. In this case you do not run your application's
326fastcgi.pl script -- that is done by Apache. Apache then maps URIs to the
327FastCGI script to run your application.
328
329 FastCgiServer /path/to/myapp/script/myapp_fastcgi.pl -processes 3
330 Alias /myapp/ /path/to/myapp/script/myapp_fastcgi.pl/
b0ad47c1 331
d7d72ad9 332FastCgiServer tells Apache to start three processes of your application at
333startup. The Alias command maps a path to the FastCGI application. Again,
334the trailing slashes are important.
b0ad47c1 335
d7d72ad9 336=head3 Dynamic mode
337
b0ad47c1 338In FastCGI dynamic mode, Apache will run your application on demand,
d7d72ad9 339typically by requesting a file with a specific extension (e.g. .fcgi). ISPs
340often use this type of setup to provide FastCGI support to many customers.
341
342In this mode it is often enough to place or link your *_fastcgi.pl script in
343your cgi-bin directory with the extension of .fcgi. In dynamic mode Apache
344must be able to run your application as a CGI script so ExecCGI must be
345enabled for the directory.
346
347 AddHandler fastcgi-script .fcgi
348
349The above tells Apache to run any .fcgi file as a FastCGI application.
350
351Here is a complete example:
352
353 <VirtualHost *:80>
354 ServerName www.myapp.com
355 DocumentRoot /path/to/MyApp
356
357 # Allow CGI script to run
358 <Directory /path/to/MyApp>
359 Options +ExecCGI
360 </Directory>
361
362 # Tell Apache this is a FastCGI application
363 <Files myapp_fastcgi.pl>
364 SetHandler fastcgi-script
365 </Files>
198b0efa 366 </VirtualHost>
d7d72ad9 367
368Then a request for /script/myapp_fastcgi.pl will run the
369application.
b0ad47c1 370
198b0efa 371For more information on using FastCGI under Apache, visit
372L<http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html>
373
25f55123 374=head3 Authorization header with mod_fastcgi or mod_cgi
375
376By default, mod_fastcgi/mod_cgi do not pass along the Authorization header,
377so modules like C<Catalyst::Plugin::Authentication::Credential::HTTP> will
378not work. To enable pass-through of this header, add the following
379mod_rewrite directives:
380
381 RewriteCond %{HTTP:Authorization} ^(.+)
382 RewriteRule ^(.*)$ $1 [E=HTTP_AUTHORIZATION:%1,PT]
383
198b0efa 384=head2 Lighttpd
385
d7d72ad9 386These configurations were tested with Lighttpd 1.4.7.
387
388=head3 Standalone server mode
389
390 server.document-root = "/var/www/MyApp/root"
391
392 fastcgi.server = (
393 "" => (
394 "MyApp" => (
395 "socket" => "/tmp/myapp.socket",
396 "check-local" => "disable"
397 )
398 )
399 )
400
401=head3 Static mode
198b0efa 402
403 server.document-root = "/var/www/MyApp/root"
b0ad47c1 404
198b0efa 405 fastcgi.server = (
406 "" => (
407 "MyApp" => (
408 "socket" => "/tmp/myapp.socket",
409 "check-local" => "disable",
410 "bin-path" => "/var/www/MyApp/script/myapp_fastcgi.pl",
411 "min-procs" => 2,
412 "max-procs" => 5,
413 "idle-timeout" => 20
414 )
415 )
416 )
b0ad47c1 417
d7d72ad9 418Note that in newer versions of lighttpd, the min-procs and idle-timeout
419values are disabled. The above example would start 5 processes.
25810c41 420
d7d72ad9 421=head3 Non-root configuration
b0ad47c1 422
d7d72ad9 423You can also run your application at any non-root location with either of the
2f381252 424above modes. Note the required mod_rewrite rule.
198b0efa 425
2f381252 426 url.rewrite = ( "myapp\$" => "myapp/" )
198b0efa 427 fastcgi.server = (
d7d72ad9 428 "/myapp" => (
198b0efa 429 "MyApp" => (
d7d72ad9 430 # same as above
198b0efa 431 )
432 )
433 )
434
435For more information on using FastCGI under Lighttpd, visit
436L<http://www.lighttpd.net/documentation/fastcgi.html>
437
5351e13d 438=head2 nginx
439
440Catalyst runs under nginx via FastCGI in a similar fashion as the lighttpd
441standalone server as described above.
442
443nginx does not have its own internal FastCGI process manager, so you must run
444the FastCGI service separately.
445
446=head3 Configuration
447
448To configure nginx, you must configure the FastCGI parameters and also the
449socket your FastCGI daemon is listening on. It can be either a TCP socket
450or a Unix file socket.
451
452The server configuration block should look roughly like:
453
454 server {
455 listen $port;
456
457 location / {
64edd9df 458 fastcgi_param QUERY_STRING $query_string;
459 fastcgi_param REQUEST_METHOD $request_method;
460 fastcgi_param CONTENT_TYPE $content_type;
461 fastcgi_param CONTENT_LENGTH $content_length;
462
463 fastcgi_param PATH_INFO $fastcgi_script_name;
464 fastcgi_param SCRIPT_NAME $fastcgi_script_name;
465 fastcgi_param REQUEST_URI $request_uri;
466 fastcgi_param DOCUMENT_URI $document_uri;
467 fastcgi_param DOCUMENT_ROOT $document_root;
468 fastcgi_param SERVER_PROTOCOL $server_protocol;
5351e13d 469
470 fastcgi_param GATEWAY_INTERFACE CGI/1.1;
64edd9df 471 fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
5351e13d 472
64edd9df 473 fastcgi_param REMOTE_ADDR $remote_addr;
474 fastcgi_param REMOTE_PORT $remote_port;
475 fastcgi_param SERVER_ADDR $server_addr;
476 fastcgi_param SERVER_PORT $server_port;
477 fastcgi_param SERVER_NAME $server_name;
5351e13d 478
479 # Adjust the socket for your applications!
480 fastcgi_pass unix:$docroot/myapp.socket;
481 }
482 }
483
484It is the standard convention of nginx to include the fastcgi_params in a
485separate file (usually something like C</etc/nginx/fastcgi_params>) and
486simply include that file.
487
488=head3 Non-root configuration
489
490If you properly specify the PATH_INFO and SCRIPT_NAME parameters your
491application will be accessible at any path. The SCRIPT_NAME variable is the
492prefix of your application, and PATH_INFO would be everything in addition.
493
494As an example, if your application is rooted at /myapp, you would configure:
495
496 fastcgi_param PATH_INFO /myapp/;
497 fastcgi_param SCRIPT_NAME $fastcgi_script_name;
498
499C<$fastcgi_script_name> would be "/myapp/path/of/the/action". Catalyst will
500process this accordingly and setup the application base as expected.
501
502This behavior is somewhat different than Apache and Lighttpd, but is still
503functional.
504
505For more information on nginx, visit:
506L<http://nginx.net>
507
da7aac2e 508=head2 Microsoft IIS
198b0efa 509
b0ad47c1 510It is possible to run Catalyst under IIS with FastCGI, but only on IIS 6.0
da7aac2e 511(Microsoft Windows 2003), IIS 7.0 (Microsoft Windows 2008 and Vista) and
512hopefully its successors.
513
b0ad47c1 514Even if it is declared that FastCGI is supported on IIS 5.1 (Windows XP) it
da7aac2e 515does not support some features (specifically: wildcard mappings) that prevents
516running Catalyst application.
517
518Let us assume that our server has the following layout:
519
520 d:\WWW\WebApp\ path to our Catalyst application
521 d:\strawberry\perl\bin\perl.exe path to perl interpreter (with Catalyst installed)
522 c:\windows Windows directory
523
524=head3 Setup IIS 6.0 (Windows 2003)
525
4a6f54df 526=over 4
527
528=item Install FastCGI extension for IIS 6.0
da7aac2e 529
530FastCGI is not a standard part of IIS 6 - you have to install it separately. For
531more info and download go to L<http://www.iis.net/extensions/FastCGI>. Choose
b0ad47c1 532approptiate version (32-bit/64-bit), installation is quite simple
da7aac2e 533(in fact no questions, no options).
534
4a6f54df 535=item Create a new website
da7aac2e 536
b0ad47c1 537Open "Control Panel" > "Administrative Tools" > "Internet Information Services Manager".
da7aac2e 538Click "Action" > "New" > "Web Site". After you finish the installation wizard
b0ad47c1 539you need to go to the new website's properties.
da7aac2e 540
4a6f54df 541=item Set website properties
da7aac2e 542
b0ad47c1 543On tab "Web site" set proper values for:
da7aac2e 544Site Description, IP Address, TCP Port, SSL Port etc.
545
546On tab "Home Directory" set the following:
547
548 Local path: "d:\WWW\WebApp\root"
549 Local path permission flags: check only "Read" + "Log visits"
550 Execute permitions: "Scripts only"
551
b0ad47c1 552Click "Configuration" button (still on Home Directory tab) then click "Insert"
da7aac2e 553the wildcard application mapping and in the next dialog set:
554
555 Executable: "c:\windows\system32\inetsrv\fcgiext.dll"
556 Uncheck: "Verify that file exists"
557
558Close all dialogs with "OK".
559
4a6f54df 560=item Edit fcgiext.ini
da7aac2e 561
b0ad47c1 562Put the following lines into c:\windows\system32\inetsrv\fcgiext.ini (on 64-bit
da7aac2e 563system c:\windows\syswow64\inetsrv\fcgiext.ini):
564
565 [Types]
566 *:8=CatalystApp
567 ;replace 8 with the identification number of the newly created website
568 ;it is not so easy to get this number:
569 ; - you can use utility "c:\inetpub\adminscripts\adsutil.vbs"
570 ; to list websites: "cscript adsutil.vbs ENUM /P /W3SVC"
571 ; to get site name: "cscript adsutil.vbs GET /W3SVC/<number>/ServerComment"
572 ; to get all details: "cscript adsutil.vbs GET /W3SVC/<number>"
b0ad47c1 573 ; - or look where are the logs located:
574 ; c:\WINDOWS\SYSTEM32\Logfiles\W3SVC7\whatever.log
da7aac2e 575 ; means that the corresponding number is "7"
b0ad47c1 576 ;if you are running just one website using FastCGI you can use '*=CatalystApp'
da7aac2e 577
578 [CatalystApp]
579 ExePath=d:\strawberry\perl\bin\perl.exe
580 Arguments="d:\WWW\WebApp\script\webapp_fastcgi.pl -e"
581
b0ad47c1 582 ;by setting this you can instruct IIS to serve Catalyst static files
da7aac2e 583 ;directly not via FastCGI (in case of any problems try 1)
584 IgnoreExistingFiles=0
b0ad47c1 585
da7aac2e 586 ;do not be fooled by Microsoft doc talking about "IgnoreExistingDirectories"
587 ;that does not work and use "IgnoreDirectories" instead
588 IgnoreDirectories=1
589
4a6f54df 590=back
591
da7aac2e 592=head3 Setup IIS 7.0 (Windows 2008 and Vista)
593
594Microsoft IIS 7.0 has built-in support for FastCGI so you do not have to install
595any addons.
596
4a6f54df 597=over 4
598
599=item Necessary steps during IIS7 installation
da7aac2e 600
601During IIS7 installation after you have added role "Web Server (IIS)"
b0ad47c1 602you need to check to install role feature "CGI" (do not be nervous that it is
603not FastCGI). If you already have IIS7 installed you can add "CGI" role feature
604through "Control panel" > "Programs and Features".
da7aac2e 605
4a6f54df 606=item Create a new website
da7aac2e 607
b0ad47c1 608Open "Control Panel" > "Administrative Tools" > "Internet Information Services Manager"
da7aac2e 609> "Add Web Site".
610
611 site name: "CatalystSite"
b0ad47c1 612 content directory: "d:\WWW\WebApp\root"
da7aac2e 613 binding: set proper IP address, port etc.
614
4a6f54df 615=item Configure FastCGI
da7aac2e 616
b0ad47c1 617You can configure FastCGI extension using commandline utility
da7aac2e 618"c:\windows\system32\inetsrv\appcmd.exe"
619
4a6f54df 620=over 4
621
622=item Configuring section "fastCgi" (it is a global setting)
da7aac2e 623
4a6f54df 624 appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='d:\strawberry\perl\bin\perl.exe',arguments='d:\www\WebApp\script\webapp_fastcgi.pl -e',maxInstances='4',idleTimeout='300',activityTimeout='30',requestTimeout='90',instanceMaxRequests='1000',protocol='NamedPipe',flushNamedPipe='False']" /commit:apphost
da7aac2e 625
4a6f54df 626=item Configuring proper handler (it is a site related setting)
da7aac2e 627
4a6f54df 628 appcmd.exe set config "CatalystSite" -section:system.webServer/handlers /+"[name='CatalystFastCGI',path='*',verb='GET,HEAD,POST',modules='FastCgiModule',scriptProcessor='d:\strawberry\perl\bin\perl.exe|d:\www\WebApp\script\webapp_fastcgi.pl -e',resourceType='Unspecified',requireAccess='Script']" /commit:apphost
da7aac2e 629
b0ad47c1 630Note: before launching the commands above do not forget to change site
da7aac2e 631name and paths to values relevant for your server setup.
198b0efa 632
4a6f54df 633=back
634
635=back
636
fbcc39ad 637=head1 SEE ALSO
e2fd5b5f 638
fbcc39ad 639L<Catalyst>, L<FCGI>.
cd3bb248 640
fbcc39ad 641=head1 AUTHORS
ffb41d94 642
2f381252 643Catalyst Contributors, see Catalyst.pm
ffb41d94 644
d7d72ad9 645=head1 THANKS
646
647Bill Moseley, for documentation updates and testing.
648
ffb41d94 649=head1 COPYRIGHT
650
536bee89 651This library is free software. You can redistribute it and/or modify it under
ffb41d94 652the same terms as Perl itself.
653
654=cut