【入門篇】Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署發布
阿新 • • 發佈:2017-07-01
框架 logs ice term con scrip 什麽 5.1 cal 由於最近工作的需要,本人學習了一下利用高性能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
查看一下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/?
-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
- #include <fcgi_stdio.h>
- #include <stdlib.h>
- int main() {
- int count = 0;
- while (FCGI_Accept() >= 0) {
- printf("Content-type: text/html\r\n"
- "\r\n"
- ""
- "FastCGI Hello!"
- "Request number %d running on host%s "
- "Process ID: %d\n", ++count, getenv("SERVER_NAME"), getpid());
- }
- return 0;
- }
查看一下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/?
【入門篇】Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署發布