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() >= ) {
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++)的更多相关文章
- 配置nginx,支持php的pathinfo路径模式
nginx模式默认是不支持pathinfo模式的,类似index.php/index形式的url会被提示找不到页面.下面的通过正则找出实际文件路径和pathinfo部分的方法,让nginx支持path ...
- centos下配置nginx支持php
添加nginx 默认主页index.php vim .../etc/nginx/conf.d/default.conf location / { root /usr/share/nginx/htm ...
- Nginx支持LInux的软链接或硬链接
在我们配置nginx的时候,有些时候,大部分都是讲root指向真实的目录.但是有些时候,我们需要指向一个软链接.但是配置的时候,发现会有问题. 我们可以通过以下的方法,来解决,让nginx支持软链接/ ...
- Nginx支持比Apache高并发的原因
1.先从各自使用的多路复用IO模型说起: select模型:(apache使用,由于受模块等限制,用的不多) 单个进程能够 监视的文件描述符的数量存在最大限制 select()所维护的 存储大量 ...
- 配置Nginx支持SSL SNI(一个IP绑定多个证书) 以及Haproxy实现多域名证书
概述 传统的每个SSL证书签发,每个证书都需要独立ip,假如你编译openssl和nginx时候开启TLS SNI (Server Name Identification) 支持,这样你可以安装多个S ...
- Nginx 支持 WAF 防护功能实战
WAF(Web Application Firewall),中文名称叫做“Web应用防火墙 WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提 ...
- Nginx 支持 CI 框架的配置并禁止使用 ip 访问
#CIserver { listen 80; server_name www.ci.com; index index.php index ...
- 让服务器apache/iis/nginx支持.apk/ipa文件下载
服务器iis支持.apk文件下载的设置 IIS服务器不能下载.apk文件的原因:iis的默认MIME类型中没有.apk文件,所以无法下载. IIS服务器不能下载.apk文件的解决办法:既然.apk无法 ...
- ruby on rails 2.3+的版本不再支持cgi
ruby on rails 2.3+的版本不再支持cgi了,恶心到了,换其他框架,看了款cramp,完全没资料,完全不让人入门 操蛋的厉害,ruby果然是小众的窝里乐,放弃使用
随机推荐
- SecureCrt脚本(三)二级对象之Screen详解
Crt自动化 测试 SecureCrt脚本 JS脚本 1.引言 2.Screen属性和方法 2.1.属性 2.1.1.CurrentColumn 2.1.2.CurrentRow 2.1.3.Co ...
- AspNetPager常用属性及一些样式(本文摘自网络,作者:x123jing)
AlwaysShow 总是显示分页控件,即使要分页的数据只有一页 AlwaysShowFirsLastPageNumbr 是否总是显示第一页和最后一页数字页索引按钮 BackImageUrl 面板的背 ...
- SVN组成中trunk,branches and tags功能用法详解
SVN组成中trunk,branches and tags功能用法详解 我相信初学开发在SVN作为版本管理时,都估计没可能考虑到如何灵活的运用SVN来管理开发代码的版本,下面我就摘录一篇文章来简单说 ...
- Ctrl+Shift+F12切换最大化编辑器
常用快捷键(keymaps:Default情况下) Esc键编辑器(从工具窗口) F1帮助千万别按,很卡! F2(Shift+F2)下/上高亮错误或警告快速定位 F3向下查找关键字出现位置 F4查找变 ...
- Spring对加载的bean之间循环依赖的处理
根据下面文档的叙述,简言之: 对于相互之间通过构造函数注入相互循环依赖的情况,Spring会抛出BeanCurrentlyInCreationException错误. 如果AB两个beans是通过属性 ...
- 如何删除 OpenStack Nova 僵尸实例
转自:http://www.vpsee.com/2011/11/how-to-delete-a-openstack-nova-zombie-instance/ 前天强制重启一台 OpenStack N ...
- 对Get-Content参数-readcount的解释
绝大多数用户更关心最新的日志,下面给出一个简单的例子演示从一个文本日志中获取最后的某几行文本行: # 显示windowsupdate.log 文件的最新5行日志 $logs = Get-Conte ...
- SVN版本管理系统的安装 CentOS + Subversion + Apache + Jsvnadmin
CI服务器:192.168.4.221 root用户操作 建议安装前更新操作系统 # yum update 更新完成后重启 # reboot 安装 ...
- 学习之痛(数据库->存储过程和函数)
存储过程和函数作为数据库的一部分,为什么是学习之痛. 项目实际开发,考虑性能和代码维护,绝对不用存储过程. 如果单纯自己写个小程序糊弄人玩,还可以写写. [学习] 在数据库中定义一些SQL语句集合,然 ...
- 序列化各个类型成JSON XML实例
LitJson组件序列化请参考http://www.cnblogs.com/leee/p/4437230.html XML序列化请参考http://www.cnblogs.com/leee/p/424 ...