初试spawn-fcgi
1、下载fcgi库源码
ftp://ftp.slackware.com/.2/gentoo/distfiles/fcgi-2.4.0.tar.gz
2、编译
./configure --host=arm-linux --prefix=/opt/lib/fcgi -enable-static --disable-shared
make出现错误:
fcgio.cpp error: 'EOF' was not declared in this scope
fcgio.cpp增加#define EOF (-1)
/home/yushi/fcgi-2.4.0/libfcgi/fcgiapp.c:615: undefined reference to `frexp'
先make clean,然后修改 libfcgi目录下的Makefile,在LIBS那一行增加 -lm 参数
3、编译测试程序
建立testcgi.c文件:
#include <fcgi_stdio.h>
#include
int main()
{
int count = 0;
while(FCGI_Accept() >= 0)
{
printf("Content-type: text/html\r\n"
"\r\n"
""
"FastCGI Hello!"
"Request number %d running on host%s "
"Process ID: %d\n",
++count,
getenv("SERVER_NAME"), getpid());
}
return 0;
}
编译:
arm-linux-gcc testcgi.c -o testcgi -I /opt/lib/fcgi/include/ /opt/lib/fcgi/lib/libfcgi.a -lm
4、测试验证
上传testcgi到路由器上,运行:
spawn-fcgi -a 127.0.0.1 -p 8288 /usr/bin/testcgi
修改nginx配置,增加:
location ~ \.cgi$ {
fastcgi_pass 127.0.0.1:8288;
fastcgi_index index.cgi;
include fastcgi.conf;
}
重启后访问:
22
会在浏览器输出:
5、环境变量
GET请求,它将数据打包放置在环境变量QUERY_STRING中,CGI从环境变量QUERY_STRING中获取数据。常见的环境变量如下表所示:
环境变数 | 内容 |
AUTH_TYPE | 存取认证类型。 |
CONTENT_LENGTH | 由标准输入传递给CGI程序的数据长度,以bytes或字元数来计算。 |
CONTENT_TYPE | 请求的MIME类型。 |
GATEWAY_INTERFACE | 服务器的CGI版本编号。 |
HTTP_ACCEPT | 浏览器能直接接收的Content-types, 可以有HTTP Accept header定义. |
HTTP_USER_AGENT | 递交表单的浏览器的名称、版本 和其他平台性的附加信息。 |
HTTP_REFERER | 递交表单的文本的 URL,不是所有的浏览器都发出这个信息,不要依赖它 |
PATH_INFO | 传递给cgi程式的路径信息。 |
QUERY_STRING | 传递给CGI程式的请求参数,也就是用"?"隔开,添加在URL后面的字串。 |
REMOTE_ADDR | client端的host名称。 |
REMOTE_HOST | client端的IP位址。 |
REMOTE_USER | client端送出来的使用者名称。 |
REMOTE_METHOD | client端发出请求的方法(如get、post)。 |
SCRIPT_NAME | CGI程式所在的虚拟路径,如/cgi-bin/echo。 |
SERVER_NAME | server的host名称或IP地址。 |
SERVER_PORT | 收到request的server端口。 |
SERVER_PROTOCOL | 所使用的通讯协定和版本编号。 |
SERVER_SOFTWARE | server程序的名称和版本。 |
环境变量的大小是有一定的限制的,当需要传送的数据量大时,储存环境变量的空间可能会不足,造成数据接收不完全,甚至无法执行CGI程序。因此后来又发展出另外一种方法:POST,也就是利用I/O重新导向的技巧,让CGI程序可以由STDIN和STDOUT直接跟浏览器沟通。
当我们指定用这种方法传递请求的数据时,web 服务器收到数据后会先放在一块输入缓冲区中,并且将数据的大小记录在CONTENT_LENGTH这个环境变数,然后调用CGI程式并将CGI程序的STDIN指向这块缓冲区,于是我们就可以很顺利的通过STDIN和环境变数CONTENT_LENGTH得到所有的资料,再没有资料大小的限制了。
6、乘法程序
修改testcgi.c
#include
#include
int main()
{
char *data;
long m,n;
while(FCGI_Accept() >= 0)
{
printf("Content-Type:text/html\n\n");
printf("
printf("
乘法结果
");
data = getenv("QUERY_STRING");
if(data == NULL)
printf("
错误!数据没有被输入或者数据传输有问题
");else if(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2)
printf("
错误!输入数据非法。表单中输入的必须是数字。
");else
printf("
%ld和%ld的乘积是:%ld。
",m,n,m*n);}
return 0;
}
执行结果
发表评论