【入門篇】Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署發佈

因爲最近工做的須要,本人學習了一下利用高性能web server - Nginx,來發布C/C++編寫的fastCGI程序,詳細細節以下。
 
 
1.介紹
    Nginx - 高性能web server,這個不用多說了,你們都知道。
    FastCGI程序 - 常駐型CGI程序,它是語言無關的、可伸縮架構的CGI開放擴展,其主要行爲是將CGI解釋器進程保持在內存中並所以得到較高的性能。
    Nginx要調用FastCGI程序,須要用到FastCGI進程管理程序(由於nginx不能直接執行外部的cgi程序,咱們可以使用lighttpd中的spawn-fastcgi來讓nginx可支持外部cgi運行。也有其餘方法安裝nginx-fcgi來讓nginx支持cgi,這裏是使用spawn-fastcgi的方法),來達到調用FastCGI程序的目的。Nginx自己沒有集成相似的模塊,而Apache具有該功能模塊,因此不須要額外安裝FastCGI進程管理程序。
 
2.工做原理
    Nginx不支持對外部程序的直接調用或者解析,全部的外部程序(包括PHP)必須經過FastCGI接口來調用。FastCGI接口在Linux下是socket(這個socket能夠是文件socket,也能夠是ip socket)。爲了調用CGI程序,還須要一個FastCGI的wrapper(wrapper能夠理解爲用於啓動另外一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。
    當Nginx將CGI請求發送給這個socket的時候,經過FastCGI接口,wrapper接收到請求,而後派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本並讀取返回數據;接着,wrapper再將返回的數據經過FastCGI接口,沿着固定的socket傳遞給Nginx;最後,Nginx將返回的數據發送給客戶端。這就是Nginx+FastCGI的整個運做過程,如圖1所示。
 
    
​圖1 Nginx+FastCGI運行過程​
 
    FastCGI接口方式在腳本解析服務器(CGI應用程序服務器)上啓動一個或者多個守護進程對動態腳本進行解析,這些進程就是FastCGI進程管理器,或者稱爲FastCGI引擎。 spawn-fcgi與PHP-FPM都是FastCGI進程管理器(支持PHP和C/C++​)。​
    
     介紹到這裏,你們 應該都對該模式有了必定的瞭解,下面開始進行實戰!     
 
3.環境部署
3.1.Nginx的安裝、部署與配置
    nginx下載目錄 http://nginx.org/en/download.html
    這咱們使用的是nginx-1.5.10
    
     [安裝]
    下載之後解壓並安裝(請記得看README)
     ./configure (注意了相似checking for *** ... not found項,多是依賴包沒有,則須要安裝依賴包)
    
    缺乏 pcre,則須要額外安裝 http://www.pcre.org/ (或者採用apt-get或yum的安裝方式)
    缺乏 zlib,則須要額外安裝 http://www.zlib.net/ (或者採用apt-get或yum的安裝方式)  
    缺乏 OpenSSL,則須要額外安裝 http://www.openssl.org (或者採用apt-get或yum的安裝方式)  
     若是須要配置安裝額外的功能模塊,能夠參考這裏 http://wiki.codemongers.com/NginxChsInstall
 
     make
     make install (默認安裝到 /usr/local/nginx
 
     [配置和管理]     
    1)執行選項
        -c </path/to/config> 爲 Nginx 指定一個配置文件,來代替缺省的。不輸入則使用默認的配置文件。
        -t 不運行,而僅僅測試配置文件。nginx 將檢查配置文件的語法的正確性,並嘗試打開配置文件中所引用到的文件。
        -v 顯示 nginx 的版本。
        -V 顯示 nginx 的版本,編譯器版本和配置參數。
 
    2)檢查配置文件
         sudo ./nginx -t
        nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
        nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
   
     3)啓動 - 默認和特殊
         /usr/local/nginx/sbin/nginx (默認啓動方式)
         /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf (指定配置文件啓動)
    
    4)查看nginx進程號(master是主進程)
         ps -ef | grep nginx 
 
    5)從新加載配置文件
         sudo kill -HUP [nginx主進程號]
        經過系統的信號控制 Nginx
        可使用信號系統來控制主進程。默認,nginx 將其主進程的 pid 寫入到 /usr/local/nginx/logs/nginx.pid 文件中。經過傳遞參數        給 ./configure 或使用 pid 指令,來改變該文件的位置。
        
        主進程能夠處理如下的信號:
        命令 說明 備註
        TERM, INT 快速關閉  
        QUIT 從容關閉  
        HUP 重載配置 用新的配置開始新的工做進程    從容關閉舊的工做進程
        USR1 從新打開日誌文件  
        USR2 平滑升級可執行程序  
        WINCH 從容關閉工做進程  
 
    6)默認目錄結構
        主目錄: /usr/local/nginx/
        配置目錄: /usr/local/nginx/conf/
        root目錄: /usr/local/nginx/html/
        可執行文件路徑: /usr/local/nginx/sbin/
 
