一.缘由
首先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 1
和fatal 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写了啥,看看里面的路径什么的对不对,或者有没有其他报错信息。
- 看前面的
log
:Python 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
,是目录重叠了!改好路径后,成功运行!
六.总结
通过这次的部署,我得到了以下收获:
- 遇到问题一定要把报错看全,不要拿起半头就开始百度。多思考报错内容是在项目的哪部分,与项目是什么关系,如何去解决这部分问题。
- 当对外输出的报错信息没有用时,去看看运行日志,或者思考运行流程。面向过程的排查与解决问题。