FASTCGI

作者

弗兰克·沃默丹

联系

Pobox.com上的Warmerdam

作者

霍华德巴特勒

联系

位于gmail.com的Hobu.inc

最后更新

2008-07-15

介绍

fastcgi是一种协议,用于保持cgi-bin风格的Web应用程序作为守护进程运行,以利用保留内存缓存的优势,并将其他高启动成本(如大量的数据库连接)分摊到许多请求上。

获取必要的软件

  1. mapserver fastcgi拼图有三个部分。首先,您需要实际的fastcgi库。这可以从下载 https://fastcgi-archives.github.io// . 这个类库照常 配置、生成、生成安装 跳舞。另外一个复杂的问题是,它默认安装在/usr/local中,您可能会给出 配置 命令a--prefix=/usr将其放在ldconfig已经可见的位置。

  2. 假设你在跑步 Apache 下一个你需要的是FastCGI模块。Apache有两种FastCGI实现:

    • mod_fcgid: Apache fcgid homepage

    • deprecated mod fcgi:mod fcgi取决于您运行的Apache版本,因此请确保下载正确的fork(Apache 1.3与Apache 2)。

  3. 第三个也是最后一个部分是使用fastcgi支持编译mapserver。这很简单,你只需要告诉我 configure 安装FastCGI库的位置。如果您按照上面的描述更改前缀变量,这将是:

./configure [other options] --with-fastcgi=/usr/local

这些部件就位后,mapserver cgi(mapserv)现在应该启用fastcgi。您可以通过使用命令行对其进行测试来验证这一点:

[hobu@kenyon mapserver-6.2.0]# ./mapserv -v
MapServer version 6.2.0 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP
SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT
SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=FASTCGI INPUT=EPPL7
INPUT=SDE INPUT=ORACLESPATIAL INPUT=OGR INPUT=GDAL
INPUT=SHAPEFILE DEBUG=MSDEBUG

mod fcgid配置

  1. 修改http.conf以加载fastcgi模块。

LoadModule fcgid_module modules/mod_fcgid.so
  1. 为FastCGI应用程序添加Apache处理程序。

AddHandler fcgid-script fcgi
  1. 设置FastCGI处理信息

<IfModule mod_fcgid.c>
   FcgidMaxProcessesPerClass 30
   FcgidInitialEnv PROJ_LIB /usr/local/share/proj
   FcgidInitialEnv LD_LIBRARY_PATH "/usr/local/lib:/usr/local/pgsql/lib:/usr3/pkg3/oracle9/lib"
</IfModule>

已弃用的mod fcgi配置

本节仅供参考。在apache下运行fastcgi程序的推荐方法是使用mod_fcgid,如上所述。

  1. 修改http.conf以加载fastcgi模块。

    LoadModule fastcgi_module /usr/lib/apache/1.3/mod_fastcgi.so
    
  2. 为FastCGI应用程序添加Apache处理程序。

    AddHandler fastcgi-script fcgi
    
  3. 设置FastCGI处理信息

    FastCgiConfig -initial-env PROJ_LIB=/usr/local/share/proj
    -initial-env LD_LIBRARY_PATH=/usr/local/lib:/usr/local/pgsql/lib:/usr3/pkg3/oracle9/lib
    -appConnTimeout 60 -idle-timeout 60 -init-start-delay 1
    -minProcesses 2 -maxClassProcesses 20 -startDelay 5
    

通用mod fcgid/mod fcgi配置

  1. 安装mapserv可执行文件的副本(最初 mapserv 或 MPEServ.EXE) 进入cgi bin目录,扩展名为**.fcgi**(即 MAPServ.FCGI) . 当您想使用fastcgi支持时,使用这个可执行文件。

    对于某些平台,mapserver链接将不得不从以下位置更改:

    http://your.domain.name/cgi-bin/mapserv?MAP=/path/to/mapfile.map
    

    到:

    http://your.domain.name/cgi-bin/mapserv.fcgi?MAP=/path/to/mapfile.map
    

    对于其他平台,mapserver链接将不得不从以下更改:

    http://your.domain.name/cgi-bin/mapserv.exe?MAP=/path/to/mapfile.map
    

    到:

    http://your.domain.name/cgi-bin/mapserv.fcgi?MAP=/path/to/mapfile.map
    
  2. 在mapfile中,设置一个处理指令,告诉fastcgi缓存所有需要连接缓存的层上的连接和层信息,即所有慢速层。

    PROCESSING "CLOSE_CONNECTION=DEFER"
    

常见问题

文件权限

FedoraCore3不允许FastCGI写入进程日志(当您使用RedHat的Apache2而不是自己的时候)。这是描述 here .

另外,fastcgi需要在某个地方写它的套接字信息。这可以通过 FastCgiIpcDir 指令。

Win32上的FastCGI

MS4W用户

MS4W (MapServer for Windows) >=2.2.2版包含使用fastcgi支持编译的mapserver。MS4W版本>=2.2.8还包含所需的Apache模块(mod fcgid),用户必须遵循 README instructions 设置FastCGI及其应用程序。

建筑fcgi-2.4.0

我使用libfcgi-2.4.0与来自https://fastcgi archives.github.io/的Apache2一起使用。

二进制IO修补程序

当向stdio写入png和其他二进制图像时,stdio必须处于二进制模式。为了实现通过fastcgi库处理的stdio,我必须对fcgi-2.4.0发行版中的libfcgi/fcgi_stdio.c执行以下黑客操作。

在fcgi_accept()中,他进行了以下更改

if(isCGI) {
  FCGI_stdin->stdio_stream = stdin;
  FCGI_stdin->fcgx_stream = NULL;
  FCGI_stdout->stdio_stream = stdout;
  FCGI_stdout->fcgx_stream = NULL;
  FCGI_stderr->stdio_stream = stderr;
  FCGI_stderr->fcgx_stream = NULL;

  /* FrankWarmerdam: added so that returning PNG and other binary data
     will still work */
#ifdef _WIN32
  _setmode( _fileno(stdout), _O_BINARY);
  _setmode( _fileno(stdin), _O_BINARY);
#endif

} else {

另外,在fcgi_accept()函数之前添加以下内容

#ifdef _WIN32
#include <fcntl.h>
#include <io.h>
#endif

我相信有更好的方法来实现这一点。如果你知道怎么做,请告诉我!

构建libfcgi

makefile.nt应该没问题。只需确保已运行vcvars32.bat(这是构建MapServer所需的),然后发出命令:

nmake /f makefile.nt

那么.lib和.dll将在libfcgi/debug中?。请确保将dll复制到适当的位置(如CGI bin目录)。

其他问题

1)FastCGI在Win32上接收的环境非常有限,似乎比Apache启动的普通CGI更受限制。确保所需的所有DLL都在fastcgi目录中或在windowssystem32中。任何缺少的DLL都会导致错误日志中出现非常神秘的错误,包括有关重叠读取请求失败或类似情况的内容。

2)确保您使用的libfcgi.dll与您的mapserv.exe(可能还有libmap_fcgi.dll)在同一个运行库上构建,否则您将遭受痛苦!不同的运行库有不同的“environ”变量(以及它们自己的stdio和heaps)。您可以使用ms-sdk依赖关系查询器检查所有内容是否都在使用msvcrt.dll(或全部使用msvcrtd.dll)。