zoukankan      html  css  js  c++  java
  • 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
    
    ");
            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 
    
    ");
                                    }
                            } else {
                                    echoHTML("getfile.cgi only support HTTP GET 
    
    ");
                            }
                    } else {
                            echoHTML("notfound REQUEST_METHOD
    
    ");
                    }
            }
            return 0;
    }
  • 相关阅读:
    iOS 实现多个按钮,点选一个其它都取消选中状态的最佳方法
    iOS隐藏导航条1px的底部横线
    ios url 编码和解码
    ClassLoader
    Java多线程
    Tomcat8-启动脚本分析
    Cmd
    java命令
    Http报文
    断点续传原理
  • 原文地址:https://www.cnblogs.com/hero4china/p/nginx-fcgi.html
Copyright © 2011-2022 走看看