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参数信息:
2. 安装fastcgi库
sudo apt-get install libfcgi-dev
3. 编写cgi程序
main.cpp
编译:g++ -o main.cgi main.cpp -lfcgi
程序复杂当然可以写一个makefile
编译生成main.cgi后,运行spawn
spawn-fcgi -a 127.0.0.1 -p 8080 -f ./main.cgi
修改Nginx的配置文件
任何带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
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
相关文章推荐
- c++程序中写测试log到文件的简单实现
- C++简单QQ程序服务器端的实现代码
- EMU8086 简单汇编程序&实现5个BYTES的数据相加
- 简单的C++加载jvm实现--简单的日志输出--JAVA端程序
- 给Nginx添加FastCGI处理程序,不使用spawn-fcgi工具并实现守护功能
- nginx&&apache最简单的网站安全策略实现
- 编写简单的连接MongoDB数据库C++程序 && 解决编译C++程序时链接MongoDB动态库失败的问题
- C++实现简单的五子棋程序
- 编程作业 简单的学生信息处理程序实现[北京大学C++课程]
- 基于qml创建最简单的图像处理程序(2)-使用c++&qml进行图像处理
- 实验一 实现几个简单的c++程序
- 设计有穷自动机DFA实现C++简单程序的词法分析、扫描(编译原理实验) 推荐
- 【c++】用c++实现简单的进程调度程序
- 简单的学生信息处理程序实现(C++程序设计第2周)
- C++实现的一个简单的多线程程序
- 通用型C/C++程序性能测试Benchmark的简单实现
- c++note1 简单的学生信息处理程序实现
- 一个简单的Android程序,JNI实现Native C/C++
- 简单的学生信息处理程序实现 (Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 编写简单的连接MongoDB数据库C++程序 && 解决编译C++程序时链接MongoDB动态库失败的问题