nginx支持cgi(c,c++)

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

 

原文链接:https://www.cnblogs.com/hero4china/p/nginx-fcgi.html
本文来源 互联网收集,文章内容系作者个人观点,不代表 本站 对观点赞同或支持。如需转载,请注明文章来源,如您发现有涉嫌抄袭侵权的内容,请联系本站核实处理。

© 版权声明

相关文章