在Linux上搭建apache+fastcgi环境,说多了都是泪啊. 花费我几天时间,开源软件虽说好用,但是版本众多,文档缺乏,什么都只能自己摸索. 终于成功运行起来,特此记录.
一. apache 安装
此处下载 apache-2.2.27 版本,常规的 configure make 命令,安装非常方便
- wget http://mirrors.cnnic.cn/apache//httpd/httpd-2.2.27.tar.bz2
- tar -xjzf httpd-2.2.27.tar.bz2
- cd httpd-2.2.27
- ./configure --prefix=/usr/local/apache2
- make && make install
二. apache 配置
- <Directory "/usr/local/apache2/cgi-bin">
- AllowOverride None
- Options Indexes ExecCGI # 执行CGI
- Order allow,deny
- Allow from all
- </Directory>
- #添加文件映射
- AddHandler cgi-script .cgi .py
运行服务: ./apachectl start
打开 http://localhost, 成功会显示 It works!
三. 编译安装 fastcgi模块
fastcgi有多个分支版本, mod_fastcgi 官方地址: http://www.fastcgi.com/,这个是官方提供的扩展模块,已经很久没维护了, 而且下载链接已失效了
mod_fcgid 是apache官方维护的版本,与mod_fastcgi二进制兼容,原来的fastcgi程序不用重新编译就能工作. 其在mod_fastcgi基础上做了大量的代化
这里选择mod_fastcgi测试,生产环境不建议使用:
- wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
- tar -xzvf mod_fastcgi-2.4.6.tar.gz
- cd mod_fastcgi-2.4.6
- cp Makefile.AP2 Makefile
- make top_dir=/usr/local/apache2
- make top_dir=/usr/local/apache install
编辑httpd.conf, 加入fastcgi模块
- LoadModule fastcgi_module modules/mod_fastcgi.so
- <IfModule fastcgi_module>
- AddHandler fastcgi-script .fcgi .py .pl
- </IfModule>
四. 测试运行
下载安装 jnopy , fastcgi的python模块
cd jonpy-2.2.27
python setup.py install
- #!/usr/bin/python
- import jon.cgi as cgi
- import jon.fcgi as fcgi
- class Handler(cgi.Handler):
- def process(self, req):
- req.set_header("Content-Type", "text/plain")
- req.write("Hello, world!\n")
- fcgi.Server({fcgi.FCGI_RESPONDER: Handler}).run()
运行再一次出现500错误,查看日志: [error] No such file or directory exec of '/usr/local/apach2/cg-bin/hello_fcgi.py' failed
这就奇怪了,明明在/cgi-bin目录,打印的路径也是正常,怎么可能找不到呢? 难道是这脚本有猫腻,手动运行看看,报错: ./hello_fcgi.py: /usr/bin/python^M: bad interpreter: 没有那个文件或目录
原来这个文件有特殊字符,从windows下拷贝过来的文件很容易出现这个问题, vi 打开文件,直接 :set ff=unix 保存退出即可
五. 安装fastcgi开发库
如果顺序进行上面几步,表明环境都已经搭建好,下面部署c++ fastcgi程序
5.1 安装fastcgi开发库
- wget http://www.fastcgi.com/dist/fcgi.tar.gz
- cd fcgi-2.4.1
- ./configure
- make
- make install
make时出错, error: 'EOF' was not declared in this scope ,这EOF不是stdio.h中的吗, libfcgi/fcgio.cpp 中添加代码 #include <stdio.h> ,再次make,一切正常
5.2 编码测试
- #include "fcgi_stdio.h"
- #include <stdlib.h>
- void main(void)
- {
- int count = 0;
- while(FCGI_Accept() >= 0)
- printf("Content-type: text/html\r\n"
- "\r\n"
- "<title>FastCGI Hello!</title>"
- "<h1>FastCGI Hello!</h1>"
- "Request number %d running on host <i>%s</i>\n",
- ++count, getenv("SERVER_NAME"));
- }
编译: gcc -o fcgi_test.fcgi cgi_test.c -I/usr/local/include -L/usr/local/lib -lfcgi