一. 编译apache fastcgi模块
1. 编译mod_fastcgi.so
方式一: mod_fastcgi/Win32 目录下有mod_fastcgi.dsp和mod_fastcgi_AP2.dsp两个工程文件,但是无法用vc6打开,只能手动编译, 文章参见: http://blog.csdn.net/feisan/article/details/1813482
cl /ID:\Apache2.2\include /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "SHARED_MODULE" /FD /c *.c link /LIBPATH:D:\Apache2.2\lib /DLL /nologo /subsystem:console /incremental:no mod_fastcgi.obj fcgi_util.obj fcgi_protocol.obj fcgi_pm.obj fcgi_config.obj fcgi_buf.obj libhttpd.lib libapr-1.lib libaprutil-1.lib ws2_32.lib
cmd运行上述代码,会在当前目录生成 mod_fastcgi.dll,重命名至 mod_fastcgi.so
方式二:直接编辑 Makefile.nt
APACHE_SRC_DIR=D:\Apache2.2
LINK32_FLATGS = "$(APACHE_SRC_DIR)\lib\libhttpd.lib" "$(APACHE_SRC_DIR)\lib\libapr-1.lib" "$(APACHE_SRC_DIR)\lib\libaprutil-1.lib" , 将 "$(APACHE_SRC_DIR)\Release\ApacheCore.lib" 修改成前面内容即可, 因为apache2.2下没有 apachecore.lib
nmake -f Makefile.nt CFG=release, 则会在 Release 目录下生成 mod_fastcgi.dll
2. 编译 mod_fcgid.so, apache 官方推荐的 fastcgi 模块,目前最新版2.3.9
下载: mod_fcgid , windows上运行: nmake -f Makefile-fcgid.win INSTDIR="D:/apache2.2"
二. 编译fastcgi开发库
windows上编译比较简单,见README,运行 nmake -f Makefile.nt
三. 错误列表
1. Premature end of script headers: cgi_test.fcgi
配置 httpd.conf, 加载mod_fastcgi.so, 运行cgi程序,报错: (OS 109)管道已结束。: FastCGI: comm with server xxx aborted: GetOverlappedResult() failed
替换成 mod_fcgid.so ,再运行cgi程序,同样报错: (OS 109)管道已结束。: mod_fcgid: get overlap result error
原因: libfcg.dll 与 cgi_test.fcgi 程序版本不一致, libfcg.dll 是vs2010 release版, cgi_test.fcgi 是 vs2010 debug 版本,则会出现一些莫名其妙的错误, 必须保持版本一致性
当cgi_test.fcgi 为debug版本时,会出现下面错误:
* 调用 getenv("QUERY_STRING") 获取 apache 系统环境变量值为空
* 当依赖*.dll 与 cgi_test.fcgi 不在同一目录 /cgi-bin 时,无法正常启动 cgi 程序
2. windows上运行hello_fcgi.py 脚本,也报错: 'module' object has no attribute 'fromfd'
原因: 查找 soket.fromfd(),发现此函数只能用于unix, 难道这 mod_fastcgi 不能用于windows,上文测试用的版本分别为 mod_fastcgi-2.4.6,mod_fcgid-2.3.9
3. [error] (OS 2)系统找不到指定的文件。 : mod_fcgid: can't run D:/Program
[warn] (OS 2)系统找不到指定的文件。 : mod_fcgid: spawn process D:/Program Files/Apache2.2/cgi-bin/echo.fcgi error
原因: 系统找不到echo.fcgi,是因为apache安装在program files目录下,目录含空格而被截断了.将apache 安装在根目录即可