前段时间用我修改了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() >= ) {
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 ;
}

nginx支持cgi(c,c++)的更多相关文章

  1. 配置nginx,支持php的pathinfo路径模式

    nginx模式默认是不支持pathinfo模式的,类似index.php/index形式的url会被提示找不到页面.下面的通过正则找出实际文件路径和pathinfo部分的方法,让nginx支持path ...

  2. centos下配置nginx支持php

    添加nginx 默认主页index.php vim .../etc/nginx/conf.d/default.conf location / { root   /usr/share/nginx/htm ...

  3. Nginx支持LInux的软链接或硬链接

    在我们配置nginx的时候,有些时候,大部分都是讲root指向真实的目录.但是有些时候,我们需要指向一个软链接.但是配置的时候,发现会有问题. 我们可以通过以下的方法,来解决,让nginx支持软链接/ ...

  4. Nginx支持比Apache高并发的原因

    1.先从各自使用的多路复用IO模型说起:  select模型:(apache使用,由于受模块等限制,用的不多)   单个进程能够 监视的文件描述符的数量存在最大限制 select()所维护的 存储大量 ...

  5. 配置Nginx支持SSL SNI(一个IP绑定多个证书) 以及Haproxy实现多域名证书

    概述 传统的每个SSL证书签发,每个证书都需要独立ip,假如你编译openssl和nginx时候开启TLS SNI (Server Name Identification) 支持,这样你可以安装多个S ...

  6. Nginx 支持 WAF 防护功能实战

    WAF(Web Application Firewall),中文名称叫做“Web应用防火墙 WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提 ...

  7. Nginx 支持 CI 框架的配置并禁止使用 ip 访问

    #CIserver {        listen      80;        server_name www.ci.com;        index       index.php index ...

  8. 让服务器apache/iis/nginx支持.apk/ipa文件下载

    服务器iis支持.apk文件下载的设置 IIS服务器不能下载.apk文件的原因:iis的默认MIME类型中没有.apk文件,所以无法下载. IIS服务器不能下载.apk文件的解决办法:既然.apk无法 ...

  9. ruby on rails 2.3+的版本不再支持cgi

    ruby on rails 2.3+的版本不再支持cgi了,恶心到了,换其他框架,看了款cramp,完全没资料,完全不让人入门 操蛋的厉害,ruby果然是小众的窝里乐,放弃使用

随机推荐

  1. TYVJ P1051 选课 Label:多叉转二叉&&树形dp(虐心♥)

    描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修了这M门课并考核通过就能获得 ...

  2. TV测试中的按键长按操作模拟

    从UiAutomator在TV测试中的局限性说起: 智能TV的操作和手机的操作有很大不同,一般智能TV的操作为遥控器按键操作,来向TV OS发送  KeyCode,以完成指定操作. UiAutomat ...

  3. java面试题中常见的关于String类问题总结

    问题1: String s1 = “abc”;String s2 = “abc”;System.out.println(s1 == s2); 这里的结果是true. 由于字符串是常量(内存中创建对象后 ...

  4. 带你学C,带你飞——入门

  5. 【C语言】14-返回指针的函数与指向函数的指针

    前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...

  6. Vim 学习资料

    VIM中文手册 简明 Vim 练级攻略 所需即所获:像 IDE 一样使用 vim

  7. IIS7 Appcmd.exe 使用

    如果您运行的是 64 位 Windows,请从 %windir%\system32\inetsrv 目录而不是 %windir%\syswow64\inetsrv 目录中使用 Appcmd.exe. ...

  8. php目录文件下有php-ini-development和php.ini-production。

    1.apache: 只需要你解压到相应目录既可以,比如我这边将下载的apache文件解压到 C:\Apache24: bin目录下有: ApacheMonitor.exe和httpd.exe可用于服务 ...

  9. 获取文本文件的第N行内容

    在PowerShell中,可以通过Get-Content这个cmdlet来获取文本文件的内容.Get-Content将一个文本文件读取到一个数组中,每一个数组元素就是文件的一行内容.比如一个文本文件内 ...

  10. php运行模式的比较(转)

    PHP运行模式有4钟:1)cgi 通用网关接口(Common Gateway Interface))2) fast-cgi 常驻 (long-live) 型的 CGI3) cli  命令行运行   ( ...