主页 > 其他 > 初试spawn-fcgi

初试spawn-fcgi

2017年5月2日 初试spawn-fcgi无评论 阅读: 16,399 次

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;
}

执行结果

发表评论

新用户的评论需审核后才会显示;

电子邮件地址不会被公开;
必填项已用*标注