python项目上线(Nginx + uWSGI + Django)

WSGI/uWSGI/uwsgi

  1. WSGI(Web Server Gateway Interface)
  • WSGI,是一个协议,Python用于Web开发的协议:描述web服务器如何与web应用程序(如用Django、Flask框架写的程序)通信的规范、协议。
    很多Web框架(如:django)都会自带WSGI服务器,但是性能不好,只作测试用途。
  • 支持WSGI的服务器:uWSGI、Gunicorn
  1. uWSGI
  • uWSGI,是一个程序,充当Web服务器或中间件:uWSGI,是一个程序,充当Web服务器或中间件:它实现了WSGI协议、uwsgi、http等协议
    • 如果架构是Nginx+uWSGI+APP,uWSGI是一个中间件
    • 如果架构是uWSGI+APP,uWSGI是一个服务器
  1. uwsgi
    • uwsgi,是uWSGI程序实现的一个自有的协议,主要特征是采用二进制来存储数据,之前的协议都是使用字符串,所以在存储空间和解析速度上,都优于字符串型协议.
    • Nginx和uWSGI之间可以通过CGI,FCGI和uwsgi协议通信,当然uwsgi的性能是最好的。

Ningx

Ningx是一个反向代理服务器

  • 什么是反向代理?
    • 正向代理,例如FQ用的代理服务器就是正向代理,浏览器主动请求代理服务器,代理服务器转发请求到对应的目标服务器
    • 反向代理,部署在Web服务器上,代理所有外部网络对内部网络的访问。浏览器访问服务器,必须经过这个代理,是被动的。
      (反向代理监听某个端口,当有客户端连接该端口,反向代理就会处理客户端的请求。所以客户端是主动的,反向代理是被动的。)
    • 正向代理的主动方是客户端,反向代理的主动方是Web服务器。

反向代理的作用:

  • 安全,客户端对Web服务器的访问需要先经过反向代理服务器。这样可以防止外部程序对Web服务器的直接攻击。
  • 负载均衡,反向代理服务器可以根据Web服务器的负载情况,动态地把HTTP请求交给不同的Web服务器来处理,前提是要有多个Web服务器。
  • 提升Web服务器的IO性能。一个HTTP请求的数据,从客户端传输给服务器,是需要时间的,例如N秒,如果直接传给Web服务器,Web服务器就需要让一个进程阻塞N秒,来接收IO,这样会降低Web服务器的性能。如果使用反向代理服务器,先让反向代理服务器接收完整个HTTP请求,再把请求发给Web服务器,就能提升Web服务器的性能。还有一些静态文件的请求,可以直接交给反向代理来处理,不需要经过Web服务器。

Nginx+uWSGI关系

python项目上线(Nginx + uWSGI + Django)_第1张图片
工作原理.png

(中间的反向代理服务器就是nginx ,右边的3台web服务器就是uWSGI)

  • Nginx和uWSGI之间可以通过CGI,FCGI和uwsgi协议通信,当然uwsgi的性能是最好的。
  • Nginx和uWSGI,uWSGI和Django,都是通过socket通讯,而通讯的协议都是使用uwsgi

Nginx和uWSGI的区别

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


    gong.png

参考网址
https://blog.csdn.net/dqchouyang/article/details/81639788
https://www.cnblogs.com/gugubeng/p/9722937.html
https://www.cnblogs.com/Xjng/p/aa4dd23918359c6414d54e4b972e9081.html

你可能感兴趣的:(python项目上线(Nginx + uWSGI + Django))