1. 整体架构
各部分简介:
- Nginx
Nginx 是一个反向代理服务器,负责静态资源处理、动态请求转发以及结果的回复。 - uWSGI
uWSGI 是一个Web服务器,负责接收 Nginx 请求,转发并处理后发给 Django 以及
接收 Django 返回信息转发给 Nginx。uWSGI是 实现了uwsgi协议,WSGI规范和HTTP协议的 一个C语言实现的软件。 - Django
Django 是一个Web应用框架,在收到请求后进行逻辑和数据处理,然后响应结果给 uWSGI 服务器。
2. 通信关系
2.1 交互流程
- 首先客户端请求服务资源
- Nginx作为反向代理服务器,也是直接对外的服务接口,接收客户端发送过来的Http请求并对请求进行解包和分析
- 如果是静态文件请求,Nginx会根据其配置的静态文件目录,返回请求的资源
- 如果是动态的请求,Nginx会把请求(HTTP协议)转换uwsgi协议传递给uWSGI,uWSGI将接收到的包进行处理,并转发给WSGI
- WSGI根据请求调 Django工程的某个文件或函数,处理完后Django将返回值交给WSGI
- WSGI将返回值进行打包,转发给uWSGI
- uWSGI接收后转发给Nginx,Nginx最终将返回值返回给客户端(如浏览器)。
2.2 协议简介
- WSGI(Web Server Gateway Interface)
一种实现Python解析的通用接口标准/协议,WSGI规定了Python Web应用和Python Web服务器之间的通讯方式。目前主流的Python Web框架,比如Django,Flask,Tornado等都是基于这个规范实现的。 - uwsgi
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它和WSGI相比是两样东西。
3. Unix Socket 和 IP Socket
- Unix Socket
UNIX Domain SOCKET 是在Socket架构上发展起来的用于同一台主机的进程间通讯(IPC)。UNIX Domain SOCKET有SOKCET_DGRAM和SOCKET_STREAM两种模式,类似于UDP和TCP,但是面向消息的UNIX socket也是可靠的,消息既不会丢失也不会顺序错乱。 - IP Socket
IP socket要利用主机的传输层(tcp),可以用于同一台主机上不同进程间的通信,也可以用于网络上不同主机间的通信。 - 效率对比
基于localhost的IP Socket需要实现跨网络主机通讯的全部环节,包括建立socket连接,ACk开销,tcp流控,封装/解封,路由。在这个过程中还会有2个context switch,因为使用网络层传输数据需要调用system call,而调用system call会产生中断,导致context switch的;另外一个进程接受到来自网络层的连接请求,也会产生系统中断,导致context switch。以上过程导致2个context switch的开销,外加其它各种开销(overhead)。
Unix Socket 直接进行内存交换,它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序列号应答等。只是将应用层数据从一个进程拷贝到另一个进程。相对于IP Socket,它的效率更高。
参考博客:
https://www.jianshu.com/p/1c50b15b143a
https://blog.csdn.net/as57147/article/details/82889288
https://www.jianshu.com/p/aefe19723667
https://blog.csdn.net/zhangkun2609/article/details/84188465