fastCGI和spawn-fcgi安装
本文编写时候的测试平台:腾讯云轻量应用服务器
操作系统:ubuntu18.4
安装fastCGI
./configure
make
- fcgio.cpp:50:14: error: ‘EOF’ was not declared in this scope
- 没有包含对应的头文件:
- stdio.h - c
- cstdio -> c++
find ./ -name fcgio.cpp
sudo vim fcgio.cpp
sudo make install
安装spawn-fcgi
spawn-fcgi是一个通用的FastCGI进程管理器
下载地址: http://redmine.lighttpd.net/projects/spawn-fcgi/wiki
./configure
make
sudo make install
nginx 和 fastCGI的通信流程
http://localhost/login?user=zhang3&passwd=123456&age=12&sex=man
- 客户端访问, 发送请求,如上诉url
- nginx web服务器, 无法处理用户提交的数据
- spawn-fcgi - 通信过程中的服务器角色
被动接收数据
在spawn-fcgi启动的时候给其绑定IP和端口 - fastCGI程序
程序猿写的 -> login.c -> 可执行程序( login )
使用 spawn-fcgi 进程管理器启动 login 程序, 得到一进程
1.配置Nginx的数据转发,需要修改nginx的配置文件nginx.conf
通过请求的url http://localhost/login?user=zhang3&passwd=123456&age=12&sex=man 转换为一个
指令:
-
去掉协议
-
去掉域名/IP + 端口
-
如果尾部有文件名 去掉
-
去掉 ? + 后边的字符串
-
剩下的就是服务器要处理的指令: /login
location /login { # 转发这个数据, fastCGI进程 fastcgi_pass 地址信息:端口; # fastcgi.conf 和nginx.conf在同一级目录: /usr/local/nginx/conf # 这个文件中定义了一些http通信的时候用到环境变量, nginx赋值的,从中可以获取到本次通信的http请求数据 include fastcgi.conf; }
-
地址信息:
-
localhost
-
127.0.0.1
-
端口: 找一个空闲的没有被占用的端口即可
spawn-fcgi如何启动
前提条件: 程序猿的fastCGI程序已经编写完毕 -> 可执行文件 login
spawn-fcgi -a IP地址 -p 端口 -f fastcgi可执行程序
- IP地址: 应该和nginx的 fastcgi_pass 配置项对应
- nginx: localhost -> IP: 127.0.0.1
- nginx: 127.0.0.1 -> IP: 127.0.0.1
- nginx: 192.168.1.100 -> IP: 192.168.1.100
- 端口:
应该和nginx的 fastcgi_pass 中的端口一致
编写fastCGI程序的思路
首先spawn-fcgi和程序员的cgi程序的关系是父子进程
然后spawn-fcgi重定向了程序员的CGI程序的标准输出和输入
dup2(fd,stdin_fileno);
dup2(fd,stdout_fileno);
这种方式可以隐藏通信的细节.
常用的fastCGI环境变量
QUERY_STRING 请求的参数;如?app=123
REQUEST_METHOD 请求的动作(GET,POST)
CONTENT_TYPE 请求头中的Content-Type字段
CONTENT_LENGTH 请求头中的Content-length字段
使用get和post提交数据的区别
使用get提交
数据会出现在QUERY_STRING中
REQUEST_METHOD = GET
CONTENT_TYPE 空
CONTENT_LENGTH 空
使用post提交数据
数据出现在提交的数据中
QUERY_STRING 空
REQUEST_METHOD = POST
CONTENT_TYPE 上传数据的格式.取决于文件的后缀名字
CONTENT_LENGTH 提交数据的长度
POST有常用的4种上传数据的格式
1.application/x-www-form-urlencoded
2.application/json
3.text/xml
4.multipart/form-data