Annotation of embedaddon/lighttpd/doc/outdated/fastcgi.txt, revision 1.1.1.1
1.1 misho 1: =====================
2: the FastCGI Interface
3: =====================
4:
5: -------------------
6: Module: mod_fastcgi
7: -------------------
8:
9: :Author: Jan Kneschke
10: :Date: $Date: 2004/11/03 22:26:05 $
11: :Revision: $Revision: 1.3 $
12:
13: :abstract:
14: The FastCGI interface is the fastest and most secure way
15: to interface external process-handlers like Perl, PHP and
16: your self-written applications.
17:
18: .. meta::
19: :keywords: lighttpd, FastCGI
20:
21: .. contents:: Table of Contents
22:
23: Description
24: ===========
25:
26: lighttpd provides an interface to a external programs that
27: support the FastCGI interface. The FastCGI Interface is
28: defined by http://www.fastcgi.com/ and is a
29: platform-independent and server independent interface between
30: a web-application and a webserver.
31:
32: This means that FastCGI programs that run with the Apache
33: Webserver will run seamlessly with lighttpd and vice versa.
34:
35:
36: FastCGI
37: -------
38:
39: FastCGI is removes a lot of the limitations of CGI programs.
40: CGI programs have the problem that they have to be restarted
41: by the webserver for every request which leads to really bad
42: performance values.
43:
44: FastCGI removes this limitation by keeping the process running
45: and handling the requests by this always running process. This
46: removes the time used for the fork() and the overall startup
47: and cleanup time which is necessary to create and destroy a
48: process.
49:
50: While CGI programs communicate to the server over pipes,
51: FastCGI processes use Unix-Domain-Sockets or TCP/IP to talk
52: with the webserver. This gives you the second advantage over
53: simple CGI programs: FastCGI don't have to run on the Webserver
54: itself but everywhere in the network.
55:
56: lighttpd takes it a little bit further by providing a internal
57: FastCGI load-balancer which can be used to balance the load
58: over multiple FastCGI Servers. In contrast to other solutions
59: only the FastCGI process has to be on the cluster and not the
60: whole webserver. That gives the FastCGI process more resources
61: than a e.g. load-balancer+apache+mod_php solution.
62:
63: If you compare FastCGI against a apache+mod_php solution you
64: should note that FastCGI provides additional security as the
65: FastCGI process can be run under different permissions that
66: the webserver and can also live a chroot which might be
67: different than the one the webserver is running in.
68:
69: Options
70: =======
71:
72: lighttpd provides the FastCGI support via the fastcgi-module
73: (mod_fastcgi) which provides 2 options in the config-file:
74:
75: fastcgi.debug
76: a value between 0 and 65535 to set the debug-level in the
77: FastCGI module. Currently only 0 and 1 are used. Use 1 to
78: enable some debug output, 0 to disable it.
79:
80: fastcgi.map-extensions
81: map multiple extensions to the same fastcgi server
82:
83: Example: ::
84:
85: fastcgi.map-extensions = ( ".php3" => ".php" )
86:
87: fastcgi.server
88: tell the module where to send FastCGI requests to. Every
89: file-extension can have it own handler. Load-Balancing is
90: done by specifying multiple handles for the same extension.
91:
92: structure of fastcgi.server section: ::
93:
94: ( <extension> =>
95: (
96: ( "host" => <string> ,
97: "port" => <integer> ,
98: "socket" => <string>, # either socket
99: # or host+port
100: "bin-path" => <string>, # OPTIONAL
101: "bin-environment" => <array>, # OPTIONAL
102: "bin-copy-environment" => <array>, # OPTIONAL
103: "mode" => <string>, # OPTIONAL
104: "docroot" => <string> , # OPTIONAL if "mode"
105: # is not "authorizer"
106: "check-local" => <string>, # OPTIONAL
107: "max-procs" => <integer>, # OPTIONAL
108: "broken-scriptfilename" => <boolean>, # OPTIONAL
109: "disable-time" => <integer>, # optional
110: "allow-x-send-file" => <boolean>, # optional
111: "kill-signal" => <integer>, # OPTIONAL
112: "fix-root-scriptname" => <boolean>,
113: # OPTIONAL
114: ( "host" => ...
115: )
116: )
117: )
118:
119: :<extension>: is the file-extension or prefix
120: (if started with "/")
121: :"host": is hostname/ip of the FastCGI process
122: :"port": is tcp-port on the "host" used by the FastCGI
123: process
124: :"bin-path": path to the local FastCGI binary which should be
125: started if no local FastCGI is running
126: :"socket": path to the unix-domain socket
127: :"mode": is the FastCGI protocol mode.
128: Default is "responder", also "authorizer"
129: mode is implemented.
130: :"docroot": is optional and is the docroot on the remote
131: host for default "responder" mode. For
132: "authorizer" mode it is MANDATORY and it points
133: to docroot for authorized requests. For security
134: reasons it is recommended to keep this docroot
135: outside of server.document-root tree.
136: :"check-local": is optional and may be "enable" (default) or
137: "disable". If enabled the server first check
138: for a file in local server.document-root tree
139: and return 404 (Not Found) if no such file.
140: If disabled, the server forward request to
141: FastCGI interface without this check.
142: :"broken-scriptfilename": breaks SCRIPT_FILENAME in a wat that
143: PHP can extract PATH_INFO from it (default: disabled)
144: :"disable-time": time to wait before a disabled backend is checked
145: again
146: :"allow-x-send-file": controls if X-LIGHTTPD-send-file headers
147: are allowed
148: :"fix-root-scriptname": fix broken path-info split for "/" extension ("prefix")
149:
150: If bin-path is set:
151:
152: :"max-procs": the upper limit of the processess to start
153: :"bin-environment": put an entry into the environment of
154: the started process
155: :"bin-copy-environement": clean up the environment and copy
156: only the specified entries into the fresh
157: environment of the spawn process
158: :"kill-signal": signal to terminate the FastCGI process with,
159: defauls to SIGTERM
160:
161: Examples
162: --------
163:
164: Multiple extensions for the same host ::
165:
166: fastcgi.server = ( ".php" =>
167: (( "host" => "127.0.0.1",
168: "port" => 1026,
169: "bin-path" => "/usr/local/bin/php"
170: )),
171: ".php4" =>
172: (( "host" => "127.0.0.1",
173: "port" => 1026
174: ))
175: )
176:
177: Example with prefix: ::
178:
179: fastcgi.server = ( "/remote_scripts/" =>
180: (( "host" => "192.168.0.3",
181: "port" => 9000,
182: "check-local" => "disable",
183: "docroot" => "/" # remote server may use
184: # it's own docroot
185: ))
186: )
187:
188: The request `http://my.host.com/remote_scripts/test.cgi` will
189: be forwarded to fastcgi server at 192.168.0.3 and the value
190: "/remote_scripts/test.cgi" will be used for the SCRIPT_NAME
191: variable. Remote server may prepend it with its own
192: document root. The handling of index files is also the
193: resposibility of remote server for this case.
194:
195: In the case that the prefix is not terminated with a slash
196: the prefix will be handled as file and /test.cgi would become
197: a PATH_INFO instead of part of SCRIPT_NAME.
198:
199:
200: Example for "authorizer" mode: ::
201:
202: fastcgi.server = ( "/remote_scripts/" =>
203: (( "host" => "10.0.0.2",
204: "port" => 9000,
205: "docroot" => "/path_to_private_docs",
206: "mode" => "authorizer"
207: ))
208: )
209:
210: Note that if "docroot" is specified then its value will be
211: used in DOCUMENT_ROOT and SCRIPT_FILENAME variables passed
212: to FastCGI server.
213:
214: Load-Balancing
215: ==============
216:
217: The FastCGI plugin provides automaticly a load-balancing between
218: multiple FastCGI servers. ::
219:
220: fastcgi.server = ( ".php" =>
221: (( "host" => "10.0.0.2", "port" => 1030 ),
222: ( "host" => "10.0.0.3", "port" => 1030 ))
223: )
224:
225:
226: To understand how the load-balancing works you can enable the
227: fastcgi.debug option and will get a similar output as here: ::
228:
229: proc: 127.0.0.1 1031 1 1 1 31454
230: proc: 127.0.0.1 1028 1 1 1 31442
231: proc: 127.0.0.1 1030 1 1 1 31449
232: proc: 127.0.0.1 1029 1 1 2 31447
233: proc: 127.0.0.1 1026 1 1 2 31438
234: got proc: 34 31454
235: release proc: 40 31438
236: proc: 127.0.0.1 1026 1 1 1 31438
237: proc: 127.0.0.1 1028 1 1 1 31442
238: proc: 127.0.0.1 1030 1 1 1 31449
239: proc: 127.0.0.1 1031 1 1 2 31454
240: proc: 127.0.0.1 1029 1 1 2 31447
241:
242: Even if this for multiple FastCGI children on the local machine
243: the following explaination is valid for remote connections too.
244:
245: The output shows:
246:
247: - IP, port, unix-socket (is empty here)
248: - is-local, state (0 - unset, 1 - running, ... )
249: - active connections (load)
250: - PID
251:
252: As you can see the list is always sorted by the load field.
253:
254: Whenever a new connection is requested, the first entry (the one
255: with the lowest load) is selected, the load is increased (got proc: ...)
256: and the list is sorted again.
257:
258: If a FastCGI request is done or the connection is dropped, the load on the
259: FastCGI proc decreases and the list is sorted again (release proc: ...)
260:
261: This behaviour is very light-weight in code and still very efficient
262: as it keeps the fastcgi-servers equally loaded even if they have different
263: CPUs.
264:
265: Adaptive Process Spawning
266: =========================
267:
268: .. note:: This feature is disabled in 1.3.14 again. min-procs is
269: ignored in that release
270:
271: Starting with 1.3.8 lighttpd can spawn processes on demand if
272: a bin-path is specified and the FastCGI process runs locally.
273:
274: If you want to have a least one FastCGI process running and
275: more of the number of requests increases you can use min-procs
276: and max-procs.
277:
278: A new process is spawned as soon as the average number of
279: requests waiting to be handle by a single process increases the
280: max-load-per-proc setting.
281:
282: The idle-timeout specifies how long a fastcgi-process should wait
283: for a new request before it kills itself.
284:
285: Example
286: -------
287: ::
288:
289: fastcgi.server = ( ".php" =>
290: (( "socket" => "/tmp/php.socket",
291: "bin-path" => "/usr/local/bin/php",
292: "min-procs" => 1,
293: "max-procs" => 32,
294: "max-load-per-proc" => 4,
295: "idle-timeout" => 20
296: ))
297: )
298:
299: Disabling Adaptive Spawning
300: ---------------------------
301:
302: Adaptive Spawning is a quite new feature and it might misbehave
303: for your setup. There are several ways to control how the spawing
304: is done:
305:
306: 1. ``"max-load-per-proc" => 1``
307: if that works for you, great.
308:
309: 2. If not set ``min-procs == max-procs``.
310:
311: 3. For PHP you can also use: ::
312:
313: $ PHP_FCGI_CHILDREN=384 ./lighttpd -f ./lighttpd.conf
314:
315: fastcgi.server = ( ".php" =>
316: (( "socket" => "/tmp/php.socket",
317: "bin-path" => "/usr/local/bin/php",
318: "min-procs" => 1,
319: "max-procs" => 1,
320: "max-load-per-proc" => 4,
321: "idle-timeout" => 20
322: ))
323: )
324:
325: It will create one socket and let's PHP create the 384 processes itself.
326:
327: 4. If you don't want lighttpd to manage the fastcgi processes, remove the
328: bin-path and use spawn-fcgi to spawn them itself.
329:
330:
331: FastCGI and Programming Languages
332: =================================
333:
334: Preparing PHP as a FastCGI program
335: ----------------------------------
336:
337: One of the most important application that has a FastCGI
338: interface is php which can be downloaded from
339: http://www.php.net/ . You have to recompile the php from
340: source to enable the FastCGI interface as it is normally
341: not enabled by default in the distributions.
342:
343: If you already have a working installation of PHP on a
344: webserver execute a small script which just contains ::
345:
346: <?php phpinfo(); ?>
347:
348: and search for the line in that contains the configure call.
349: You can use it as the base for the compilation.
350:
351: You have to remove all occurences of `--with-apxs`, `--with-apxs2`
352: and the like which would build PHP with Apache support. Add the
353: next three switches to compile PHP with FastCGI support::
354:
355: $ ./configure \
356: --enable-fastcgi \
357: --enable-force-cgi-redirect \
358: ...
359:
360: After compilation and installation check that your PHP
361: binary contains FastCGI support by calling: ::
362:
363: $ php -v
364: PHP 4.3.3RC2-dev (cgi-fcgi) (built: Oct 19 2003 23:19:17)
365:
366: The important part is the (cgi-fcgi).
367:
368:
369: Starting a FastCGI-PHP
370: ----------------------
371:
372: Starting with version 1.3.6 lighttpd can spawn the FastCGI
373: processes locally itself if necessary: ::
374:
375: fastcgi.server = ( ".php" =>
376: (( "socket" => "/tmp/php-fastcgi.socket",
377: "bin-path" => "/usr/local/bin/php"
378: ))
379: )
380:
381: PHP provides 2 special environment variables which control the number of
382: spawned workes under the control of a single watching process
383: (PHP_FCGI_CHILDREN) and the number of requests what a single worker
384: handles before it kills itself. ::
385:
386: fastcgi.server = ( ".php" =>
387: (( "socket" => "/tmp/php-fastcgi.socket",
388: "bin-path" => "/usr/local/bin/php",
389: "bin-environment" => (
390: "PHP_FCGI_CHILDREN" => "16",
391: "PHP_FCGI_MAX_REQUESTS" => "10000"
392: )
393: ))
394: )
395:
396: To increase the security of the started process you should only pass
397: the necessary environment variables to the FastCGI process. ::
398:
399: fastcgi.server = ( ".php" =>
400: (( "socket" => "/tmp/php-fastcgi.socket",
401: "bin-path" => "/usr/local/bin/php",
402: "bin-environment" => (
403: "PHP_FCGI_CHILDREN" => "16",
404: "PHP_FCGI_MAX_REQUESTS" => "10000" ),
405: "bin-copy-environment" => (
406: "PATH", "SHELL", "USER" )
407: ))
408: )
409:
410: Configuring PHP
411: ---------------
412:
413: If you want to use PATH_INFO and PHP_SELF in you PHP scripts you have to
414: configure php and lighttpd. The php.ini needs the option: ::
415:
416: cgi.fix_pathinfo = 1
417:
418: and the option ``broken-scriptfilename`` in your fastcgi.server config: ::
419:
420: fastcgi.server = ( ".php" =>
421: (( "socket" => "/tmp/php-fastcgi.socket",
422: "bin-path" => "/usr/local/bin/php",
423: "bin-environment" => (
424: "PHP_FCGI_CHILDREN" => "16",
425: "PHP_FCGI_MAX_REQUESTS" => "10000" ),
426: "bin-copy-environment" => (
427: "PATH", "SHELL", "USER" ),
428: "broken-scriptfilename" => "enable"
429: ))
430: )
431:
432: Why this ? the ``cgi.fix_pathinfo = 0`` would give you a working ``PATH_INFO``
433: but no ``PHP_SELF``. If you enable it, it turns around. To fix the
434: ``PATH_INFO`` `--enable-discard-path` needs a SCRIPT_FILENAME which is against the CGI spec, a
435: broken-scriptfilename. With ``cgi.fix_pathinfo = 1`` in php.ini and
436: ``broken-scriptfilename => "enable"`` you get both.
437:
438:
439: External Spawning
440: -----------------
441:
442: Spawning FastCGI processes directly in the webserver has some
443: disadvantages like
444:
445: - FastCGI process can only run locally
446: - has the same permissions as the webserver
447: - has the same base-dir as the webserver
448:
449: As soon as you are using a seperate FastCGI Server to
450: take off some load from the webserver you have to control
451: the FastCGI process by a external program like spawn-fcgi.
452:
453: spawn-fcgi is used to start a FastCGI process in its own
454: environment and set the user-id, group-id and change to
455: another root-directory (chroot).
456:
457: For convenience a wrapper script should be used which takes
458: care of all the necessary option. Such a script in included
459: in the lighttpd distribution and is call spawn-php.sh.
460:
461: The script has a set of config variables you should take
462: a look at: ::
463:
464: ## ABSOLUTE path to the spawn-fcgi binary
465: SPAWNFCGI="/usr/local/sbin/spawn-fcgi"
466:
467: ## ABSOLUTE path to the PHP binary
468: FCGIPROGRAM="/usr/local/bin/php"
469:
470: ## bind to tcp-port on localhost
471: FCGIPORT="1026"
472:
473: ## bind to unix domain socket
474: # FCGISOCKET="/tmp/php.sock"
475:
476: ## number of PHP childs to spawn
477: PHP_FCGI_CHILDREN=10
478:
479: ## number of request server by a single php-process until
480: ## is will be restarted
481: PHP_FCGI_MAX_REQUESTS=1000
482:
483: ## IP adresses where PHP should access server connections
484: ## from
485: FCGI_WEB_SERVER_ADDRS="127.0.0.1,192.168.0.1"
486:
487: # allowed environment variables sperated by spaces
488: ALLOWED_ENV="ORACLE_HOME PATH USER"
489:
490: ## if this script is run as root switch to the following user
491: USERID=wwwrun
492: GROUPID=wwwrun
493:
494: If you have set the variables to values that fit to your
495: setup you can start it by calling: ::
496:
497: $ spawn-php.sh
498: spawn-fcgi.c.136: child spawned successfully: PID: 6925
499:
500: If you get "child spawned successfully: PID:" the php
501: processes could be started successfully. You should see them
502: in your processlist: ::
503:
504: $ ps ax | grep php
505: 6925 ? S 0:00 /usr/local/bin/php
506: 6928 ? S 0:00 /usr/local/bin/php
507: ...
508:
509: The number of processes should be PHP_FCGI_CHILDREN + 1.
510: Here the process 6925 is the master of the slaves which
511: handle the work in parallel. Number of parallel workers can
512: be set by PHP_FCGI_CHILDREN. A worker dies automaticly of
513: handling PHP_FCGI_MAX_REQUESTS requests as PHP might have
514: memory leaks.
515:
516: If you start the script as user root php processes will be
517: running as the user USERID and group GROUPID to drop the
518: root permissions. Otherwise the php processes will run as
519: the user you started script as.
520:
521: As the script might be started from a unknown stage or even
522: directly from the command-line it cleans the environment
523: before starting the processes. ALLOWED_ENV contains all
524: the external environement variables that should be available
525: to the php-process.
526:
527:
528: Perl
529: ----
530:
531: For Perl you have to install the FCGI module from CPAN.
532:
533: Skeleton for remote authorizer
534: ==============================
535:
536: The basic functionality of authorizer is as follows (see
537: http://www.fastcgi.com/devkit/doc/fcgi-spec.html, 6.3 for
538: details). ::
539:
540: #include <fcgi_stdio.h>
541: #include <stdlib.h>
542: #include <unistd.h>
543: int main () {
544: char* p;
545:
546: while (FCGI_Accept() >= 0) {
547: /* wait for fastcgi authorizer request */
548:
549: printf("Content-type: text/html\r\n");
550:
551: if ((p = getenv("QUERY_STRING")) == NULL) ||
552: <QUERY_STRING is unauthorized>)
553: printf("Status: 403 Forbidden\r\n\r\n");
554:
555: else printf("\r\n");
556: /* default Status is 200 - allow access */
557: }
558:
559: return 0;
560: }
561:
562: It is possible to use any other variables provided by
563: FastCGI interface for authorization check. Here is only an
564: example.
565:
566:
567: Troubleshooting
568: ===============
569:
570: fastcgi.debug should be enabled for troubleshooting.
571:
572: If you get: ::
573:
574: (fcgi.c.274) connect delayed: 8
575: (fcgi.c.289) connect succeeded: 8
576: (fcgi.c.745) unexpected end-of-file (perhaps the fastcgi
577: process died): 8
578:
579: the fastcgi process accepted the connection but closed it
580: right away. This happens if FCGI_WEB_SERVER_ADDRS doesn't
581: include the host where you are connection from.
582:
583: If you get ::
584:
585: (fcgi.c.274) connect delayed: 7
586: (fcgi.c.1107) error: unexpected close of fastcgi connection
587: for /peterp/seite1.php (no fastcgi process on host/port ?)
588: (fcgi.c.1015) emergency exit: fastcgi: connection-fd: 5
589: fcgi-fd: 7
590:
591: the fastcgi process is not running on the host/port you are
592: connection to. Check your configuration.
593:
594: If you get ::
595:
596: (fcgi.c.274) connect delayed: 7
597: (fcgi.c.289) connect succeeded: 7
598:
599: everything is fine. The connect() call just was delayed a
600: little bit and is completly normal.
601:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>