windows+django3.1+ASGI+nginx部署

# 了解CGI

CGI(通用网关接口, Common Gateway Interface/CGI),定义客户端与Web服务器的交流方式的一个程序。

#  什么是WSGI

PythonWeb服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受, 它已基本达成它的可移植性方面的目标。
WSGI 没有官方的实现, 因为WSGI更像一个协议. 只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行, 反之亦然。
WSGI标准在 PEP 333中定义并被许多框架实现,django框架支持WSGI(3.0以上版本也支持)接口协议。

#  什么是ASGI

ASGI(异步网关协议接口,Asynchronous Server Gateway Interface)一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型。

WSGI是基于HTTP协议模式的,不支持WebSocket,而ASGI的诞生则是为了解决Python常用的WSGI不支持当前Web开发中的一些新的协议标准。同时,ASGI对于WSGI原有的模式的支持和WebSocket的扩展,即ASGI是WSGI的扩展

Django3.0以后支持ASGI了, 在21年3月份我做本练习的时候,Django的版本为3.1.7.  3.2Bata版也已经发布, 安装Django的惯例,3.2版本应该就是长期支持版, 即时,在Django上编写异步代码的人也会越来越多.

#  异步视图的HelloDjangoWorld:

from django.http import HttpResponse 
 
async def index(request):
    return HttpResponse("Hello, async Django!")

#  我将在在windows和linux下分别尝试一下用ASGI部署生产环境,本随笔记录一下windows环境下安装和配置过程.

1. 下载nginx, 最新的stable版本是1.18.0,  链接http://nginx.org/download/nginx-1.18.0.zip

2.无需安装,绿色版,解压缩到一个文件夹下,等一下进行配置.

3. 使用Django内置开发测试服务器,项目可以启动,但实际上它不会真正异步运行,按照Django官方手册,我们需要用Uvicorn来启动项目。手册链接 https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/uvicorn/

(env)$python -m pip install uvicorn gunicorn

创建一个Django项目,用uvicorn启动项目:

(env)$ django-admin.py startproject hello_async
(env)$ gunicorn hello_async.asgi:application -k uvicorn.workers.UvicornWorker  #Django官方手册的方法

报错了:

Traceback (most recent call last):
File "D:PythonPython39lib unpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "D:PythonPython39lib unpy.py", line 87, in _run_code
exec(code, run_globals)
File "E:PycharmProjectsdjango-async-viewsenvScriptsgunicorn.exe\__main__.py", line 4, in <module>
File "e:pycharmprojectsdjango-async-viewsenvlibsite-packagesgunicornappwsgiapp.py", line 9, in <module>
from gunicorn.app.base import Application
File "e:pycharmprojectsdjango-async-viewsenvlibsite-packagesgunicornappase.py", line 11, in <module>
from gunicorn import util
File "e:pycharmprojectsdjango-async-viewsenvlibsite-packagesgunicornutil.py", line 9, in <module>
import fcntl
ModuleNotFoundError: No module named 'fcntl'

提示缺少模块 "fcnt1", 那尝试安装一下

python -m pip install fcntl

报错

Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
ERROR: Could not find a version that satisfies the requirement fcnt1
ERROR: No matching distribution found for fcntl

尝试不使用gunicorn 管理uvicorn.

uvicorn hello_async.asgi:application

显示:

INFO:     Started server process [13780]
INFO:     Waiting for application startup.
INFO:     ASGI 'lifespan' protocol appears unsupported.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

成功运行,也能用浏览器访问到. 

阅读uvicorn手册,链接 https://www.uvicorn.org/deployment/  ,发现这句

The following will start Gunicorn with four worker processes:

gunicorn -w 4 -k uvicorn.workers.UvicornWorker

The UvicornWorker implementation uses the uvloop and httptools implementations.uvicorn.
workers.UvicornWorker方法,需要调用uvloop, 我尝试安装uvloop
python -m pip install  uvloop
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting uvloop
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/44/6e/0cb292e4e6ee1382e2ede458f90c94b4f990b261f738403ac45cb8183bc2/uvloop-0.15.2.tar.gz (2.1 MB)
    ERROR: Command errored out with exit status 1:
     command: 'E:PycharmProjectsdjango-async-viewsenvScriptspython.exe' -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\Users\imxin\AppData\Local\Temp\pip-install-oe6i3vdn\uvloop_633952133c054cf196bcdebbf2688263\setup.py'"'"'; __file__='"'"'C:\Users\imxin\AppData\Local\Temp\pip-install-oe6i3vdn\uvloop_633952133c054cf196bcdebbf2688263\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'
'"'"', '"'"'
'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base 'C:UsersimxinAppDataLocalTemppip-pip-egg-info-dxbd5o6z'
         cwd: C:UsersimxinAppDataLocalTemppip-install-oe6i3vdnuvloop_633952133c054cf196bcdebbf2688263
    Complete output (5 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:UsersimxinAppDataLocalTemppip-install-oe6i3vdnuvloop_633952133c054cf196bcdebbf2688263setup.py", line 8, in <module>
        raise RuntimeError('uvloop does not support Windows at the moment')
    RuntimeError: uvloop does not support Windows at the moment   #  不支持windows

:这跟找不到fcntl模块虽说完全没关系, 看来按照官方的方法, 既然workers.UvicornWorker需要调用uvloop, 但uvloop又不支持windows, 目前是不可能部署到windows server的, 我个人认为兄弟们暂时不用尝试填坑了.

心得总结: 

在windows下尝试使用ASGI部署django3.1,部署失败一半,为什么说失败一半呢?因为按照官方文档, Gunicorn是在生产环境中运行和管理Uvicorn的最简单方法, 但是比如用 gunicorn -w 4 -k uvicorn.workers.UvicornWorker 以四个工作进程启动Gunicorn的时候,UvicornWorker的实现使用uvloophttptools, uvloop模块并不支持windows. 如果不用Gunicorn, 仅仅使用uvicorn是成功的,但这与生产环境的要求就不符了. 

原文地址:https://www.cnblogs.com/worldinmyeyes/p/14527293.html