前段时间用我修改了tinyhttpd,让其cgi支持文件流,感觉满小巧,就应用上了。最近访问请求量上来而来,它对socket的各种异常状态处理不好,对于慢速的链接会占用我的线程。虽然我一直想仿出tencentwebproxy,可惜人懒且没空。用用nginx也不错,配置其支持fcgi,应用代码稍微改改就支持了,效果很不错,用webbench和wrk测试了一下压力,效果( ^_^ )不错嘛。
操作系统:redhat 5u2 x86_64.
1. nginx篇
下载pcre和nginx的源码包进行安装,我也不废话了,经典的configure && make && make install
安装完毕后,采用默认的配置文件启动如 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 是采用master+n*worker模型,查询pid 用 ps -ef | grep nginx | grep master | awk '{print $2}'
命令 kill -HUP `cat /usr/local/nginx/logs/nginx.pid` #重新加载配置,并开启新的工作进程,关闭就的进程,此操作不会中断请求.
nginx -t 测试配置文件是否正确. 在运行时需要重新加载配置的时候,此命令非常重要,用来检测所修改的配置文件是否有语法错误.
2. fastcgi篇
nginx是支持fastcgi的。然而我们需要下一个fastcgi进程管理器,启动它才能执行fastcgi程序。对于ngingx,我们要配置conf.nginx来设置如何支持fastcgi。
在web服务器方面 在对数据进行处理的进程方面
cgi fork一个新的进程进行处理(相当于可执行程序,只需echo) 读取参数,处理数据,然后就结束生命期
fastcgi 用tcp方式跟远程机子上的进程或本地进程建立连接(相当于一个动态库) 要开启tcp端口,进入循环,等待数据的到来,处理数据
下载spawn-fcgi-1.6.3.tar.gz : http://redmine.lighttpd.net/news/spawn7
(这个spawn-fcgi就是fastcgi进程管理器。spawn-fcgi已经从lighthttd中分离出来,独立成一个单独项目。)
$ ./configure && make
$ cp ./src/spawn-fcgi /usr/local/nginx/sbin/
写fastcgi程序还需要fastcgi的库和头文件支持,下载fcgi.tar.gz,编译安装。
由于我是64位的机器,fastcgi运行时可能找不到动态库,于是加上 ln -s /usr/local/lib/libfcgi.so.0 /usr/lib64/libfcgi.so.0
3. 运行调试篇
比如我编译出来的程序为streamfile
类似命令可以拥有后台调试 /usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9001 -C 25 -F 1000 -f ./streamfile
-p是指定fastcgi控制器绑定的TCP端口listen的.
如果你想调试单个fastcgi程序,可以把-f换成-n.
-F指定spawn-fcgi将fork多少个child进程。之后nginx对于此cgi的请求就可以并发了,显然这里设置的直接并发量是1000.
其他参数可以help看看
4. fcgi例子
网上的例子全是官网的HelloWorld,实在是令人遗憾的一件事。fcgi我的功能用的少,也就没有造成出按照url,method之类各种分发和跳转的web框架了。
下面给出一个小例子,如果有问题,就自己调试调试。
#include "fcgi_config.h" #include <stdlib.h> #ifdef HAVE_UNISTD_H #include <unistd.h> #endif #ifdef _WIN32 #include <process.h> #else extern char **environ; #endif #include "fcgi_stdio.h" #include "fcgiapp.h" #include <stdint.h> #include <string.h> void echoHTML(const char * str) { printf("Content-Type:text/plain;charset=us-assii\n\n"); printf(str); } int main() { char *inputstring; char *method; while (FCGI_Accept() >= 0) { method = FCGX_GetParam("REQUEST_METHOD", environ); if (method != NULL) { if (!strcmp(method, "GET")) { inputstring = FCGX_GetParam("QUERY_STRING", environ); if (inputstring != NULL) { simple_split_get_params(inputstring); } else { echoHTML("QUERY_STRING is NULL \n\n"); } } else { echoHTML("getfile.cgi only support HTTP GET \n\n"); } } else { echoHTML("notfound REQUEST_METHOD\n\n"); } } return 0; }
标签:cgi,fcgi,c++,nginx,usr,include,local,fastcgi From: https://www.cnblogs.com/kn-zheng/p/18038920