一 CGI协议
公共网关接口(Common Gateway Interface,CGI)是最早的Web服务器主机提供信息服务的标准接口规范。只要实现了CGI协议,Web服务器就能够获取并了解客户端提交的信息,转交给服务器端的web应用程序进行处理,最后返回结果给客户端。只有Web服务器和Web应用程序都实现了网关接口规范以后,双方的通信才能顺利完成。常见的网关接口协议:CGI,FastCGI,WSGI,ASGI。
定义 | ||
web服务器 | 是一种运行于网站后台(物理服务器)的软件。Web服务器主要用于提供网页浏览或文件下载服务,它可以向浏览器等Web客户端提供html网页文档等相关资源的,也可以提供其他类型的可展示文档,让客户端用户浏览;还可以提供数据文件下载等。目前世界上最主流的Web服务器有 Nginx |
|
web应用程序 | Web应用程序(Web Programming Application)是一种能完成web业务逻辑,能让用户基于web浏览器访问的应用程序,它可以是一个实现http请求和响应功能的函数或者类,也可以是Django、Flask、sanic、FastAPI等这样的web框架 |
二 WSGI协议
协议
Web服务器网关接口(Python Web Server Gateway Interface,WSGI),
conda config --add channels conda-forgea
conda环境安装uWSGI
conda install uWSGI
项目根目录下创建uwsgi的配置文件uwsgi.ini
[uwsgi] #使用nginx连接时使用,Django程序所在服务器地址 socket=0.0.0.0:8000 #直接做web服务器使用,Django程序所在服务器地址 # http=0.0.0.0:8000 #项目目录 chdir=项目根目录 #项目中wsgi.py文件的目录,相对于项目目录 wsgi-file=主应用目录/wsgi.py # 进程数 CPU * 2 -1 processes=4 # 线程数 threads=2 # uwsgi服务器的角色 master=True # 存放进程编号的文件 pidfile=uwsgi.pid # 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的 daemonize=uwsgi.log # 指定依赖的虚拟环境 virtualenv=环境名称
终端下,在项目根目录下,启动uwsgi服务器
uwsgi --ini uwsgi.ini
终端下,在项目根目录下,停止运行
uwsgi --stop uwsgi.pid # uwsgi.pid可通过ps aux | grep -Iuwsgi查看
Uvicorn 当前支持 HTTP / 1.1 和 WebSockets,将来计划支持HTTP/2。
conda install uvicorn
项目根目录下,使用uvicorn运行django项目
# DEBUG模式,uvicorn 主应用目录名.asgi:application --reload,修改代码会自动重启项目 uvicorn demo.asgi:application --reload # 多进程模式 --workers <int> 进程数量,cpu * 2 + 1 # uvicorn ademo.asgi:application --workers 4
一般使用gunicorn来管理uvicorn,这样可以一并安装并且提升当前web服务器应对高并发流量的支撑。
# 安装gunicorn conda install gunicorn # 运行gunicorn gunicorn -w 4 ademo.asgi:application -k uvicorn.workers.UvicornWorker --reload
四 CGI/WSGI/ASGI协议的区别
协议,规范 | 支持的请求协议(常见,未列全) | 同步/异步 | 支持的框架 |
---|---|---|---|
CGI | HTTP | 同步 | CGI程序 |
WSGI | HTTP | 同步 | django3.0以前,Flask1.0 |
ASGI | HTTP,HTTP2,WebSocket等 | 同步/异步 | FastAPI,Tornado,django3.0以后,flask2.0,Quart,Sanic, |