您的位置:首页 > 运维架构 > Nginx

Nginx&C++实现简单的fastcgi程序

2017-12-12 16:12 549 查看
1. 安装spawn-fcgi (FastCGI进程管理器)

spawn-fcgi是一个通用的FastCGI进程管理器,简单小巧,原先是属于lighttpd的一部分,后来由于使用比较广泛,所以就迁移出来作为独立项目了。spawn-fcgi使用pre-fork 模型,功能主要是打开监听端口,绑定地址,然后fork-and-exec创建我们编写的fastcgi应用程序进程,退出完成工作。fastcgi应用程序初始化,然后进入死循环侦听socket的连接请求。

安装spawn-fcgi:

获取spawn-fcgi编译安装包,在http://redmine.lighttpd.net/projects/spawn-fcgi/wiki上可以获取当前最新的版本。

解压缩spawn-fcgi-x.x.x.tar.gz包。

进入解压缩目录,执行./configure。

make & make install

如果遇到以下错误:“ ./autogen.sh: x: autoreconf: not found”,因为没有安装automake 工具,ubuntu用下面的命令安装好就可以了:sudo apt-get install autoconf automake libtool 。

spawn-fcgi的帮助信息可以通过man spawn-fcgi或spawn-fcgi –h获得,下面是部分常用spawn-fcgi参数信息:

-f <fcgiapp> 指定调用FastCGI的进程的执行程序位置
-a <addr> 绑定到地址addr。
-p <port> 绑定到端口port。
-s <path> 绑定到unix domain socket
-C <childs> 指定产生的FastCGI的进程数,默认为5。(仅用于PHP)
-P <path> 指定产生的进程的PID文件路径。
-F <childs> 指定产生的FastCGI的进程数(C的CGI用这个)
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,CentOS下可以使用apache用户,其他的根据情况配置,如nobody、www-data等。


2. 安装fastcgi库

sudo apt-get install libfcgi-dev

3. 编写cgi程序

main.cpp

#include <iostream>
#include <fcgi_stdio.h>
#include "fcgi_config.h"
#include <stdlib.h>
#include <sys/types.h>

#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

using namespace std;

int main(void)
{
int i;

while(FCGI_Accept() >= 0){

printf("Content-type: text/html\r\n\r\n" \
"<html><head><title>Test</title></head>" \
"<body>%s %d " \
"<br> SERVER_SOFTWARE:%s " \
"<br> QUERY_STRING: %s " \
"<br> REQUEST_METHOD: %s " \
"<br> CONTENT_TYPE: %s " \
"<br> CONTENT_LENGTH: %s " \
"<br> SCRIPT_FILENAME: %s " \
"<br> SCRIPT_NAME: %s " \
"<br> REQUEST_URI: %s " \
"<br> DOCUMENT_URI: %s " \
"<br> DOCUMENT_ROOT: %s " \
"<br> SERVER_PROTOCOL: %s " \
"<br> REMOTE_ADDR: %s " \
"<br> REMOTE_PORT: %s " \
"<br> SERVER_ADDR: %s " \
"<br> SERVER_PORT: %s " \
"<br> SERVER_NAME: %s " \
"</body></html>",
"Hello World", i++,
getenv("SERVER_SOFTWARE"),
getenv("QUERY_STRING"),
getenv("REQUEST_METHOD"),
getenv("CONTENT_TYPE"),
getenv("CONTENT_LENGTH"),
getenv("SCRIPT_FILENAME"),
getenv("SCRIPT_NAME"),
getenv("REQUEST_URI"),
getenv("DOCUMENT_URI"),
getenv("DOCUMENT_ROOT"),
getenv("SERVER_PROTOCOL"),
getenv("REMOTE_ADDR"),
getenv("REMOTE_PORT"),
getenv("SERVER_ADDR"),
getenv("SERVER_PORT"),
getenv("SERVER_NAME"));
}

return 0;
}


编译:g++ -o main.cgi main.cpp -lfcgi

程序复杂当然可以写一个makefile

编译生成main.cgi后,运行spawn

spawn-fcgi -a 127.0.0.1 -p 8080 -f ./main.cgi

修改Nginx的配置文件

location ~ \.cgi$ {
fastcgi_pass 127.0.0.1:8080;
fastcgi_index index.fcgi;
fastcgi_param SCRIPT_FILENAME /$fastcgi_script_name;
include fastcgi_params;
}


任何带cgi的URL访问都会指向main.cgi

然后用浏览器访问127.0.0.1/test.cgi,就可以看到结果了

fastcgi监听–>nginx连接上来–>fastcgi read,取得url和cookie这样参数,写到environ变量–>fastcgi以getenv方式取得参数

对于get请求来说,直接getenv(“QUERY_STRING”)就可以拿到,而对于post请求来说,参数是写到标准输入流中的,需要从stdin中读取,或者 cin >> content
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nginx