日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

实战:Nginx + FastCGI 程序(C/C++) 搭建高性能web server

發布時間:2025/3/21 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实战:Nginx + FastCGI 程序(C/C++) 搭建高性能web server 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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進程管理程序。

? 因此,nginx 通過?spawn-fastcgi?調用 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所示。

? ? ? ? ? ? ?

FastCGI接口方式在腳本解析服務器(CGI應用程序服務器)上啟動一個或者多個守護進程對動態腳本進行解析,這些進程就是FastCGI進程管理器,或者稱為FastCGI引擎。 spawn-fcgi與PHP-FPM都是FastCGI進程管理器(支持PHP和C/C++?)。?

?

3.環境部署 :??需要安裝nginx、spawn-fastcgi、fastcgi

a)nginx的安裝,參考本博客nginx模塊安裝教程

b) 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的安裝目錄下)

c)??fastcgi庫的安裝

? ?訪問https://github.com/FastCGI-Archives/fcgi2地址下載fastcgi庫源碼

? ./configure? ??如果沒有configure,請先執行./autogen.sh

? ?make

? ?make install

?

4.Demo和web發布

4.1.Demo程序

#include <fcgi_stdio.h> ?
#include <unistd.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; ?
} ?

?[編譯]???g++ demo.cc?-o demo? -lfcgi???

?

報錯:缺少庫libfcgi.so.0?

解決辦法:把so的庫路徑添加到/etc/ld.so.conf,并執行ldconfig更新一下

參考:https://www.cnblogs.com/zhming26/p/6164131.html

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;

????}

?

加入了一行配置   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

這個配置的意思是 在瀏覽器中訪問的.php文件,實際讀取的是?$document_root(網站根目錄)下的.php文件 -- 也就是說當訪問127.0.0.1/index.php的時候,需要讀取網站根目錄下面的index.php文件,如果沒有配置這一配置項時,nginx不回去網站根目錄下訪問.php文件,所以返回空白

配置項目中:include fastcgi_params; fastcgi_params 文件中含有各個nginx常量的定義,默認情況?SCRIPT_FILENAME = $fastcgi_script_name

?

? 注意:?如果使用gedit編輯器,注意要用tab鍵縮進,空白鍵會報錯。

??

?

4)重啟nginx或者重新加載配置文件

5)打開瀏覽器訪問一下吧

? ? ? ?http://localhost/demo.cgi

6)效果

?

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的实战:Nginx + FastCGI 程序(C/C++) 搭建高性能web server的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。