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

来源:互联网 发布:java 泛型 class 参数 编辑:程序博客网 时间:2024/06/07 01:36

1. 安装spawn-fcgi (FastCGI进程管理器)

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

安装spawn-fcgi:

  1. 获取spawn-fcgi编译安装包,在http://redmine.lighttpd.net/projects/spawn-fcgi/wiki上可以获取当前最新的版本。
  2. 解压缩spawn-fcgi-x.x.x.tar.gz包。
  3. 进入解压缩目录,执行./configure。
  4. 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的进程数(CCGI用这个)-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

阅读全文
0 0