Request 和 Response
前言:作为一个web开发工程师,工作中大量时间是和Request和Response打交道,这篇文章是我目前对二者的理解和总结。
问题一:何为Request 和 Response
Request 和 Response 是HTTP协议的一部分,http协议是万维网服务器传输超文本到本地浏览器的传输协议。HTTP是属于应用层的面向对象的协议,是现在web世界的基础
HTTP协议是一种客户端服务器架构,浏览器作为客户端通过URl向HTTP服务端即Web服务器发送Request。Web服务器接受到请求后,向客户端发送Response信息。
问题二:Request 和 Response的组成
Request客户端发送到服务器的请求消息
- 请求行: 以请求方法开头,以空格作为间隔,后面依次是URL(统一资源定位符,用来标识互联网上的唯一资源,可以是图片,HTML等),HTTP协议版本。请求行标识了用什么样的操作去操作那个资源。
- 请求头: 紧接着请求行,后面是请求头, 用来说明服务器使用的附加信息。这一部分有很多标准信息,像User-Agent,标识浏览器信息,Accept-Encoding,标识压缩格式,Accept-Language,标识语言信息。这一部分是服务器需要的重要信息,有一定标准格式。
- 空行: 请求头后面必须跟着空行。
- 请求体: 可以添加任意数据,这是业务层实现的基础,与业务相关的数据都会在请求体里面发送给服务器。
Response服务器处理客户端发过来的请求后会返回一个HTTP相应消息
- 状态行: 包括协议版本,状态码,状态消息三个部分其中状态码是客户端判断响应状态的重要标准,依据状态码,对信息进行不同处理。
- 响应头:与请求头一样,告诉客户端重要信息,如Content-Type告诉浏览器返回内容的格式,包括编码方式。Date 响应生成的时间。
- 空行: 与请求空行一样,分隔响应头与响应体
- 响应体: 服务器返回给客户端的文本信息,是业务层的主要实现部分。内容格式要与头部的Content-Type对应起来。如今前后端分离的RESTful风格,就是Content-Type:application/json,然后响应体中的内容就是JSON格式。
问题三: Python web 服务器的体系结构
下面是我作为一个python web 开发新手,对web 服务器的理解。
-
服务器软件与应用服务器:
- web服务器:Nginx Apache 之类的叫做服务器软件,顾名思义,这是一个软件,用于运行web 服务的软件。也常被称作web服务器, HTTP服务器,其作用是用来处理HTTP协议的,且只能处理静态内容。也就是把服务器文件系统中的每一个资源对照成URI,然后通过HTTP协议把这些已经存在的资源传给发起HTTP请求的客户端。
- 应用服务器: 仅仅响应静态内容是不够的,人们还需要动态的处理内容,返回动态的信息给客户端。 这就用到了服务器脚本。人们为了统一服务器脚本和web服务器之间的信息交互方式,提出了CGI,统一化标准。Python社区给Python制定了一个官方的类似于GCI的协议,统一Python与web服务器的信息交互。WSGI规定了web服务器与web应用程序之间的标准接口,以确保web应用程序在不同的web服务器之间具有可移植性,在python web开发中,主流的选择是Gunicorn,uWSGI等实现WSGI的容器。
- 两者的区别,web服务器负责处理HTTP协议,应用服务器既可以处理HTTP协议,也能处理其他协议。 web服务器处理静态页面内容,动态内容通过WSGI接口交给应用服务器来处理
- 像flask Django 实现了自带的web服务器用于开发,但是一般不能用于生产环境
- web服务器通常会和应用服务器配合一起使用,第一,实现了动静态资源的分离,动态资源交给应用服务器处理,静态资源则由web服务器直接返回浏览器,这样就减轻了应用服务器压力。
负载均衡,当业务压力增大时候,可以启动多个应用服务器进行水平扩展,而web服务器的负载均衡功能可以把请求通过算法分发到各个不同的实例进行处理,保证压力分配到不同的应用服务器,保证生产环境的稳定。
-
选择Nginx
- Nginx 是一个开源的高性能的HTTP反向代理服务器
- 作为web服务器,处理静态文件,索引文件的效率非常高
- 可以支持最大50000个并发连接,占用很少的内存
- 稳定性高
- 配置简洁
- 支持热部署
- 强大的反向代理:根据客户端的请求,从后端服务器上获取资源,将资源返回给客户端,代理和服务在一个局域网内,对客户端是透明的.Nginx,是反向代理的最佳选择.可以起到缓冲请求,交给后端一个完整的HTTP请求,缓冲响应,减轻后端的压力.隐藏应用服务器,防范网络攻击,增加安全性缓存静态内容,代理缓存可以满足大量网站请求,大大降低应用服务器上的负载,支持压缩,通过压缩优化网站访问速度
- 负载均衡.帮助web服务器合理分配请求,以达到资源的使用效率最佳,吞吐率最大,响应时间最小.
-
WSGI Werkzeug flask Gunicorn
- WSGI:Python Web Server Gateway Interface python 定义的web服务器与web应用程序之间的简单而通用的接口
- Werkzeng: Werkzeug是Python基于WSGI协议写的函数库,它的应用很广泛.
- flask: 基于Werkzeng实现的轻量级web框架
- Gunicorn: wsgi容器,可以用Gunicorn跑用flask等Werkzeng框架实现的程序,这样就实现了一个应用服务器.
问题四: 从发出Request到返回Response 发生了啥
- 浏览器发出一个请求,到DNS服务器,将域名解析为IP
- 浏览器利用IP和端口号和网站服务器建立TCP连接,经过三次握手,TCP连接建立完成.
- 浏览器组装好Request发送给WEB服务器
- Nginx接受到Request之后根据请求资源类型进行分类,如果请求静态资源,Nginx会检索静态资源,并直接返回,如果是请求动态资源,会交给应用服务器.当然这其中会有请求缓冲,负载均衡等步骤.
- 实现了wsgi网管接口的应用服务器接收到http请求后,利用Werkzeng等网络编程工具实现的python程序(flask框架等)会根据request内容生成Response并返回给Nginx
- Nginx缓冲Response,并将其返回给浏览器
- 浏览器解析Response,最终将组织好的内容呈献给用户
问题五: 我作为 Python web 工程师的主要工作
- 利用web框架实现具体的业务,即上文中拿到一个Request解析,生成Response
- Nginx 和 应用服务器的配置与部署