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

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

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

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(回调函数)。python

  • 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服务器对字符串进行迭代而影响速度。nginx

3 uWSGI

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

4 UWSGI

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

5 请求流程

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

6 小问题

从上面能够看出,Nginx这一层并非必须的,uWSGI服务器彻底能够完成整个和浏览器的交互,可是须要考虑下面的状况web

  • 安全问题,程序不能直接被浏览器访问到,而是经过nginx,nginx只开放某个接口,uWSGI自己是内网接口,这样运维人员在nginx上加上安全性的限制,能够达到保护程序的做用
  • 负载均衡问题,一个uWSGI极可能不够用,即便开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx作代理,一个nginx能够代理多台uWSGI完成uWSGI的负载均衡
  • 静态文件问题,用django或是uWSGI这种东西来负责静态文件的处理是很浪费的行为,并且他们自己对文件的处理也不如nginx好,因此整个静态文件的处理都直接由nginx完成,静态文件的访问彻底不去通过uWSGI以及其后面的东西。

参考文章:
python nginx+uwsgi+WSGI 处理请求详解
Nginx + uWSGI + Webpy配置&原理.mddjango

相关文章
相关标签/搜索