e1f5639312f507f0ed07d636db636f7f0930cd47
[catagits/fcgi2.git] / doc / fcgi-devel-kit.htm
1 <html>
2
3 <head>
4 <title>FastCGI Developer's Kit</title>
5 </head>
6
7 <body bgcolor="#FFFFFF" text="#000000" link="#cc0000" alink="#000011" vlink="#555555">
8 <p align="center">
9
10 <img border="0" src="../images/fcgi-hd.gif" alt="[[FastCGI]]"> <br
11 clear="all">
12 </p>
13
14 <h3 align="center">FastCGI Developer's Kit</h3>
15 <!--Copyright (c) 1996 Open Market, Inc.                                    -->
16 <!--See the file "LICENSE.TERMS" for information on usage and redistribution-->
17 <!--of this file, and for a DISCLAIMER OF ALL WARRANTIES.                   -->
18
19 <p align="center">Mark R. Brown<br>
20 Open Market, Inc.<br>
21 </p>
22
23 <p align="center">Document Version: 1.08<br>
24 11 June 1996<br>
25 </p>
26
27 <h5 align="center">Copyright © 1996 Open Market, Inc. 245 First Street, Cambridge, MA
28 02142 U.S.A.<br>
29 Tel: 617-621-9500 Fax: 617-621-1703 URL: <a href="http://www.openmarket.com/">http://www.openmarket.com/</a><br>
30 $Id: fcgi-devel-kit.htm,v 1.3 2001/05/14 12:58:16 robs Exp $ <br>
31 </h5>
32
33 <hr>
34
35 <ul type="square">
36   <li><a HREF="#S1">1. Introduction</a> </li>
37   <li><a HREF="#S2">2. Getting started</a> </li>
38   <li><a HREF="#S3">3. Writing applications</a> <ul type="square">
39       <li><a HREF="#S3.1">3.1 Using the <tt>fcgi_stdio</tt> library</a> </li>
40       <li><a HREF="#S3.2">3.2 Using the <tt>fcgiapp</tt> library</a> </li>
41       <li><a HREF="#S3.3">3.3 Using Perl and Tcl</a> </li>
42       <li><a HREF="#S3.4">3.4 Using Java</a> </li>
43     </ul>
44   </li>
45   <li><a HREF="#S4">4. Running applications</a> <ul type="square">
46       <li><a HREF="#S4.1">4.1 Using a Web server that supports FastCGI</a> </li>
47       <li><a HREF="#S4.2">4.2 Using <tt>cgi-fcgi</tt> with any Web server</a> </li>
48     </ul>
49   </li>
50   <li><a HREF="#S5">5. Known problems</a> </li>
51   <li><a HREF="#S6">6. Getting support</a> </li>
52 </ul>
53
54 <hr>
55
56 <h3><a NAME="S1">1. Introduction</a></h3>
57
58 <p>FastCGI is an open extension to CGI that provides high performance for all Internet
59 applications without the penalties of Web server APIs.</p>
60
61 <p>FastCGI is designed to be layered on top of existing Web server APIs. For instance, the
62 <tt>mod_fastcgi</tt> Apache module adds FastCGI support to the Apache server. FastCGI can
63 also be used, with reduced functionality and reduced performance, on any Web server that
64 supports CGI.</p>
65
66 <p>This FastCGI Developer's Kit is designed to make developing FastCGI applications easy.
67 The kit currently supports FastCGI applications written in C/C++, Perl, Tcl, and Java.</p>
68
69 <p>This document: 
70
71 <ul type="square">
72   <li>Describes how to configure and build the kit for your development platform. </li>
73   <li>Tells how to write applications using the libraries in the kit. </li>
74   <li>Tells how to run applications using Web servers that support FastCGI or using any Web
75     server and <tt>cgi-fcgi</tt>. </li>
76 </ul>
77
78 <p>The kit includes a <a href="fastcgi-whitepaper/fastcgi.htm">technical white paper</a>, <tt>doc/fastcgi-whitepaper/fastcgi.htm</tt>.
79 You should read at least the first three sections of the technical white paper before
80 starting to write FastCGI applications. The <a href="fcgi-perf.htm">performance paper</a>
81 will help you understand how application design affects performance with FastCGI.</p>
82
83 <p>The <a href="fcgi-spec.html">FastCGI Specification</a>, <tt>doc/fcgi-spec.html</tt>,
84 defines the interface between a FastCGI application and a Web server that supports
85 FastCGI. The software in the kit implements the specification. You don't need to read the
86 specification in order to write applications.</p>
87
88 <p>Additional information is provided in the <a
89 href="http://fastcgi.com/docs/FAQ.html">FAQ</a> document, which contains frequently
90 asked questions about application development using FastCGI, as well as some general
91 information.</p>
92
93 <p>Experience with CGI programming will be extremely valuable in writing FastCGI
94 applications. If you don't have enough experience with CGI programming, you should read
95 one of the popular books on the topic or study the <a
96 href="http://hoohoo.ncsa.uiuc.edu/cgi/">NCSA CGI page</a>. For a more formal treatment of
97 CGI/1.1 see the <a
98 href="http://ds.internic.net/internet-drafts/draft-robinson-www-interface-01.txt">Internet
99 Draft CGI 1.1 Specification</a>.</p>
100
101 <h3><a NAME="S2">2. Getting started</a></h3>
102
103 <p>The kit is a compressed tar (tar.Z) file, distributed via the <a
104 href="http://fastcgi.com/">fastcgi.com</a> Web page. Unpacking the
105 tar file creates a new directory <tt>fcgi-devel-kit</tt>.</p>
106
107 <p>Open the kit's index page, <tt>fcgi-devel-kit/index.html</tt>, using the &quot;Open
108 File&quot; command in your Web browser. The index page gives you an overview of the kit
109 structure and helps you navigate the kit. The index page also contains links that run some
110 example applications, but the applications won't work when index.html is opened using the
111 &quot;Open File&quot; command because they aren't aren't being accessed through a Web
112 server.</p>
113
114 <p>In order to use the kit in earnest you'll need a Web server that you control, a Web
115 server running with your user ID. The Web server will be starting FastCGI applications
116 that you will need to debug; this will be a lot more convenient for you if these processes
117 run with your user ID. It is best to have a Web server that supports FastCGI. <a
118 href="#S4">Section 4</a> discusses Web server issues.</p>
119
120 <p>If you can, keep the kit on a file system accessible from your personal workstation, do
121 your builds on your workstation, and run your Web server on your workstation. If that's
122 not possible, arrange a configuration such that the kit is accessible from the machine
123 that's going to run your Web server, and build the kit and your applications on a machine
124 that's configured exactly the same way (same processor architecture, operating system,
125 etc.) as the machine that's going to run your Web server.</p>
126
127 <p>To build the kit you execute this sequence of commands in the <tt>fcgi-devel-kit</tt>
128 directory:</p>
129
130 <pre>
131     % ./configure
132     % make
133 </pre>
134
135 <p>We've built and exercised the kit on these platforms (listed in alphabetical order):
136
137 <ul type="square">
138   <li>BSD/OS 1.1 (Intel Pentium), gcc </li>
139   <li>Digital UNIX V3.2 148 (Alpha), gcc/cc </li>
140   <li>Hewlett-Packard HP-UX A.09.05 C and B.10.01 A (PA-RISC), gcc/cc </li>
141   <li>IBM AIX 1 4 (RS/6000), gcc </li>
142   <li>Silicon Graphics IRIX 5.3 11091812 (MIPS), gcc </li>
143   <li>Sun Solaris 2.4 and 2.5 (SPARC), gcc/cc </li>
144   <li>Sun SunOS 4.1.4 (SPARC), gcc </li>
145 </ul>
146
147 <p>Once you've built the kit, follow the directions in <a href="#S4">Section 4</a> to
148 bring up your Web server and run the example applications.</p>
149
150 <h3><a NAME="S3">3. Writing applications</a></h3>
151
152 <h4><a NAME="S3.1">3.1 Using the <tt>fcgi_stdio</tt> library</a> </h4>
153
154 <p>The <tt>fcgi_stdio</tt> library provides the easiest transition for C CGI programs and
155 C CGI programmers to FastCGI. Using this library your application can run using either CGI
156 or FastCGI, with the same binary for both situations.</p>
157
158 <p>To introduce the <tt>fcgi_stdio</tt> library we give a pair of examples: a tiny CGI
159 program and the translation of this program to FastCGI. These two example programs are
160 included in the kit.</p>
161
162 <p>The CGI program is <tt>examples/tiny-cgi.c</tt>:</p>
163
164 <pre>
165     #include &lt;stdio.h&gt;
166     #include &lt;stdlib.h&gt;
167
168     void main(void)
169     {
170         int count = 0;
171         printf(&quot;Content-type: text/html\r\n&quot;
172                &quot;\r\n&quot;
173                &quot;&lt;title&gt;CGI Hello!&lt;/title&gt;&quot;
174                &quot;&lt;h1&gt;CGI Hello!&lt;/h1&gt;&quot;
175                &quot;Request number %d running on host &lt;i&gt;%s&lt;/i&gt;\n&quot;,
176                ++count, getenv(&quot;SERVER_NAME&quot;));
177     }
178 </pre>
179
180 <p>The key features of this tiny CGI program are:
181
182 <ul type="square">
183   <li>The program sends data to the Web server by writing to <tt>stdout</tt>, using <tt>printf</tt>
184     in this example. The CGI program first sends a <tt>Content-type</tt> header, then a small
185     HTML document. The program includes <tt>stdio.h</tt> in order to get access to the <tt>printf</tt>
186     function.</li>
187   <li>The program obtains parameters provided by the Web server by reading environment
188     variables. The CGI program reads the <tt>SERVER_NAME</tt> variable using <tt>getenv</tt>
189     and includes the value in the HTML document. The program includes <tt>stdlib.h</tt> in
190     order to get access to the <tt>getenv</tt> function.</li>
191 </ul>
192
193 <p>The <tt>count</tt> variable is degenerate in this example; the CGI program runs a
194 single request, so the request number is always one. This variable will be more
195 interesting in the FastCGI example.</p>
196
197 <p><a NAME="S3.1.1">The</a> corresponding FastCGI program is <tt>examples/tiny-fcgi.c</tt>:</p>
198
199 <pre>
200     #include &quot;fcgi_stdio.h&quot;
201     #include &lt;stdlib.h&gt;
202
203     void main(void)
204     {
205         int count = 0;
206         while(FCGI_Accept() &gt;= 0)
207             printf(&quot;Content-type: text/html\r\n&quot;
208                    &quot;\r\n&quot;
209                    &quot;&lt;title&gt;FastCGI Hello!&lt;/title&gt;&quot;
210                    &quot;&lt;h1&gt;FastCGI Hello!&lt;/h1&gt;&quot;
211                    &quot;Request number %d running on host &lt;i&gt;%s&lt;/i&gt;\n&quot;,
212                     ++count, getenv(&quot;SERVER_NAME&quot;));
213     }
214 </pre>
215
216 <p>The key features of this tiny FastCGI program are:
217
218 <ul type="square">
219   <li>The program is structured as a loop that begins by calling the function <tt>FCGI_Accept</tt>.
220     The <tt>FCGI_Accept</tt> function blocks until a new request arrives for the program to
221     execute. The program includes <tt>fcgi_stdio.h</tt> in order to get access to the <tt>FCGI_Accept</tt>
222     function.</li>
223   <li>Within the loop, <tt>FCGI_Accept</tt> creates a CGI-compatible world. <tt>printf</tt>
224     and <tt>getenv</tt> operate just as in the CGI program. <tt>stdin</tt> and <tt>stderr</tt>,
225     not used by this tiny program, also operate just as in a CGI program.</li>
226 </ul>
227
228 <p>The <tt>count</tt> variable increments each time through the loop, so the program
229 displays a new request number each time. You can use the reload button in your browser to
230 demonstrate this, once you've got the program built and running.</p>
231
232 <h4>Building the program</h4>
233
234 <p>If you can build <tt>examples/tiny-cgi.c</tt>, it will be straightforward for you to
235 build <tt>examples/tiny-fcgi.c</tt>. You need to:
236
237 <ul type="square">
238   <li>Add the directory containing the <tt>fcgi_stdio.h</tt> header to the compiler's include
239     search path. The kit calls this directory <tt>include</tt>.</li>
240   <li>Add the library <tt>libfcgi.a</tt> to the linker's command line so that it will be
241     searched when linking. The <tt>libfcgi.a</tt> library implements the functions defined in <tt>fcgi_stdio.h</tt>.
242     The kit calls the directory containing this library <tt>libfcgi</tt>.</li>
243   <li>Determine whether or not the linker on your platform searches the Berkeley socket
244     library by default, and if not, add linker directives to force this search.</li>
245 </ul>
246
247 <p>See <tt>examples/Makefile</tt> (created by <tt>configure</tt>) for a Makefile that
248 builds both programs. Autoconf handles the platform-dependent linking issues; to see how,
249 examine <tt>configure.in</tt> and <tt>examples/Makefile.in</tt>.</p>
250
251 <h4>Running the program</h4>
252 <p>
253
254 <a href="#S4">Section 4</a> is all about how to run FastCGI applications.</p>
255
256 <p>You can use CGI to run application binaries built with the <tt>fcgi_stdio</tt> library.
257 The <tt>FCGI_Accept</tt> function tests its environment to determine how the application
258 was invoked. If it was invoked as a CGI program, the first call to FCGI_Accept is
259 essentially a no-op and the second call returns <tt>-1</tt>. In effect, the request loop
260 disappears.</p>
261
262 <p>Of course, when a FastCGI application is run using CGI it does not get the benefits of
263 FastCGI. For instance, the application exits after servicing a single request, so it
264 cannot maintain cached information.</p>
265
266 <h4>Implementation details</h4>
267 <p>
268
269 <tt>fcgi_stdio.h</tt> works by first including <tt>stdio.h</tt>, then defining macros to
270 replace essentially all of the types and procedures defined in <tt>stdio.h</tt>. (<tt>stdio.h</tt>
271 defines a few procedures that have nothing to do with <tt>FILE *</tt>, such as <tt>sprintf</tt>
272 and <tt>sscanf</tt>; <tt>fcgi_stdio.h</tt> doesn't replace these.) For instance, <tt>FILE</tt>
273 becomes <tt>FCGI_FILE</tt> and <tt>printf</tt> becomes <tt>FCGI_printf</tt>. You'll only
274 see these new names if you read <tt>fcgi_stdio.h</tt> or examine your C source code after
275 preprocessing.</p>
276
277 <p>Here are some consequences of this implementation technique:
278
279 <ul type="square">
280   <li>On some platforms the implementation will break if you include <tt>stdio.h</tt> after
281     including <tt>fcgi_stdio.h</tt>, because <tt>stdio.h</tt> often defines macros for
282     functions such as <tt>getc</tt> and <tt>putc</tt>. Fortunately, on most platforms <tt>stdio.h</tt>
283     is protected against multiple includes by lines near the top of the file that look like <pre>
284     #ifndef _STDIO_H
285     #define _STDIO_H
286     </pre>
287     <p>The specific symbol used for multiple-include protection, <tt>_STDIO_H</tt> in this
288     example, varies from platform to platform. As long as your platform protects <tt>stdio.h</tt>
289     against multiple includes, you can forget about this issue.</p>
290   </li>
291   <li>If your application passes <tt>FILE *</tt> to functions implemented in libraries for
292     which you have source code, then you'll want to recompile these libraries with <tt>fcgi_stdio.h</tt>
293     included. Most C compilers provide a command-line option for including headers in a
294     program being compiled; using such a compiler feature allows you to rebuild your libraries
295     without making source changes. For instance the gcc command line <pre>
296     gcc -include /usr/local/include/fcgi_stdio.h wonderlib.c
297     </pre>
298     <p>causes gcc to include <tt>fcgi_stdio.h</tt> before it even begins to read the module <tt>wonderlib.c</tt>.</p>
299   </li>
300   <li>If your application passes <tt>FILE *</tt> to functions implemented in libraries for
301     which you do not have source code, then you'll need to include the headers for these
302     libraries <i>before</i> you include <tt>fcgi_stdio.h</tt>. You can't pass the <tt>stdin</tt>,
303     <tt>stdout</tt>, or <tt>stderr</tt> streams produced by <tt>FCGI_Accept</tt> to any
304     functions implemented by these libraries. You can pass a stream on a Unix file to a
305     library function by following this pattern: <pre>
306     FILE *myStream = fopen(path, &quot;r&quot;);
307     answer = MungeStream(FCGI_ToFile(myStream));
308     </pre>
309     <p>Here <tt>MungeStream</tt> is a library function that you can't recompile and <tt>FCGI_ToFile</tt>
310     is a macro that converts from <tt>FCGI_FILE *</tt> to <tt>FILE *</tt>. The macro <tt>FCGI_ToFile</tt>
311     is defined in <tt>fcgi_stdio.h</tt>.</p>
312   </li>
313 </ul>
314
315 <h4>Converting CGI programs</h4>
316
317 <p>The main task in converting a CGI program into a FastCGI program is separating the code
318 that needs to execute once, initializing the program, from the code that needs to run for
319 each request. In our tiny example, initializing the <tt>count</tt> variable is outside the
320 loop, while incrementing the <tt>count</tt> variable goes inside.</p>
321
322 <p>Retained application state may be an issue. You must ensure that any application state
323 created in processing one request has no unintended effects on later requests. FastCGI
324 offers the possibility of significant application performance improvements, through
325 caching; it is up to you to make the caches work correctly.</p>
326
327 <p>Storage leaks may be an issue. Many CGI programs don't worry about storage leaks
328 because the programs don't run for long enough for bloating to be a problem. When
329 converting to FastCGI, you can either use a tool such as <a href="http://www.pure.com/"><i>Purify</i></a>
330 from Pure Software to discover and fix storage leaks, or you can run a C garbage collector
331 such as <a href="http://www.geodesic.com/"><i>Great Circle</i></a> from Geodesic Systems.</p>
332
333 <h4>Limitations</h4>
334
335 <p>Currently there are some limits to the compatibility provided by the <tt>fcgi_stdio</tt>
336 library:
337
338 <ul type="square">
339   <li>The library does not provide FastCGI versions of the functions <tt>fscanf</tt> and <tt>scanf</tt>.
340     If you wish to apply <tt>fscanf</tt> or <tt>scanf</tt> to <tt>stdin</tt> of a FastCGI
341     program, the workaround is to read lines or other natural units into memory and then call <tt>sscanf</tt>.
342     If you wish to apply <tt>fscanf</tt> to a stream on a Unix file, the workaround is to
343     follow the pattern: <pre>
344     FILE *myStream = fopen(path, &quot;r&quot;);
345     count = fscanf(FCGI_ToFile(myStream), format, ...);
346     </pre>
347   </li>
348 </ul>
349
350 <h4>Reference documentation</h4>
351
352 <p>The <a href="FCGI_Accept.3"><tt>FCGI_Accept</tt> manpage</a>, <tt>doc/FCGI_Accept.3</tt>,
353 describes the function in the traditional format.</p>
354
355 <p>The <a href="FCGI_Finish.3"><tt>FCGI_Finish</tt></a> (<tt>doc/FCGI_Finish.3</tt>), <a
356 href="FCGI_SetExitStatus.3"><tt>FCGI_SetExitStatus</tt></a> (<tt>doc/FCGI_SetExitStatus.3</tt>),
357 and <a href="FCGI_StartFilterData.3"><tt>FCGI_StartFilterData</tt></a> (<tt>doc/FCGI_StartFilterData.3</tt>)
358 manpages document capabilities of the <tt>fcgi-stdio</tt> library that are not illustrated
359 above.</p>
360
361 <h4><a NAME="S3.2">3.2 Using the <tt>fcgiapp</tt> library</a></h4>
362
363 <p>The <tt>fcgiapp</tt> library is a second C library for FastCGI. It does not provide the
364 high degree of source code compatibility provided by <tt>fcgi_stdio</tt>; in return, it
365 does not make such heavy use of <tt>#define</tt>. <tt>fcgi_stdio</tt> is implemented as a
366 thin layer on top of <tt>fcgiapp</tt>.</p>
367
368 <p>Applications built using the <tt>fcgiapp</tt> library cannot run as CGI programs; that
369 feature is provided at the <tt>fcgi_stdio</tt> level.</p>
370
371 <p>Functions defined in <tt>fcgiapp</tt> are named using the prefix <tt>FCGX_</tt> rather
372 than <tt>FCGI_</tt>. For instance, <tt>FCGX_Accept</tt> is the <tt>fcgiapp</tt> version of
373 <tt>FCGI_Accept</tt>.</p>
374
375 <p>Documentation of the <tt>fcgiapp</tt> library takes the form of extensive comments in
376 the header file <tt>include/fcgiapp.h</tt>. The sample programs <tt>examples/tiny-fcgi2.c</tt>
377 and <tt>examples/echo2.c</tt> illustrate how to use <tt>fcgiapp</tt>.</p>
378
379 <h4><a NAME="S3.3">3.3 Using Perl and Tcl</a></h4>
380
381 <p>A major advantage of the FastCGI approach to high-performance Web applications is its
382 language-neutrality. CGI scripts written in popular languages such as Perl and Tcl can be
383 evolved into high-performance FastCGI applications.</p>
384
385 <p>We have produced FastCGI-integrated Perl and Tcl interpreters. Doing so was easy, since
386 Perl and Tcl are conventional C applications and <tt>fcgi_stdio</tt> was designed for
387 converting conventional C applications. Essentially no source code changes were required
388 in these programs; a small amount of code was added in order to make <tt>FCGI_Accept</tt>
389 and other FastCGI primitives available in these languages. And because these interpreters
390 were developed using <tt>fcgi_stdio</tt>, they run standard Perl and Tcl applications
391 (e.g. CGI scripts) as well as FastCGI applications.</p>
392
393 <p>See the <a href="http://fastcgi.com">fastcgi.com</a> Web page for more information 
394   about the Perl and Tcl libraries.</p>
395
396 <p>Here are the Perl and Tcl versions of <tt>tiny-fcgi</tt>:</p>
397
398 <pre>
399 #!./perl
400 use FCGI;
401 $count = 0;
402 while(FCGI::accept() &gt;= 0) {
403     print(&quot;Content-type: text/html\r\n\r\n&quot;,
404           &quot;&lt;title&gt;FastCGI Hello! (Perl)&lt;/title&gt;\n&quot;,
405           &quot;&lt;h1&gt;FastCGI Hello! (Perl)&lt;/h1&gt;\n&quot;;
406           &quot;Request number &quot;,  ++$count,
407           &quot; running on host &lt;i&gt;&quot;;$env(SERVER_NAME)&lt;/i&gt;&quot;);
408 }
409 </pre>
410
411 <pre>
412 #!./tclsh
413 set count 0 
414 while {[FCGI_Accept] &gt;= 0 } {
415     incr count
416     puts -nonewline &quot;Content-type: text/html\r\n\r\n&quot;
417     puts &quot;&lt;title&gt;FastCGI Hello! (Tcl)&lt;/title&gt;&quot;
418     puts &quot;&lt;h1&gt;FastCGI Hello! (Tcl)&lt;/h1&gt;&quot;
419     puts &quot;Request number $count running on host &lt;i&gt;$env(SERVER_NAME)&lt;/i&gt;&quot;
420 }
421 </pre>
422
423 <p>Converting a Perl or Tcl CGI application to FastCGI is not fundamentally different from
424 converting a C CGI application to FastCGI. You separate the portion of the application
425 that performs one-time initialization from the portion that performs per-request
426 processing. You put the per-request processing into a loop controlled by <tt>FCGI::accept</tt>
427 (Perl) or <tt>FCGI_Accept</tt> (Tcl). </p>
428
429 <h4><a NAME="S3.4">3.4 Using Java</a></h4>
430
431 <p>Java is not just for browser-based applets. It is already suitable for writing some Web
432 server applications, and its range of applicability will only grow as Java compilers and
433 other Java tools improve. Java's modules, garbage collection, and threads are especially
434 valuable for writing long-lived application servers.</p>
435
436 <p>The <tt>FCGIInterface</tt> class provides facilities for Java applications analogous to
437 what <tt>fcgi_stdio</tt> provides for C applications. Using this library your Java
438 application can run using either CGI or FastCGI.</p>
439
440 <p>The kit includes separate companion document on <a href="fcgi-java.htm">using FastCGI
441 with Java</a>. The source code for FastCGI classes is contained in directory <tt>java/src</tt>
442 and the compiled code in <tt>java/classes</tt>.</p>
443
444 <p>Here is the Java version of <tt>tiny-fcgi</tt>:</p>
445
446 <pre>
447 import FCGIInterface;
448
449 class TinyFCGI {        
450     public static void main (String args[]) {           
451         int count = 0;
452         while(new FCGIInterface().FCGIaccept()&gt;= 0) {
453             count ++;
454             System.out.println(&quot;Content-type: text/html\r\n\r\n&quot;);
455             System.out.println(
456                     &quot;&lt;title&gt;FastCGI Hello! (Java)&lt;/title&gt;&quot;);
457             System.out.println(&quot;&lt;h1&gt;FastCGI Hello! (Java)&lt;/h1&gt;&quot;);
458             System.out.println(
459                     &quot;request number &quot; + count + &quot; running on host &lt;i&gt;&quot; +
460                     System.getProperty(&quot;SERVER_NAME&quot;) + &quot;&lt;/i&gt;&quot;);
461         }
462     }
463 }
464 </pre>
465
466 <h3><a NAME="S4">4. Running applications</a></h3>
467
468 <h3><a NAME="S4.1">4.1 Using a Web server that supports FastCGI</a></h3>
469
470 <p>For a current listing of Web servers that support FastCGI, see the <a
471 HREF="http://fastcgi.com">fastcgi.com</a> Web page.</p>
472
473 <p>Some of the Web servers that support FastCGI perform management of FastCGI 
474   applications. You don't need to start and stop FastCGI applications; the Web 
475   server takes care of this. If an application process should crash, the Web server 
476   restarts it.</p>
477
478 <p>Web servers support FastCGI via new configuration directives. Since these directives 
479   are server-specific, get more information from the documentation that accompanies 
480   each server.</p>
481
482 <h3><a NAME="S4.2">4.2 Using <tt>cgi-fcgi</tt> with any Web server</a></h3>
483
484 <p>The program <tt>cgi-fcgi</tt> allows you to run FastCGI applications using any Web
485 server that supports CGI.</p>
486
487 <p>Here is how <tt>cgi-fcgi</tt> works. <tt>cgi-fcgi</tt> is a standard CGI program that
488 uses Unix domain or TCP/IP sockets to communicate with a FastCGI application. <tt>cgi-fcgi</tt>
489 takes the path name or host/port name of a listening socket as a parameter and <tt>connect</tt>s
490 to the FastCGI application listening on that socket. <tt>cgi-fcgi</tt> then forwards the
491 CGI environment variables and <tt>stdin</tt> data to the FastCGI application, and forwards
492 the <tt>stdout</tt> and <tt>stderr</tt> data from the FastCGI application to the Web
493 server. When the FastCGI application signals the end of its response, <tt>cgi-fcgi</tt>
494 flushes its buffers and exits.</p>
495
496 <p>Obviously, having <tt>cgi-fcgi</tt> is not as good as having a server with integrated
497 FastCGI support:
498
499 <ul>
500   <li>Communication is slower than with a Web server that avoids the fork/exec overhead on
501     every FastCGI request. </li>
502   <li><tt>cgi-fcgi</tt> does not perform application management, so you need to provide this
503     yourself. </li>
504   <li><tt>cgi-fcgi</tt> supports only the Responder role. </li>
505 </ul>
506
507 <p>But <tt>cgi-fcgi</tt> does allow you to develop applications that retain state in
508 memory between connections, which often provides a major performance boost over normal
509 CGI. And all the applications you develop using <tt>cgi-fcgi</tt> will work with Web
510 servers that have integrated support for FastCGI.</p>
511
512 <p>The file <tt>examples/tiny-fcgi.cgi</tt> demonstrates a way to use <tt>cgi-fcgi</tt> to
513 run a typical application, in this case the <tt>examples/tiny-fcgi</tt> application: </p>
514
515 <pre>
516     #!../cgi-fcgi/cgi-fcgi -f
517     -connect sockets/tiny-fcgi tiny-fcgi
518 </pre>
519
520 <p>On most Unix platforms, executing this command-interpreter file runs <tt>cgi-fcgi</tt>
521 with arguments <tt>-f</tt> and <tt>examples/tiny-fcgi.cgi</tt>. (Beware: On some Unix
522 platforms, including HP-UX, the first line of a command-interpreter file cannot contain
523 more than 32 characters, including the newline; you may need to install the <tt>cgi-fcgi</tt>
524 application in a standard place like <tt>/usr/local/bin</tt> or create a symbolic link to
525 the <tt>cgi-fcgi</tt> application in the directory containing your application.) The <tt>cgi-fcgi</tt>
526 program reads the command-interpreter file and connects to the FastCGI application whose
527 listening socket is <tt>examples/sockets/tiny-fcgi</tt>.</p>
528
529 <p>Continuing the example, if <tt>cgi-fcgi</tt>'s connection attempt fails, it creates a
530 new process running the program <tt>examples/tiny-fcgi</tt> and listening on socket <tt>examples/sockets/tiny-fcgi</tt>.
531 Then <tt>cgi-fcgi</tt> retries the connection attempt, which now should succeed.</p>
532
533 <p>The <tt>cgi-fcgi</tt> program has two other modes of operation. In one mode it connects
534 to applications but does not start them; in the other it starts applications but does not
535 connect to them. These modes are required when using TCP/IP. The <a href="cgi-fcgi.1"><tt>cgi-fcgi</tt>
536 manpage</a>, <tt>doc/cgi-fcgi.1</tt>, tells the full story.</p>
537
538 <p>To run the example applications using <tt>cgi-fcgi</tt>, start your Web server and give
539 it the directory <tt>fcgi-devel-kit</tt> as the root of its URL space. If the machine
540 running your server is called <tt>bowser</tt> and your server is running on port <tt>8888</tt>,
541 you'd then open the URL <tt>http://bowser:8888/index.html</tt> to reach the kit's index
542 page. Now the links on the index page that run example applications via <tt>cgi-fcgi</tt>
543 should be active.</p>
544
545 <h3><a NAME="S5">5. Known problems</a></h3>
546
547 <p>On Digital UNIX 3.0 there's a problem with Unix domain listening sockets on NFS file
548 systems. The symptom when using cgi-fcgi is an exit status of 38 (<tt>ENOTSOCK</tt>:
549 socket operation on non-socket), but cgi-fcgi may dump core in this case when compiled
550 optimized. Work-around: Store your Unix domain listening sockets on a non NFS file system,
551 upgrade to Digital UNIX 3.2, or use TCP sockets.</p>
552
553 <p>On AIX there's a problem with shared listening sockets. The symptoms can include
554 application core dumps and kernel panic. Work-around: Run a single FastCGI application
555 server per listening socket.</p>
556
557 <h3><a NAME="S6">6. Getting support</a></h3>
558
559 <p>The mailing list <tt>fastcgi-developers@idle.com</tt> is used for discussions of issues
560 in developing FastCGI applications. Topics include announcement of FastCGI-capable Web
561 servers or changes to such servers, announcement of new application libraries or changes
562 to such libraries, announcement of known bugs, discussion of design trade-offs in FastCGI
563 application programming, and discussion of development plans and experiences. To join the
564 list, send a message to <a href="mailto:fastcgi-developers-request@openmarket.com">fastcgi-developers-request@idle.com</a>
565 with a message body consisting of the word &quot;subscribe&quot; (leaving off the quotes).</p>
566
567 <p>A link to a mail archive can be found on the FastCGI home page, <a
568 href="http://www.fastcgi.com">http://www.fastcgi.com</a></p>
569
570 <hr>
571
572 <address>
573   © 1996, Open Market, Inc. / mbrown@openmarket.com 
574 </address>
575 </body>
576 </html>