百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Nginx + FastCGI 程序(C/C++) 搭建高性能web service

myzbx 2024-12-17 15:13 15 浏览

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的整个运作过程,如图所示。 ?

FastCGI接口方式在脚本解析服务器(CGI应用程序服务器)上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是FastCGI进程管理器,或者称为FastCGI引擎。 spawn-fcgi与PHP-FPM都是FastCGI进程管理器(支持PHP和C/C++?)。?

介绍到这里,大家应该都对该模式有了一定的了解,下面开始进行实战!

3.环境部署

3.1.Nginx的安装、部署与配置

nginx使用的是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的版本

下载以后解压并安装(请记得看README)

如果没有configure,请先执行./autogen.sh,生成configure

./configure

make

编译好以后,将可执行文件移动到nginx的sbin目录下

cp ./src/spawn-fcgi /usr/local/nginx/sbin/ (cp到nginx的安装目录下)

3.3.fastcgi库的安装(库绝对不是必须的,觉得技术好的大牛可以自己写)

下载以后,解压并安装 (默认安装)

./configure

make

make install

4.Demo和web发布

4.1.Demo程序

[CGI程序]

#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;

}

[编译]

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)最后打开浏览器访问一下吧

注:需要C/C++ Linux服务器开发学习资料私信“资料”(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

相关推荐

一键生成高颜值图表!让你的文字瞬间有画面感,职场人必备!

哈喽,打工人们!忙碌的周中,大熊又来给你们带来一个超实用的效率神器啦!这次的宝藏网站绝对是那种用过就离不开的"真香"型产品!假设你明天就要做重要汇报,可面对一大堆密密麻麻的文字材料,你...

批量将 Word 转换为 PDF/Excel/Txt/图片等多种格式

Word文档是我们工作中经常会打交道的一种文档格式,我们也经常会有需要对Word文档进行格式转换的需求,比如将Word格式转换为PDF、将Word文档转换为Excel、将Word...

绝了!一键用AI生成高颜值动态PPT(附详细步骤+Prompt)

大家好,我是一名酷爱研究AI的产品经理,最近我有个新发现:那些花了你3天做出来的PPT,现在用AI可以1小时搞定!而且颜值还高!为什么AI做PPT比传统方式效率高10倍?我用一张图就能告诉你:AI生成...

ztext - 简单几行代码创建酷炫3D特效文字的开源JS库

把网页上的文字变成酷炫的3D风格,还能制作旋转动效,有了ztext.js,只需要几行代码。ztext能做什么ztext.js是一个能把常规的平面文字变成3D样式的前端开源代码库,让开发者...

文字内插入小图片,也太可爱了吧(文字中怎么插图片)

图文排版H5手机版秀米有小伙伴留言问添加图片的时候可不可以把图片添加到文字之间比如下面这句话中的小贴纸图片后面可以接着输入文字其实吧这就是咱们的『文字内插入小图片』功能嘛可以用来在文字内加个表情包又...

Linux环境下C++代码性能分析方法(linux怎么写c++代码)

技术背景在开发C++应用程序时,找出代码中运行缓慢的部分是进行性能优化的关键。在Linux系统上,有多种工具和方法可用于对C++代码进行性能分析,每种方法都有其特点和适用场景。实现步骤手动中断调试法在...

SVG互动图文,让你的文章更有趣!教你4种简单易学的黑科技玩法!

如果你是一个公众号创作者,那么你一定想知道如何让你的文章更加吸引人,更加有趣,更加有创意。你可能已经尝试过各种图文排版技巧,但是你是否知道,有一种黑科技可以让你的文章变得更加酷炫,更加互动,更加爆款?...

Videoscribe怎么实现实心中文汉字的手绘制作

很多朋友在制作手绘视频的时候,不知道怎么输入实心的中文汉字,之前我们已经给大家分享了怎么输入汉字的方法,但是有一点遗憾的是输出的汉字是空心的手绘展示,在视觉上并不是非常的美观。经过大家不断的探索,终于...

一款用于将文本转化成图表的现代化脚本语言

大家好,又见面了,我是GitHub精选君!今天要给大家推荐一个GitHub开源项目terrastruct/d2,该项目在GitHub有超过10.3kStar,用一句话介绍该项目就是:...

探秘 Web 水印技术(制作水印网站)

作者:fransli,腾讯PCG前端开发工程师Web水印技术在信息安全和版权保护等领域有着广泛的应用,对防止信息泄露或知识产品被侵犯有重要意义。水印根据可见性可分为可见水印和不可见水印(盲水印)...

不忍心卸载的五款神仙工具(不忍心卸载的五款神仙工具是什么)

001.效率工具uTools-装机必备的生产力工具集uTools是一款非常强大的可以装下几乎所有效率工具的电脑生产力工具集,目前拥有Windows、Mac和Linux三个版本。软件界面...

「SVG」飞花令!这份最高检工作报告“超有料”

原标题:【SVG】飞花令!这份最高检工作报告“超有料”栏目主编:秦红文字编辑:沈佳灵来源:作者:最高人民检察院...

svg|2025政府工作报告,有没有你关心的数据?

··<setattributeName="visibility"begin="click+0s"dur="1ms"fill="freeze"restart="never"to="hi...

videoscribe只能输入英文,如何输入中文文本?

videoscribe只能输入英文,如何输入中文文本?打开VideoScribe软件,打开要添加中文字体的位置。打开Photoshop并在文件中创建一个新的透明背景图层。注意:必须是透明背景层。...

五个流行的SVG在线编辑器(svg编辑工具)

随着响应网络的发展,越来越多的高质量的SVG在线编辑器被公众所熟知。SVG矢量图形也越来越受欢迎,以便在任何设备上呈现图像,甚至一些易于使用的SVG在线编辑器,可以替代PS,本文总结了五种流行的SVG...