资讯专栏INFORMATION COLUMN

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

BoYang / 1388人阅读

摘要:是一个字典,包含了客户端请求的信息,如请求的首部,方法等信息,可以认为是请求上下文一个用于发送响应状态响应头的回调函数。

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以及其后面的东西。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44543.html

相关文章

  • Python Web开发》作者Harry Percival:TDD就是微小而渐进改变

    摘要:目前就职于,他在各种演讲研讨会和开发者大会上积极推广测试驱动开发。问很多敏捷教练都表示训练新人做测试驱动开发是一件辛苦而进度缓慢的事,并且收益也不是很大。首先是开发的对话式风格。第一个问题就是测试套件的速度。 Harry J.W. Percival目前就职于PythonAnywhere,他在各种演讲、研讨会和开发者大会上积极推广测试驱动开发(TDD)。他在利物浦大学获得计算机科学硕士学...

    Guakin_Huang 评论0 收藏0
  • Python Web开发》作者Harry Percival:TDD就是微小而渐进改变

    摘要:目前就职于,他在各种演讲研讨会和开发者大会上积极推广测试驱动开发。问很多敏捷教练都表示训练新人做测试驱动开发是一件辛苦而进度缓慢的事,并且收益也不是很大。首先是开发的对话式风格。第一个问题就是测试套件的速度。 Harry J.W. Percival目前就职于PythonAnywhere,他在各种演讲、研讨会和开发者大会上积极推广测试驱动开发(TDD)。他在利物浦大学获得计算机科学硕士学...

    k00baa 评论0 收藏0
  • [译]学习Python编程19个资源

    摘要:它需要将近美元才能买到,但是你可以下载免费的和版本。在需要花费美元来开始你的学习,将会有超过页的内容和个多小时的视频供你访问,还包括以后可以免费更新。 showImg(https://segmentfault.com/img/bVrJpw); 用Python编写代码一点都不难,事实上它一直被赞誉为最容易学的编程语言。如果你准备学习web开发, Python是一个不错的开始,甚至想做游戏...

    xiguadada 评论0 收藏0
  • 软件测试需要学什么?50W+测试工程师需要掌握哪些技能?

    摘要:协议学习常见请求方法学习和学习接口的基本概念接口文档认识接口测试用例编写接口测试工具使用软件测试自动化进阶性能测试性能测试的技术要求很高,不仅仅要对性能测试的指标测试分类测试设计有很深刻的理解。 ...

    wushuiyong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<