CGI-C++

  cheney

用 C/C++ 通过 CGI 接口是可以用来做网页的,在Apache下已经实现过。现在换成 Nginx 只能用FastCGI接口,稍有区别。CGI接口下,每次访问会重新开一个进程,而FastCGI会把程序编程服务,永不退出,每次访问执行一遍,效率会好一些,怎么处理并发似乎比较麻烦,我还不懂。先尝试一下。

安装

  • GCC G++ : 编译器,必须的。
	apt-get install gcc g++
  • Git:最流行的文本版本管理工具,这个是离不了的。
	apt-get install git
  • Nginx : http服务器和反向代理器
    apt-get install nginx
    ln -s /usr/share/nginx/www/ ~/www
    /etc/init.d/nginx start
    ./configure 
    make
    cp ./src/spawn-fcgi /usr/local/nginx/sbin/
    ./configure
    make
    make install

make 时有个错误,fastcgio.cpp 中开头增加 #define EOF (-1)

测试

  • 浏览器打开[VPS的IP地址]。显示Welcome to nginx!,Nginx安装正确。
  • 新建一个CGI程序
    vim hello.cc
	#include "iostream"
	#include "fcgi_stdio.h"
	#include "stdlib.h"
	
	using namespace std;
	
	int main()
	{
	
	        int count = 0 ;
	        while( FCGI_Accept() >=0 )
	        {
	                printf("Content-type:text/html\r\n\r\n");
	                printf("<p>Hello FastCGI</p>");
	                printf("<br /> Request number = [%d]",++count );
	                printf("<br /> Process ID: %d",getpid());
	        }
	        return 0;
	}

    vim Makefile
    all:
        g++ hello.cc -o hello.net -L/usr/local/lib -lfcgi -Wl,-R /usr/local/lib

能编译执行,fastcgi库安装正确。

  • Nginx 调用 spawn-fastcgi
    将编译后的文件 hello.net放入目录 www/cgicc 下,启动spawn-fastcgi管理进程。
	/usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 3030 -C 25 -f /usr/share/nginx/www/cgicc/hello.net

编辑 /etc/nginx/sites-enabled/default,server的括号中加入,

	location /cgicc {
	fastcgi_pass 127.0.0.1:3030;
	fastcgi_index index.net;
	fastcgi_param SCRIPT_FILENAME fcgi$fastcgi_script_name;
	include fastcgi_params;
	}

重启ngnix,用浏览器访问 [VPS的IP地址]/cgicc/,显示

Hello FastCGI


Request number = [1]
Process ID: 22882

疑惑

因为不想要名字后的cgicc路径,直接让该Server下,location / 调用fastcgi。

	location / {
	fastcgi_pass 127.0.0.1:3030;
	fastcgi_index index.net;
	fastcgi_param SCRIPT_FILENAME fcgi$fastcgi_script_name;
	include fastcgi_params;
	}

但是这样会有问题,每次访问网页 Request number 都加2 ,百思不得其解。

查看日志后发现可能跟 favicon.ico 相关。
- 查看日志

	cat /var/log/nginx/access.log
  • 清空日志
	> /var/log/nginx/access.log

然后又增加了 Nginx 静态文件处理,还是不能解决这个问题。

	# 静态文件,nginx自己处理
	location ~ ^/(images|ico|javascript|js|css|flash|media|static) {
	#过期30天
	expires 30d;
	}