python的web是用什么容器_Python web开发你需要理解的一些服务器概念

1.Python web开发你需要理解的一些服务器概念

前几日在生产服务器上部署Python web.py的一个项目,发现自己对服务器的一些概念不是很明白,遂查资料看了一会,特此做出个人的一些算是笔试的总结吧,以便之后可以回顾

2.WSGI

全称是Web Server Gateway Interface,WSGI不是服务器,也不是API或者Python的什么模块之类的,它只是一种Python web的一种规范,类似于Java web里面的servlet规范,WSGI规范定义了web应用(web框架)与web服务器之间交互的接口,约定了WSGI server怎么去调用web应用程序类或者函数,web应用程序需要符合什么样的规范。而下面说的uWSGI就是一种支持WSGI规范的服务器,或者你可以将uWSGI理解为一种支持WSGI规范的容器,所以我们可以将web应用部署到uWSGI中,然后当它接受请求时,就会按照WSGI定义的接口回调web应用来处理请求。

WSGI定义了两种角色,分别为server端(或者gateway端)和application端(或者framework端),需要server端和application端都支持WSGI,一般而言server端是uWSGI,application端是一个可调用对象(callable object),可调用对象可以是类、方法或者可调用的实例,这个对象接受两个参数environ(请求的环境变量)和start_response(回调函数)。

environ是一个字典,包含了客户端请求的信息,如 HTTP 请求的首部,方法等信息,可以认为是请求上下文

start_response一个用于发送HTTP响应状态(HTTP status )、响应头(HTTP headers)的回调函数。在返回内容之前必须先调用这个回调函数

def simple_app(environ, start_response):

"""

docstring, it's just a test application

"""

status = '200 OK'

response_headers = [('Content-type', 'text/html')]

start_response(status, response_headers)

return ['Hello World']

上面的回调函数的作用是让WSGI server返回响应的首部和HTTP状态码,这个函数必须有两个参数,第一个是状态码,第二个是响应的首部元组组成的列表,并且回调函数设置状态码和首部需要在return响应HTTP body之前执行。

值得一说的是,return返回的响应信息应该是一个可迭代对象,上面的例子中将字符串放在了列表里面,如果直接返回字符串,会导致WSGI服务器对字符串进行迭代而影响速度。

3 uWSGI

是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等

4 UWSGI

一种规范,或者说是一种通信协议,主要用在代理服务器(如Nginx)与uWSGI服务器之间的通信,而WSGI主要是用在uWSGI服务器和应用程序之间的通信。

5 请求流程

首先nginx 是对外的服务接口,外部浏览器通过url访问nginx;

nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件。如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uWSGI,uWSGI接收到请求之后将包进行处理,处理成WSGI可以接受的格式,根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给uWSGI,uWSGI将返回值进行打包,打包成UWSGI能够接收的格式,并转发给nginx,nginx最终将返回值返回给浏览器.

6 小问题

从上面可以看出,Nginx这一层并不是必须的,uWSGI服务器完全可以完成整个和浏览器的交互,但是需要考虑下面的情况

安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uWSGI本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用

负载均衡问题,一个uWSGI很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uWSGI完成uWSGI的负载均衡

静态文件问题,用django或是uWSGI这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uWSGI以及其后面的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值