在虚拟环境用uwsgi部署Django4.1时的出现的问题的解决思路

Posted 康娜喵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在虚拟环境用uwsgi部署Django4.1时的出现的问题的解决思路相关的知识,希望对你有一定的参考价值。

一.缘由

首先Django推出了4.1版本,正好重构了项目,故需要部署。但是由于本人头极铁,不想使用docker,所以想试试用虚拟环境去部署Django
其次,之前部署过Django,过程Django学习记录11——利用uwsgi在ubuntu18.04server上部署

二.虚拟环境

  • 先使用了apt安装了python3.8
  • 然后在/home/ubuntu/目录下使用python -m venv django4创建了一个虚拟文件夹,可以使用source ./django4/bin/activate激活虚拟环境

三.问题一:安装包失败

3.1现象

安装各种包的时候,出现了各种包括单不限于:

`Command "/usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-46IKo9/pillow/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))" install --record /tmp/pip-LQwgnq-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-46IKo9/pillow`

等问题

3.2 解决思路(均激活虚拟环境)

  • 先考虑是不是缺了什么依赖包,对比本地环境和虚拟环境,把缺的包用pip补上,结果是无济于事。
  • 最后发现了报错关键字error: command 'x86_64-linux-gnu-gcc' failed with exit status 1fatal error: Python.h:,考虑会不会是编译问题。
  • 通过apt补下了许多python的依赖包,最后在虚拟环境的环境中下载了对应版本的依赖库sudo apt-get install python3.8-dev,此时pip安装依赖库不会出错

四.Django无法使用数据库

4.1 现象

用户名密码IP全正确的情况下,出现了:
"Access denied for user 'KannaWeb'@'127.0.0.1' to database 'KannaWeb'

4.2 解决过程

  • 手动登陆数据库,成功。
  • 最后发现是表名的问题,新版宝塔会自动将数据库名称的大写转为小写。改下代码即可。

五. uWSGI失效

5.1 现象

  • 用之前的.ini能启动uwsgi,但是无法访问网页,进程也很离谱。用uwsgi --stop <uwsgi pid file>killall -s INT uwsgi都杀不掉。杀就报错:signal_pidfile()/kill(): No such process [core/uwsgi.c line 1693]或者其他问题。
  • 使用python manage.py runserver能跑通服务器,决定是uwsgi的问题,决定倒找问题。

5.2 解决过程

5.2.0 补充一下虚拟环境的目录结构

ubuntu@VM-4-2-ubuntu:~/django4$ tree -L 2
.
├── bin
│   ├── Activate.ps1
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── django-admin
│   ├── easy_install
│   ├── easy_install-3.8
│   ├── pip
│   ├── pip3
│   ├── pip3.8
│   ├── python -> python3.8
│   ├── python3 -> python3.8
│   ├── python3.8 -> /usr/bin/python3.8
│   ├── sqlformat
│   ├── uwsgi
│   └── wheel
├── include
├── lib
│   └── python3.8
├── lib64 -> lib
├── pyvenv.cfg
└── share
    └── python-wheels

5.2.1 先找systemctl的问题

打开web_uwsgi.service查看代码:

[Unit]
Description=HTTP Interface Server For Django

[Service]
#自己修改一下路径
ExecStart=/usr/local/bin/uwsgi --ini /www/wwwroot/Kanna/uwsgi.ini
ExecReload=/usr/local/bin/uwsgi --reload /www/wwwroot/Kanna/log/pid/uwsgi.pid
ExecStop=/usr/local/bin/uwsgi --stop /www/wwwroot/Kanna/log/pid/uwsgi.pid

[Install]
WantedBy=multi-user.target

好像虚拟环境有个uwsgi啊,改下目录试试呢。把三个XXX=/usr/local/bin/uwsgi改成了虚拟环境的uwsgi
问题没有解决

5.2.2再看uwsgi的log

这部分主要就是看log写了啥,看看里面的路径什么的对不对,或者有没有其他报错信息。

  • 看前面的logPython version: 3.6.9 (default, Dec 9 2021, 17:53:27),果然是uwsgi没整对。
    刚才改了路径后Service启动的uwsgi成了:Python version: 3.8.0 (default, Dec 9 2021, 17:53:27) [GCC 8.4.0]这个对了。
    同理,用uwsgi --ini uwsgi.ini时,必须进入虚拟环境!
  • 再看log sys._base_executable = '/home/ubuntu/django4/bin//bin/python'。好家伙,路径错了。我在uwsgi.ini里写的: virtualenv=/home/ubuntu/django4/bin,是目录重叠了!改好路径后,成功运行!

六.总结

通过这次的部署,我得到了以下收获:

  • 遇到问题一定要把报错看全,不要拿起半头就开始百度。多思考报错内容是在项目的哪部分,与项目是什么关系,如何去解决这部分问题。
  • 当对外输出的报错信息没有用时,去看看运行日志,或者思考运行流程。面向过程的排查与解决问题。

以上是关于在虚拟环境用uwsgi部署Django4.1时的出现的问题的解决思路的主要内容,如果未能解决你的问题,请参考以下文章

uwsgi+nginx反向代理项目部署

[部署开发环境]部署django的生成环境nginx+uwsgi+django

在阿里云服务器使用nginx+uwsgi+venv部署Django项目

利用uWSGI和nginx进行服务器部署

部署(5.安装配置uwsgi)

使用uwsgi在centos7上部署Flask在线Web服务