参考:https://www.zhihu.com/question/30672017
参考:http://blog.51reboot.com/cgi-fastcgi-wsgi/
参考:https://www.cnblogs.com/xiaouisme/archive/2012/08/01/2618398.html
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
0. 前言
通常我们在windows上把网站布置在IIS上;在Linux上的话,使用nginx布置网站。对于网页的后端程序,我们比较容易想到的是:
对于静态内容,请求内容,返回内容即可,这通常由网站服务器直接处理响应。
对于动态内容:请求来了,后端程序基于用户的信息识别及用户的请求内容,给出设计好的响应。
问题来了,后端程序如何接受数据,如何响应数据?
IIS/Nginx作为了网站端口的监听方,浏览器访问相关的数据都是传给它,并与它交互。而后端程序如果想接受/响应数据请求,就要和网站服务进行交互。我们定义的后端响应程序需要注册到网站服务器,交互方式:
用户浏览器 <-> 网站服务器IIS/Nginx <-> 后端程序
当然了,后端程序通常还会要访问数据库等资源:
后端程序<->数据库等资源
网站服务器IIS/Nginx <-> 后端程序之间的接口格式,数据传递方法,配合关系是我们关注的重点,也就是下面的介绍。
1. CGI/FastCGI/WCGI介绍
这三种是常用的几种后端程序的接口形式:
CGI: Common Gateway Interface
每个请求来了,启动一个进程去服务这个请求;收到一个请求,输出一个响应。
FastCGI:Fast Common Gateway Interface
使用进程/线程池来处理一连串的请求,这些进程/线程由FastCGI服务器管理,而不是Web服务器。
1. 性能:通过进程/线程池规避了CGI开辟新的进程的开销。
2. 兼容:非常容易改造现有CGI标准的程序。
3. 语言无关:FastCGI是一套标准,理论上讲只要能进行标准输出(stdout)的语言都可以作为FastCGI标准的Web后端。
WSGI:Web Server Gateway Interface
Web服务器网关接口是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。
当Web Server收到一个请求后,可以通过Socket把环境变量和一个Callback回调函数传给后端Web应用,Web应用在完成页面组装后通过Callback把内容返回给Web Server。
优点:
1. 异步化,通过Callback将Web请求的工作拆解开,可以很方便的在一个线程空间里同时处理多个Web请求。
2. 方便进行各种负载均衡和请求转发,不会造成后端Web应用阻塞。
Nginx上部署Fastcgi程序
-
下载spawn-fcgi,make, 用于包装fastcgi的app调用
-
下载fcgi2,make并且install,用于编写fastcgi-app的接口库
-
编写一个简单的fastcgi-app,例如
#include
#include <fcgi_stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{
int count = 0;
while(FCGI_Accept() >= 0)
{
printf( “HTTP/1.1 200 OK;\r\n” );
printf( “Content-type: application/json;charset=UTF-8\r\n\r\n” );
printf( “{“data”: “123”}” );
}
return 0;
} -
编译运行该程序
make:
g++ helloFastCgi.c -o hello -L/usr/local/lib -lfcgi -Wl,-R /usr/local/lib
run:
./spawn-fcgi -a xxx.xxx.xxx.xxx -p 10001 -f /home/render/build/nginx/sbin/hello -F -
在nginx网站的配置中添加,对应某个请求的响应:
location = /auth.cgi {
fastcgi_pass xxx.xxx.xxx.xxx:10001;
fastcgi_index index.cgi;
include fastcgi.conf;
}
然后置配置文件生效:
nginx -s reload -
浏览器上请求该auth.cgi网页,就会看到fastcgi后端程序的返回内容
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)