參考: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)