1 http协议
超文本传输协议
明文的协议 传输的内容不是二进制,传输的是明文字符串
http -> https 传输上是安全的
协议内容
换行符都使用\r\n
请求
POST /search HTTP/1.1\r\n
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: www.google.cn
Connection: Keep-Alive
Content-Type: application/x-www-form-data-urlencoded
Content-Length: 27\r\n
\r\n
hl=zh-CN&source=hp&q=domety
1、请求行 POST /search HTTP/1.1
请求的方法 资源路径 http协议版本号
请求方法:(8个)
常用的4个 (GET/POST/PUT/DELTE) 增删查改
做 restful web api
更加常用就2个 GET POST
POST、PUT允许带请求数据
2、请求头
键值对 key : value
accept : 客户端期望拿到的数据类型
Accept-Language: zh-cn 客户端期望获取资源的语言
Accept-Encoding: gzip, deflate 期望数据的编码 ,gzip压缩,没压缩
User-Agent : 用户代理 浏览器类型
Host
Connection: Keep-Alive 不要断开TCP连接
Content-Type : 请求数据的类型 (MIME类型)
Content-Length: 27 请求数据的长度单位:字节
3、空行 \r\n
4、请求数据体
hl=zh-CN&source=hp&q=domety
响应
1、状态行
状态行 HTTP/1.1 200 OK
http版本号 状态码 状态码意义
1xx 表示服务器已接收了客户端请求,客户端可继续发送请求 辅助类
2xx 表示服务器已成功接收到请求并进行处理 积极类
3xx 表示服务器要求客户端重定向 重定向
4xx 表示客户端的请求有非法内容 客户端有毒
5xx 表示服务器未能正常处理客户端的请求而出现意外错误 服务端有毒
2、响应头(同上)
3、空行 \r\n
4、响应数据体
跟Content-type对应
是html,就是html文本
jpg ,就是jpg二进制内容
2 http传参
服务器依赖客户端传递参数来返回内容
GET
不允许携带请求数据,参数放置
请求头:
键值对 形式
还要看服务器支持
不是http标准的请求头的信息,那么可能会被过滤
请求行
方法 地址 协议
http://127.0.0.1/login?user=itcast&passwd=123456
以?开始,后面键值对,&做分割
1 敏感信息暴露到地址栏
2 长度限制,服务器对请求头地址长度有限制 512
3 二进制数据,转化为普通字符串(编码)
一般只做查询,参数作为查询条件使用
POST
支持数据体
参数都放请求数据中
3 CGI
通用网关接口(Common Gateway Interface/CGI)是一种重要的互联网技术,
可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。
CGI描述了**服务器和请求处理程序之间传输数据的一种标准**。
劣势,频繁创建子进程,收尸,比较消耗新能,大并发网站不使用
nginx 不支持cgi只支持fastCGi
4 FastCGI
CGI全称是“通用网关接口”(Common Gateway Interface),
HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,
其程序一般运行在网络服务器上。CGI可以用任何一种语言编写,
只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。
一开始程序就已经启动,常驻在内存里,有请求就处理请求
没请求以一种性能消耗很低的方式存在内存中
1 休眠
2 阻塞
可以用任何语言编写
5 spawn-fcgi 进程管理器
spawn-fcgi这个包原来是属于Lighttpd里的,现在已经可以独立出来使用。
6 配置与搭建
(1) fastcgi 的安装
下载源码包:xxx
1、unzip xxx;cd xxx
2、chmod a+x autogen.sh
3、./autogen.sh
如果报错1 依赖autoconf , sudo apt install autoconf
如果报错2 报文件找不到的错误 touch NEWS README AUTHORS ChangeLog
如果报错3 AC_PROG_LIBTOOL sudo apt install libtool
4、 ./configure
5、make
6、sudo make install
(2)spwan-fcgi的安装
1、下载源码 xxxx
2、unzip xxx
3、 ./autogen.sh
4、 ./configure
5、make
6、sudo make install
验证安装
有命令:spawn-fcgi
6 部署简单fastCGI程序
(1)spawn-fcgi 命令
-f 指定fastCGI程序位置
-d 启动fastCGI程序之前换目录
-a socket绑定的ip ,默认0.0.0.0
-p 端口号
-s 本地套接字地址
(2)部署echo fastCGI程序
找到解压目录里面找到 examples 里面 的echo
指定fastcgi程序
---》spawn-fcgi -f ./echo -a 0.0.0.0 10000
注意echo要添加路径,不然会自动从PATH中找
(3)nginx添加配置
location /echo {
fastcgi_pass 127.0.0.1:10000;
include fastcgi.conf;
}
(4)上传文件的部署
部署zyUpload站点到nginx上
添加location 指向到fastCGI程序
location /upload/UploadAction {
fastcgi_pass 127.0.0.1:10000;
include fastcgi.conf;
}
environ 来自于 unistd.h char ** 字符串数组
存储的信息都是环境变量
数组结束标志,最后指向null
getenv 获取环境变量 ,linux系统函数
从environ 中获取key是某个值的value
默认environ指向系统环境变量
有请求来,这个指针会被修改,指向另一个字符串数组
http开发,收到所有的http请求
请求行如何获取
请求头如何获取
从环境变量中获取
有连接,fastCGI框架就会将请求头请求行
赋值到环境变量
请求数据如何获取
从标准输入
fastCGI框架做了重定向
将客户端的请求数据重定向到fastCGI程序的
标准输入
如何返回信息给客户端
从标准输出输出就可以
POST方法提交数据的形式
text/plain
application/x-www-form-urlencoded
application/json
text/xml
multipart/form-data
text/plain
username=itcast
phone=12345678
email=itcast@itcast.com
date=2018-03-30
sex=male
class=3
rule=on
application/x-www-form-urlencoded
最常见 ,跟GET方法提交参数差不多
username=xxx&phone=12345678&email=xxxx%40xxxx.com
&date=2018-03-30&sex=male&class=3&rule=on
application/json
html默认不支持,要依赖javascript
{“name”:”itcast”,”passwd”:”123456”}
text/xml
xml是所有数据类型中表达形式最丰富的
解析效率低于json
<?xml version="1.0" encoding="utf-8"?>
<root>
<name>itcast</name>
<pass>123456</pass>
</root>
multipart/form-data
请求头
Content-Type: multipart/form-data; boundary=${bound}
boundary -- 界限 ,切分多个数据的界限
也是一个按照某个条件生成的字符串
--${bound} 一开始是一个bound
Content-Disposition: form-data; filename="file1"
\r\n
file1的内容
--${bound}
Content-Disposition: form-data; filename="file2"
\r\n
file2的内容
--${bound}--
bound
数据块头信息
空行
数据的内容
\r\n
bound
数据块头信息2
空行
数据的内容2
\r\n
bound