背景
用django+vue做了一个小项目,想尝试用uWSGI部署一下,以前都是用的django自带的服务器。简单记录一下。
前提
- linux服务器 或 虚拟机(我用的是 挂载 Alibaba Cloud Linux3.21.04 的阿里云轻量应用服务器)
- 一个能正常运行的django项目
准备工作
安装python环境
安装conda
使用任意ssh工具连接至服务器,然后安装conda:清华大学开源软件镜像站。我个人比较喜欢miniconda
选择一个合适的版本,我们这里要选择以Linux-x86_64.sh
结尾的版本。然后 右键-复制链接
在ssh终端中输入,就是刚才复制的链接
shell
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py312_24.5.0-0-Linux-x86_64.sh
等待下载完成后,输入
shell
chmod +755 Miniconda3-py312_24.5.0-0-Linux-x86_64.sh
shell
./Miniconda3-py312_24.5.0-0-Linux-x86_64.sh
进入安装程序后按指引操作即可,注意最后一个选项是问你要不要打开终端时默认启用conda环境,为了方便我们要选择 是
安装完成后重启终端,命令行开头出现(base)即可,没出现的话就到你的conda安装目录中手动启动
安装python
终端执行
shell
conda create -n <随便取个名字> python=<选择合适的python版本>
#例如
conda create -n django_env python=3.12
安装过程默认回车即可
安装完成后输入
shell
conda activate django_env
(base)会变成(django_env)
进入到环境之后直接用pip安装你的项目需要的包即可
上传项目文件
上传项目文件的方式有很多,比如通过git,通过xftp等,通过pycharm远程主机等等,能传上去就行
测试
进入django项目的根目录下,执行
shell
python manage.py runserver
出现熟悉的django启动打印即可
安装配置uWSGI
安装
终端输入
shell
pip install uwsgi
然后报错
shell
ERROR: ERROR: Failed to build installable wheels for some pyproject.toml based projects (uwsgi)
尝试使用conda安装conda-forge / packages / uwsgi
shell
conda install -c conda-forge uwsgi
等待安装完成后,输入pip list
可以看到已经有uWSGI
了
配置
shell
uwsgi --http :8000 --chdir <项目目录> --moudle <项目名.wsgi:application>
项目名就是包含settings.py
文件的目录名
然后我们可以在浏览器访问对应的ip和端口,能正常访问即可,例如
注意,此时不再为你提供静态资源服务,你的页面样式可能会失效。我们稍后再处理
一般来说,我们应该编写一个uwsgi.ini
文件,而不是每次都用命令行传递配置参数
参考【django云服务器部署】django+uwsgi+nginx 部署的完整流程
python
[uwsgi]
# 使用http访问,0表示任何IP,8001表示端口号,要求同上
http = 0:8000
# 项目的绝对路径
chdir = /root/blog
# 项目的wsgi.py文件,如果你怕写乱,此处建议写绝对路径
wsgi-file = /root/blog/myblog/wsgi.py
# 允许主线程存在
master = true
# 开启进程的数量
processes = 1
# 开启多线程
enable-threads = false
# 当服务器退出的时候自动清理环境,删除socket文件和pid文件
vacuum = true
# 使进程在后台运行,并将日志打到指定的日志文件
daemonize = uwsgi.log
# 指定pid文件的位置,记录主进程的pid号,主要用于关闭服务
pidfile = uwsgi.pid
然后启动uwsgi
shell
uwsgi --ini uwsgi.ini
不出意外的话,现在已经可以在浏览器中看到我们的Django项目了。
uwsgi常用命令
shell
# 启动uWSGI服务器
uwsgi --ini uwsgi.ini
# 停止uWSGI服务器
uwsgi --stop uwsgi.pid
# 重启uWSGI服务器
uwsgi --reload uwsgi.pid
# 查看所有uWSGI进程
ps aux | grep uwsgi
# 停止所有uWSGI进程
sudo pkill -f uwsgi -9
关于静态资源
一般来说, 我们的静态资源文件不会用uwsgi来处理,而是用nginx来处理。
关于nginx的安装部署可以看这篇文章Linux系统下安装配置 Nginx 超详细图文教程
大概原理就是,让nginx监听端口,然后堆所有进入这个端口的请求进行路由匹配,然后进行不同的操作,比如/static/
,nginx直接响应静态文件,对于/api/
nginx把这次请求转发给uwsgi处理,处理完成之后交给nginx返回。
意思就是我们现在实际请求的是nginx服务器,由nginx将请求转交给uwsgi服务器,所以即使它不提供静态资源服务,也不会影响我们页面的样式。
如何收集静态资源文件
因为我是前后端分离的项目,所以其实涉及不到这个,简单提一下
在项目目录执行
shell
python manage.py collectstatic
项目的静态资源文件会被复制到STATIC_ROOT
指定的目录中
然后将其拷贝到nginx的静态资源目录中并配置静态资源路由即可,上诉的文章有详细的教程
在配置完成后访问nginx的端口就可以访问到我们部署的服务了
结语
一直以来都是用django和flask自带的服务器部署的,想要在后台运行还要使用 nohup 命令。很久之前就了解到了uWSGI,但是一直没有尝试过。部署起来还是有点麻烦,虽然网上的资料比较全,但是或多或少的会遇到一些问题。简单记录一下过程,希望能有所帮助。
最后的最后,推荐一下我的个人博客星眺北海的小窝,萌新站长,求支持。