Nginx 本身不能执行外部程序,Nginx 处理 PHP 是通过 PHP 的 fastcgi 管理器(php-fpm)进行处理,然后 nginx 再将结果返回给用户;所以如果我们需要通过 cgi 程序(shell、perl、c/c++ 等)来编写网站后台的话,就需要使用 fcgiwrap 这个通用的 fastcgi 进程管理器来帮助 nginx 处理 cgi。对于 PHP:只建议使用 PHP-FPM,因为这是官方的解决方案,性能和稳定性肯定是最好的。
对于其它 CGI 程序:如 Shell、Perl、C/C++、Python,推荐使用 fcgiwrap,这是一个通用的 FCGI 管理器。
写这篇博客的主要目的也是为了让 Nginx 执行 Shell、Perl、C/C++、Python 程序,因为作为一个生信出身的伪 IT 工作者,Shell、Perl、Python 永远都是我们最熟悉的,用这些语言来编写网站后台可以更加节省我们的时间,效率更高。
一、概念
1. CGI 与 FastCGI
CGI 全称是"公共网关接口"(Common Gateway Interface),HTTP 服务器与你的或其它机器上的程序进行 "交谈" 的一种工具,其程序须运行在网络服务器上。它和 FastCGI(快速通用网关接口)都是语言无关的协议。CGI 诞生已经非常久远了,由于它每次在处理一个请求(连接)时都要重新启动脚本(可执行文件),重新传递所有的环境变量(其中非常多是完全一样的),导致性能非常低下。虽然性能较低,但功不可没,后来出现了性能更高的 FastCGI。
FastCGI(简称 FCGI)是 CGI 的增强版本,FCGI 可以简单的理解为 CGI + 多进程模型。FCGI 的工作模式有点类似于 Nginx,一个 Master 进程和多个 Worker 进程。Master 进程主要用来监控 Worker 进程的运行情况,当某个 Worker 进程意外退出时,Master 进程会随即启动一个新的 Worker 进程;Worker 进程则是真正干活的进程,用来执行 CGI 程序(传递环境变量、标准输入),获取 CGI 程序的标准输出,再将其返回为 Web 服务器(如 Apache、Nginx)。Worker 进程处理完请求后不会结束运行,而是继续等待下一个请求的到来,直到我们手动关闭它们。
2. Spawn-FCGI 与 FcgiWrap
Spawn-FCGI 是一个通用的 FastCGI 管理服务器,它是 lighttpd 中的一部份,很多人都用 Lighttpd 的 Spawn-FCGI 进行 FastCGI 模式下的管理工作。之前一直以为 Nginx 执行 CGI 程序需要 spawn-fcgi 和 fcgiwrap 两个东西(网上很多文档都是抄来抄去,搞得我也一头雾水,只好照做),但是实际上只需要 fcgiwrap,spawn-fcgi 的作用仅仅是启动和配置 fcgiwrap,这