後端程序與fastcgi在nginx上配置

參考: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程序

  1. 下載spawn-fcgi,make, 用於包裝fastcgi的app調用

  2. 下載fcgi2,make並且install,用於編寫fastcgi-app的接口庫

  3. 編寫一個簡單的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;
    }

  4. 編譯運行該程序
    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

  5. 在nginx網站的配置中添加,對應某個請求的響應:
    location = /auth.cgi {
    fastcgi_pass xxx.xxx.xxx.xxx:10001;
    fastcgi_index index.cgi;
    include fastcgi.conf;
    }
    然後置配置文件生效:
    nginx -s reload

  6. 瀏覽器上請求該auth.cgi網頁,就會看到fastcgi後端程序的返回內容

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章