centos83+django3.1+ASGI+nginx部署.

摘要:
在上一篇文章中,当我们尝试在Windows下使用ASGI部署django3.1时,一半的部署失败了。为什么我们说一半失败了?

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

在docker下部署, 并不能真正用于生产,查查坑而已:

docker pull centos
docker run centos cat /etc/centos-release  # 查看pull下来的centos版本
CentOS Linux release 8.3.2011              # 8.3版
docker run centos -it /bin/bash       # 进入容器的命令行模式
yum install net-tools # 先安装网络工具,好使用ifconfig之类的工具

centos8.3 发行版默认有Python3,但centos的镜像默认没有python,需要安装一个.

yum install python3

结果默认安装的是python3.6.8 ,我又给删除了, 因为Python 3.9 对异步编程(asyncio)和多进程库进行了优化, 能更好发挥ASGI的能力.

yum install wget
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo # 更换成阿里云的源
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo  # 非阿里云运行这行
yum makecache # 老版本有个fast参数, 已经失效了.
yum list python* # 遗憾,只支持到3.8

源码方式安装试试.

yum -y update

yum groupinstall "Development Tools" -y  # 必要的工具,包括gcc

yum install openssl-devel libffi-devel bzip2-devel -y

gcc --version   # 看看gcc的版本 ,结果是3.8.1

wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz

cd /home

tar xvf Python-3.9.2.tgz

cd Python-3.9.2/

./configure --enable-optimizations

make altinstall    # 我用2核8G的虚拟机的docker容器, 好慢.

 添加python的国内源

python.exe -m pip install --upgrade pip
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip3.9 install django # 安装django 最新版本是3.1.7
python3.9 -m pip install uvicorn gunicorn

创建和激活虚拟环境

mkdir hello_async
cd hello_async
python3.9 -m venv env
source env/bin/activate

创建个django项目并用官方方法运行

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

报错了

[2021-03-13 19:00:17 +0000] [13110] [INFO] Starting gunicorn 20.0.4
[2021-03-13 19:00:17 +0000] [13110] [INFO] Listening at: http://127.0.0.1:8000 (13110)
[2021-03-13 19:00:17 +0000] [13110] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2021-03-13 19:00:17 +0000] [13111] [INFO] Booting worker with pid: 13111
[2021-03-13 19:00:17 +0000] [13111] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
    worker.init_process()
  File "/usr/local/lib/python3.9/site-packages/uvicorn/workers.py", line 62, in init_process
    self.config.setup_event_loop()
  File "/usr/local/lib/python3.9/site-packages/uvicorn/config.py", line 354, in setup_event_loop
    loop_setup = import_from_string(LOOP_SETUPS[self.loop])
  File "/usr/local/lib/python3.9/site-packages/uvicorn/importer.py", line 23, in import_from_string
    raise exc from None
  File "/usr/local/lib/python3.9/site-packages/uvicorn/importer.py", line 20, in import_from_string
    module = importlib.import_module(module_str)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 790, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/usr/local/lib/python3.9/site-packages/uvicorn/loops/uvloop.py", line 3, in <module>
    import uvloop
ModuleNotFoundError: No module named 'uvloop'
[2021-03-13 19:00:17 +0000] [13111] [INFO] Worker exiting (pid: 13111)
[2021-03-13 19:00:17 +0000] [13110] [INFO] Shutting down: Master
[2021-03-13 19:00:17 +0000] [13110] [INFO] Reason: Worker failed to boot.

提示,缺少uvloop.

deactivate # 必须退出虚拟环境
pip3.9 install uvloop

source env/bin/activate

再次运行

gunicorn hello_async.asgi:application -k uvicorn.workers.UvicornWorker

报错

  File "/usr/local/lib/python3.9/sqlite3/dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ModuleNotFoundError: No module named '_sqlite3'

退出虚拟环境

yum install sqlite-devel  # 也会自动安装sqlite

重新编译python,此处不重复写命令行了

pip3.9 install httptools     # 趁退出了虚拟环境,安装httptools模块,别问我是怎么知道的.

重新创建虚拟环境,并进入对应带manage.py的文件夹,再次运行,

gunicorn hello_async.asgi:application -k uvicorn.workers.UvicornWorker
(env) [root@4f64ace0cb0b hello_async]# gunicorn hello_async.asgi:application -k uvicorn.workers.UvicornWorker
[2021-03-13 19:34:43 +0000] [24570] [INFO] Starting gunicorn 20.0.4
[2021-03-13 19:34:43 +0000] [24570] [INFO] Listening at: http://127.0.0.1:8000 (24570)
[2021-03-13 19:34:43 +0000] [24570] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2021-03-13 19:34:43 +0000] [24571] [INFO] Booting worker with pid: 24571
[2021-03-13 19:34:43 +0000] [24571] [INFO] Started server process [24571]
[2021-03-13 19:34:43 +0000] [24571] [INFO] Waiting for application startup.
[2021-03-13 19:34:43 +0000] [24571] [INFO] ASGI 'lifespan' protocol appears unsupported.
[2021-03-13 19:34:43 +0000] [24571] [INFO] Application startup complete.

终于运行起来了.

通过在centos下的部署测试说明, 缺少uvloop模块对windows的支持, uvicorn.workers.UvicornWorker是不能工作的, 兄弟们我觉得可以暂时放弃在windows server下部署异步模式的django项目了.

退出容器, 看看宿主机防火墙状态

firewall-cmd --state  # 查看防火墙状态.
firewall-cmd --list-ports #查看所有打开的端口,ssh默认不显示
firewall-cmd --permanent --add-port=8000/tcp  # 添加一个规则,暴露8000端口用于在宿主机外访问容器内的django网站
firewall-cmd --reload # reload,使规则生效.

先commint一个容器镜像,回头再补充 与nginx的联合使用.

 docker commit -a "x****@foxmail.com" -m "centos83+python39+django3.1.7+ ASGI" 4f64ace0 centos_python_django_asgi:0.1

 

免责声明:文章转载自《centos83+django3.1+ASGI+nginx部署.》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Jmeter 循环控制器如何用javac 和java 编译运行整个Java工程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

VSCode 中Python代码自动补全与智能提示【转】

使用IDE编程,为了就是它的方便性、快捷性。而如何在VSCode中设置python环境的自动补全与智能提示呢?主要有下面两种方式: 使用微软插件 Visual Studio IntelliCode下载 Visual Studio IntelliCode 插件在VSCode 的 Extensions 中搜索 IntelliCode,选择 Visual Stu...

OpenCV 4.0+Python3.6 在 Windows 操作系统下开发环境搭建

1:到 https://www.python.org/ 网站上下载安装 Python 3.6.x; 2:使用 pip install opencv-python 命令安装 opencv-python 开发包; 3:或者使用 pip install opencv-contrib-python 命令安装 opencv-contrib-python 开发包; 4...

argparse 命令含参数模块

argparse是python的一个命令行参数模块,可以解析命令行参数,生成帮助等。 你可以这样使用它: Python代码 #!/usr/bin/python fromargparseimportArgumentParser p=ArgumentParser(usage='itisusagetip',description='thisisates...

python实现注册登录小程序

用python 实现模拟注册和登录的程序:用户信息最终以字典的格式储存在一个txt文件里,具体实现如下: users.txt里用户字典格式如下: 1 { 2 'name': {'password': '111111', 'role': '1'}, 3 'name2': {'password': '222222', 'role': '1'},...

Windows7下使用sphinx生成开源文档(原)

作者这里以osgearth文档为例,感觉这种生成文档的方式比较好,生成的html文档是支持搜索的,感谢开源工作者的奉献。赞一个 1. 下载并安装python for windows:https://www.python.org/downloads/windows/ 2.下载安装setup tools下载easy_stall.py 并运行https://py...

python中的subprocess.Popen() 执行shell命令

subprocess介绍 需要用到Python来执行shell脚本, 因此需要查看下subprocess模块文档。 根据官网文档描述:subprocess模块用于创建子进程, 这个模块用于替换旧版本中的一些模块, 如:os.system, os.spawn*, os.popen*, os.popen*, popen2.*, commands.*, subp...