nginx fastcgi 配置

nginx 本身不能执行外部程序,nginx 处理 PHP 是通过 PHP 的 fastcgi 管理器(php-fpm)进行处理,然后 nginx 再将结果返回给用户;所以如果我们需要通过 cgi 程序(shell、perl、c/c++ 等)来编写网站后台的话,就需要 fcgiwrap 这个通用的 fastcgi 进程管理器来帮助 nginx 处理 cgi。

CGI、FastCGI

CGI(通用网关接口)和 FastCGI(快速通用网关接口)都是语言无关的协议,FastCGI(简称 FCGI)是 CGI 的增强版本,FCGI 可以简单的理解为 CGI + 多进程模型。FCGI 的工作模式有点类似于 Nginx,一个 Master 进程和多个 Worker 进程。Master 进程主要用来监控 Worker 进程的运行情况,当某个 Worker 进程意外退出时,Master 进程会随即启动一个新的 Worker 进程;Worker 进程则是真正干活的进程,用来执行 CGI 程序(传递环境变量、标准输入),获取 CGI 程序的标准输出,再将其返回为 Web 服务器(如 Apache、Nginx)。Worker 进程处理完请求后不会结束运行,而是继续等待下一个请求的到来,直到我们手动关闭它们。

  • 对于 PHP:只建议使用 PHP-FPM,因为这是官方的解决方案,性能和稳定性肯定是最好的。
  • 对于其它 CGI 程序:如 Shell、Perl、C/C++,使用 fcgiwrap,这是一个通用的 FCGI 管理器。

写这篇博客的主要目的也是为了让 Nginx 执行 Shell、Perl、C/C++ 程序,因为树莓派的资源有限,不想使用 PHP。

关于 spawn-fcgi
之前一直以为 Nginx 执行 CGI 程序需要 spawn-fcgi 和 fcgiwrap 两个东西(网上很多文档都是抄来抄去,搞得我也一头雾水,只好照做),但是实际上只需要 fcgiwrap,spawn-fcgi 的作用仅仅是启动 fcgiwrap,这个工作完全可以由 fcgiwrap 自己来完成,没有必要安装 spawn-fcgi。

安装 fcgiwrap

运行 fcgiwrap

fcgiwrap -h,查看帮助

运行 fcgiwrap(root)

配置 nginx,内容:

然后重载 nginx:

测试 fcgiwrap

进入 /srv/http/www.test.org 目录,创建 index.cgi,这里使用 shell 脚本,内容如下:

添加可执行权限,修改所属用户及所属组:chmod +x *.cgichown nginx:nginx *.cgi。测试: