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:\Python\Python39\lib\runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "D:\Python\Python39\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "E:\PycharmProjects\django-async-views\env\Scripts\gunicorn.exe\__main__.py", line 4, in <module>
File "e:\pycharmprojects\django-async-views\env\lib\site-packages\gunicorn\app\wsgiapp.py", line 9, in <module>
from gunicorn.app.base import Application
File "e:\pycharmprojects\django-async-views\env\lib\site-packages\gunicorn\app\base.py", line 11, in <module>
from gunicorn import util
File "e:\pycharmprojects\django-async-views\env\lib\site-packages\gunicorn\util.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:\PycharmProjects\django-async-views\env\Scripts\python.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('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base 'C:\Users\imxin\AppData\Local\Temp\pip-pip-egg-info-dxbd5o6z'
         cwd: C:\Users\imxin\AppData\Local\Temp\pip-install-oe6i3vdn\uvloop_633952133c054cf196bcdebbf2688263\
    Complete output (5 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\imxin\AppData\Local\Temp\pip-install-oe6i3vdn\uvloop_633952133c054cf196bcdebbf2688263\setup.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是成功的,但這與生產環境的要求就不符了. 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM