几天前,我尝试在 Kubuntu 服务器上使用 apache 设置 fastcgi。尽管到处搜索,我还是无法让它工作。如果我尝试使用 cgi 应用程序运行网站,apache 会挂起,并在超时后返回 500 错误。
这是我所做的:
我确保 mod_fastcgi 已安装并启用:
# pwd /etc/apache2/mods-enabled # ls -l f* lrwxrwxrwx 1 root root 30 2010-07-22 10:01 fastcgi.conf -> ../mods-available/fastcgi.conf lrwxrwxrwx 1 root root 30 2010-07-22 10:01 fastcgi.load -> ../mods-available/fastcgi.load
据我所知,fastcgi.conf 配置正确:
<IfModule mod_fastcgi.c> AddHandler fastcgi-script .fcgi #FastCgiWrapper /usr/lib/apache2/suexec FastCgiIpcDir /var/lib/apache2/fastcgi </IfModule>
我用这个非常简单示例脚本测试设置:
#include <iostream> using namespace std; int main() { cout<<"Content-type: text/plain"<<endl<<endl; cout<<"Hello World!"<<endl; return 0; }
- 我编译了它。它在命令行下运行良好。
- 我将其放在 Web 服务器可见的文件夹中:http://127.0.0.1/fcgitest/run.fcgi
- 一开始我得到的是:“禁止访问。您无权访问此服务器上的 /fcgitest/run.fcgi。”。
我
.htaccess
在文件夹中添加了一个文件:Options +ExecCGI -Indexes
- 现在,当我尝试从我的网络浏览器访问脚本地址时,出现了我在开始时描述的症状:浏览器首先挂起,超时后,出现 500 内部服务器错误。
apache error.log 说:
Content-type: text/plain Hello World! [Sat Aug 28 09:08:23 2010] [warn] FastCGI: (dynamic) server "/var/www/fcgitest/run.fcgi" (pid 27758) terminated by calling exit with status '0'
似乎输出已写入错误日志! 是否有某个地方缺少套接字配置?
答案1
正如 joschi 所指出的, CGI != FastCGI 。在这种情况下,CGI 脚本将会失败。
http://127.0.0.1/doc/libapache2-mod-fastcgi/mod_fastcgi.html
http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html
符合 FastCGI 规范
FastCGI 规范尚未完全实现,而且我也有些偏离,从而产生了一些 Apache 特定的功能。
stdout 和 stderr 的文件描述符保持打开状态。这是规范所禁止的。我看不出有任何理由要求关闭它们,并且保持它们打开状态可以防止未完全移植到 FastCGI 的 FastCGI 应用程序失败。这并不意味着不应该修复应用程序以避免发生这种情况,但在使用需要能够写入 stderr 的第三方库(没有源代码)时,这是非常有用的。以这种方式写入 stdout 或 stderr 的任何内容都将被定向到主服务器日志。