Nginx FastCGI 开发(C/C++)

#一、简述 Nginx支持使用FastCGI。它与CGI的区别在于,不需要重复启动CGI进程,从而节省了创建进程和结束进程的开销,避免了不必要的开销,提高了效率。

具体关于CGI和FastCGI的原理和运行流程请请参考这篇文章

#二、开发环境 | 名称 | 版本 | |:------------: | :---------------------------------: | | 操作系统 | Ubuntu Server 12.04 64bit | | Nginx | 1.2.9 | | spawn-fcgi | 1.6.4 | | libfcgi | 最新版 |

其中spawn-fcgi是FastCGI的管理程序,负责启动FastCGI并创建和Nginx的连接。libfcgi是方便FastCGI开发的工具包。

nginx 和 spawn-fcgi直接下载源代码就可以了,传送门:Nginx 1.2.9 spawn-fcgi 1.6.4

接下來的操作都一样,解压源代码,./configure,make,make install,注意install的时候要有root权限。貌似libfcgi的源代码网站关闭了,所以建议使用二进制方法安装。在Ubuntu上直接apt-get:

sudo apt-get update
sudo apt-get install libfcgi-dev

#三、一个简单的例子:Hello World! ##1、功能 下面通过一个简单的FastCGI的实例来介绍开发过程,这个FastCGI接收用户的请求,然后向用户返回Hello World! 和用户请求的次数,以及请求中带有的参数。

##2、代码结构 FastCGI的代码结构应该是:对所需的资源进行初始化,然后在一个循环里不停的使用FCGI_Accept()等待请求,然后处理请求,输出响应。FastCGI比CGI高效的地方就体现在这里,用伪代码表示如下:

#include <fcgi_stdio.h>

int main() {
    初始化操作
    while(FCGI_Accept() >= 0) {
        处理请求
        输出响应   
    }

    return 0;
}

FCGI_Accept()从HTTP服务器接收一个请求,并且为请求创建一个与CGI兼容的运行环境(execution environment)。

如果程序当做CGI被调用,则第一次调研FCGI_Accept()函数是一个空操作(no-op),再次调用则会返回-1。这样做就可以使得正确编码的FastCGI程序(即按照上面结构来编码)只处理一个请求然后退出,表现的就像CGI程序一样。

如果程序当错FastCGI被调用,则首次调用FCGI_Accept()函数表示程序已经完成了初始化操作并准备好接收第一个请求了。接下来再调用FCGI_Accept()表示程序已经处理完了当前的请求并准备好接收一个新的请求。程序可以调用FCGI_Finish()来表示处理完了当前的请求,但是不接受新的请求。一段时间后,程序准备好再次接收新的请求时,可以再调用FCGI_Accept()

有关FCGI_Accept()FCGI_Finish()的具体用法请参考Man Page: FCGI_Accept()FCGI_Finish()。 中文翻译: FCGI_Accept()FCGI_Finish()

##3、获取请求中的参数 FastCGI通过环境变量来传递请求的相关数据,具体内容如下表(内容来自CGI101):

环境变数说明
DOCUMENT_ROOTThe root directory of your server
HTTP_COOKIEThe visitor's cookie, if one is set
HTTP_HOSTThe hostname of the page being attempted
HTTP_REFERERThe URL of the page that called your program
HTTP_USER_AGENTThe browser type of the visitor
HTTPS"on" if the program is being called through a secure server
PATHThe system path your server is running under
QUERY_STRINGThe query string
REMOTE_ADDRThe IP address of the visitor
REMOTE_HOSTThe hostname of the visitor
REMOTE_PORTThe port the visitor is connected to on the web server
REMOTE_USERThe visitor's username (for .htaccess-protected pages)
REQUEST_METHODGET or POST
REQUEST_URIThe interpreted pathname of the requested document or CGI (relative to the document root)
SCRIPT_FILENAMEThe full pathname of the current CGI
SCRIPT_NAMEThe interpreted pathname of the current CGI (relative to the document root)
SERVER_ADMINThe email address for your server's webmaster
SERVER_NAMEYour server's fully qualified domain name (e.g. www.cgi101.com)
SERVER_PORTThe port number your server is listening on
SERVER_SOFTWAREThe server software you're using (e.g. Apache 1.3)

##4、代码

#include <fcgi_stdio.h>
#include <stdlib.h>

