1. Web 服务器
Web服务器: 用来接受客户端请求,建立连接,转发响应的程序.
Web服务器例如: Nginx, uWSGI等.
2. Web应用框架
Web应用框架: (Web application framework)是一种开发框架, 用来支持动态网站、网络应用程序及网络服务的开发。
Python中Django与flask就是Web框架.
Web应用: Web框架写的程序
运行在WSGI协议之上的Web框架有Django, Flask, Bottle.
3. WSGI
WSGI:(WEB SERVER GATEWAY INTERFACE)Web服务器网关接口, Web服务器与Web应用通信的一种规范.
WSGI协议定义Web服务器与Web应用解耦的规范, 实现程序与服务器之间交互的通用性.
即可以有多个实现WSGI server的服务器, 也可以有多个实现WSGI 的框架,
只要Web服务器和Web框架满足WSGI协议, 它们就能相互搭配.
WSGI服务器的选择很多, uWSGI 和 Gunicorn都是实现了WSGI server协议的服务器.
Django, Flask是实现了WSGI application协议的Web框架.
Django, Flask框架都有自己实现的简单的WSGI server服务器, 一般用于服务器调试.
在生产环境下建议用其他WSGI server服务器.
4. uWSGI
uWSGI: 实现了WSGI协议的一个Web服务器.
实现了WSGI协议, uwsgi, http等协议, 用于接收前端服务器转发的动态请求并处理后发给 Web 应用程序.
实际上,一个uWSGI的Web服务器, 再加上Django这样的Web框架, 就已经可以实现网站的功能了.
uwsgi协议是一个uWSGI服务器自有的协议, 它用于定义传输信息的类型(type of information),
每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西.
uWSGI是使用C编写的, 除了uwsgi协议的Web服务器. 还自带丰富的组件.
其中核心组件包含进程管理、监控、IPC等功能,实现应用服务器接口的请求插件支持多种语言和平台,
比如WSGI、Rack、Lua WSAPI,网管组件实现了负载均衡、代理和理由功能
5. Nginx+uWGSI
uWSGI也可以当做中间件.
如果是Nginx+uWSGI+App,那uWSGI就是一个中间件
如果是uWSGI+App,那它就是服务器
apache, Nginx服务器, 没有解析动态语言的功能, 而是分派给其他服务器模块来做
* apache就可以说内置了php模块, 支持php非常爽, 让人感觉好像apache就支持php一样
Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换.
如: Django 框架写了一个网站, 现在要将它挂在网上运行.
Nginx做为代理服务器:负责静态资源发送(js、css、图片等)、动态请求转发以及结果的回复.
uWSGI做为后端服务器:负责接收 Nginx 转发的请求并处理后发给 Django 应用
以及接收 Django 应用返回信息转发给 Nginx.
Django应用: 收到请求后处理数据并渲染相应的返回页面给 uWSGI 服务器.
浏览器 <--HTTP协议--> Nginx <--uWSGI协调--> uWSGI <--WSGI协议--> Django
Django应用, 通过WSGI协议连接uWSGI服务器, uWSGI服务器实现WSGI、http等协议,
通过uwsgi协议和Nginx服务器实现http的动态请求和转发以及结果
有了uWGSI, 为什么还需要Nginx?
一个普通的个人网站, 访问量不大的话, 可以由 uWSGI 和 Django 构成.
但是一旦访问量过大,客户端请求连接就要进行长时间的等待(Web服务器处理不来)
解决方案:
分布式服务器, 可以多准备来几台Web服务器, 处理请求.
Nginx负责分配客户端的请求连接给Web服务器.
Nginx是一个高性能的HTTP和反向代理服务器.
正向代理:正向的就是由浏览器主动的向代理服务器发出请求, 经代理服务器做出处理后再转给目标服务器
反向代理:反向的就是不管浏览器同不同意,请求都会经过代理服务器处理再发给目标服务器
![img](https://i-blog.csdnimg.cn/blog_migrate/334f136435d6e1c10ac7d0b1102bdf4f.png)
使用Nginx作为反向代理服务器的好处:
安全: 不管什么请求都要经过代理服务器, 可以避免外部程序直接攻击Web服务器
负载均衡: 根据请求情况和服务器负载情况, 将请求分配给不同的Web服务器, 保证服务器性能
提高Web服务器的IO性能: 请求从客户端传到Web服务器是需要时间的,传递多长时间就会让这个进程阻塞多长时间,
而通过反向代理,就可以由反向代理完整接受该请求,然后再传给Web服务器,从而保证服务器性能,
而且有的一些简单的事情(比如静态文件)可以直接由反向代理处理, 不经过Web服务器
(动态内容: 转发给uWSGI服务器, 静态文件: 直接返回静态文件)
6. 总结
WSGI是一种通信协议
uwsgi是一种通信协议,常用于在uWSGI服务器与其他网络服务器的数据通信
而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器