3.2.spawn_fastcgi的安裝、部署與配置
    spawn_fastcgi  https://github.com/lighttpd/spawn-fcgi 
    這裏使用的是1.6.3的版本 https://github.com/lighttpd/spawn-fcgi/releases/tag/v1.6.3
    
    下載之後解壓並安裝(請記得看README)
    若是沒有 configure,請先執行 ./autogen.sh,生成configure
    
    ./configure
    make
 
    編譯好之後,將可執行文件移動到nginx的sbin目錄下
     cp ./src/spawn-fcgi /usr/local/nginx/sbin/ (cp到nginx的安裝目錄下)
 
 
3.3.fastcgi庫的安裝(庫絕對不是必須的,以爲技術好的大牛能夠本身寫)
    庫地址  http://www.fastcgi.com/dist/fcgi.tar.gz
    下載之後,解壓並安裝 (默認安裝)
     ./configure
    make
    make install
    
4.Demo和web發佈
4.1.Demo程序
     [CGI程序]    
[cpp]  view plain  copy
 
  1. #include <fcgi_stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. int main() {  
  5.     int count = 0;  
  6.     while (FCGI_Accept() >= 0) {  
  7.         printf("Content-type: text/html\r\n"  
  8.                 "\r\n"  
  9.                 ""  
  10.                 "FastCGI Hello!"  
  11.                 "Request number %d running on host%s "  
  12.                 "Process ID: %d\n", ++count, getenv("SERVER_NAME"), getpid());  
  13.     }  
  14.     return 0;  
  15. }  
     [編譯]
     g++ demo.cc -o demo  -lfcgi​  
    
    直接運行可執行文件,看看可否正常運行。若是出現缺乏庫libfcgi.so.0,則本身須要手動把 /usr/local/lib/libfcgi.so.0庫創建一個連接到/usr/lib/目錄下: ln -s /usr/local/libfcgi.so.0 /usr/lib/(或者把so的庫路徑添加到/etc/ld.so.conf,並執行ldconfig更新一下)
 
4.2.Web發佈
    1)將CGI可執行程序移動到nginx的安裝目錄下 /usr/local/nginx/cgibin (文件夾不存在則本身建立) 
    
    2)啓動spawn-fcgi管理進程,並綁定server IP和端口(不要跟nginx的監聽端口重合)
      /usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 8088 -f /usr/local/nginx/cgibin/demo
    
    查看一下9002端口是否已成功: netstat -na | grep 8088
​   
    3)更改 nginx.conf配置文件,讓nginx轉發請求
    
    在http節點的子節點-"server節"點中下添加配置
    location ~ \.cgi$ {
        fastcgi_pass 127.0.0.1:8088;
        fastcgi_index index.cgi;
        fastcgi_param SCRIPT_FILENAME fcgi$fastcgi_script_name;

        include fastcgi_params;
    }
 
    4)重啓nginx或者從新加載配置文件
    從新加載配置文件
     sudo kill -HUP [pid]
    或者
    重啓nginx     
    killall nginx
​    ./nginx
 
    5)打開瀏覽器訪問一下吧
    http://localhost/demo.cgi
 
    
 
    搞定收工,內心又小小的激動了一把!
 
allenrlin
2014/2/18
    
    參考文獻與資料
    [1]Nginx+FastCGI運行原理​  http://book.51cto.com/art/201202/314840.htm
    ​[2]Nginx下配置FastCGI ​ http://www.cppblog.com/woaidongmao/archive/2011/06/21/149090.html
    [3]nginx+fastcgi+c/c++搭建高性能Web框架​  ​http://blog.csdn.net/marising/article/details/3932938​
    [4]什麼是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI  ​http://www.mike.org.cn/articles/what-is-cgi-fastcgi-php-fpm-spawn-fcgi/​
相關文章
相關標籤/搜索