int main() {
    unsigned int req_count = 0;

    while(FCGI_Accept() >= 0) {
        FCGI_printf("Content-type: text/html\r\n\r\n");
        FCGI_printf("<title>Hello World!</title>"
            "<h1>Hello World!</h1>");
        FCGI_printf("<h2>request times: %u</h2>", ++req_count);
        FCGI_printf("QUERY_STRING: %s</br>", getenv("QUERY_STRING"));
        FCGI_printf("REMOTE_ADDR: %s</br>", getenv("REMOTE_ADDR"));
    }   

    return 0;
}

注意一点,输出内容必须带有\r\n把响应的头部和正文分开,响应的头部可以为空,但是\r\n不可以省略。否则Nginx会出现Error页面。

Error页面

##5、编译 编译时记得添加-lfcgi选项表示要链接libfcgi库。

$ g++ -W hello_fcgi.cpp -o hello_fcgi -lfcgi

#四、使用FastCGI ##1、修改Nginx配置文件 首先需要修改一下Nginx的配置文件nginx.conf,指定使用FastCGI的地方。比如我们想让所有访问/fcgi这个路径的请求都交给hello_fcgi程序处理,那么就在server块中添加如下内容:

location /fcgi {
    fastcgi_pass 127.0.0.1:8000; 
    fastcgi_index index.cgi;
    include fastcgi.conf;
}

这段内容告诉Nginx处理访问/fcgi路径的请求的规则,以及FastCGI管理器的IP和端口号和一些其他配置,Nginx收到请求后会把请求转发给这个地址,然后会重定向到FastCGI程序。 通知Nginx重新读取配置文件:

$ sudo /usr/local/nginx/sbin/nginx -s reload

##2、使用FastCGI管理器启动FastCGI程序 现在使用之前安装的spawn-fcgi来启动刚才编写的FastCGI程序:

$ spawn-fcgi -p 8081 -f ./hello_fcgi

其中-p选项指定绑定的端口号,还可以使用-a选项指定绑定的ip地址,注意这里的IP和端口号要和nginx.conf中配置的匹配。-f选项指定FastCGI程序的位置。spawn-fcgi的更多用法可以使用-h参数来查看。正常情况下成功启动后spawn-fcgi会提示如下信息:

spawn-fcgi: child spawned successfully: PID: 52825

##3、效果 现在可以使用浏览器访问Nginx服务器的/fcgi路径查看效果了:

FastCGI效果


参考文献:

Nginx + CGI/FastCGI + C/Cpp

FastCGI开发者套件

CGI Programming 101

转载于:https://my.oschina.net/u/989096/blog/887078

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nginx[ 1] 是由 俄罗斯 工程师 Igor Sysoev 开发 的 一个 高性能 Web 服务器, 各方 面的 表现 均 远 超 传统 的 Apache, 已经 应用于 诸多 顶 级 互 联网 公司, 为 全世界 数以亿计 的 网 民 提供 着 出色 的 服务。 根据 某 权威 公司 分析 统计, 现在 它 已是 市场 份额 第二 大的 Web 服务器, 并且 仍在 快速 增长。 除了 最 引人注目 的 高性能 和 高 稳定性 外, Nginx 的 另一个 突出 特点 是 高 扩展性, 其 灵活 优秀 的 模块化 架构 允许 在 不修 改 核心 的 前提下 增加 任意 功能。 自 2004 年 正式 发布 以来, Nginx 已经 拥有 了 百余 个 官方 及 非官方 的 功能 模块( 如 fastcgi、 memcache、 mysql、 lua 等), 这 使得 Nginx 超越 了 一般 意义上 的 Web 服务器, 成为 了 一个 近乎“ 全能” 的 应用 服务器。 Nginx 以 纯 C 语言 实现, 故 开发 扩展 功能 模块 也 大多 使用 C 语言。 但 由于 C 语言 固有 的“ 中级 语言” 特性, 难以 实现 良好 的 软件 结构, 编写、 调试 代码 都比 较 麻烦—— 特别是 对于 初学者。 本书 将 在 解析 Nginx 源 码 的 基础上 详细 讲解 使用 C++ 和 Boost 程序 库 来 开发 Nginx 模块, 充分 利用 现代 C++ 的 新 特性 和 标准 库/ Boost 库, 让 Nginx 的 模块 开发 变得 更加 便捷 和 轻松 愉快。 罗剑锋. Nginx模块开发指南:使用C++11和Boost程序库 (Kindle 位置 348-357). 电子工业出版社. Kindle 版本.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值