FASTCGI¶
- 作者
Frank Warmerdam
- 联系方式
可在Pobox.com上了解相关信息
- 作者
Howard Butler
- 联系方式
位于gmail.com的Hobu.inc
- 最后更新
2008-07-15
获取必要的软件¶
mapserver fastcgi拼图有三个部分。首先,您需要实际的fastcgi库。这可以从下载 https://fastcgi-archives.github.io// . 这个类库照常 配置、生成、生成安装 跳舞。另外一个复杂的问题是,它默认安装在/usr/local中,您可能会给出 配置 命令a--prefix=/usr将其放在ldconfig已经可见的位置。
假设你在跑步 Apache 下一个你需要的是FastCGI模块。Apache有两种FastCGI实现:
mod_fcgid: Apache fcgid homepage
deprecated mod fcgi:mod fcgi取决于您运行的Apache版本,因此请确保下载正确的fork(Apache 1.3与Apache 2)。
第三个也是最后一个部分是使用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配置¶
修改http.conf以加载fastcgi模块。
LoadModule fcgid_module modules/mod_fcgid.so
为FastCGI应用程序添加Apache处理程序。
AddHandler fcgid-script fcgi
设置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,如上所述。
修改http.conf以加载fastcgi模块。
LoadModule fastcgi_module /usr/lib/apache/1.3/mod_fastcgi.so
为FastCGI应用程序添加Apache处理程序。
AddHandler fastcgi-script fcgi
设置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配置¶
安装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
在mapfile中,设置一个处理指令,告诉fastcgi缓存所有需要连接缓存的层上的连接和层信息,即所有慢速层。
PROCESSING "CLOSE_CONNECTION=DEFER"
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)。