【后端】使用uWSGI部署django项目

背景

用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,但是一直没有尝试过。部署起来还是有点麻烦,虽然网上的资料比较全,但是或多或少的会遇到一些问题。简单记录一下过程,希望能有所帮助。

最后的最后,推荐一下我的个人博客星眺北海的小窝,萌新站长,求支持。

相关推荐
Dingdangr8 分钟前
了解 Python中的`try...except...finally`语句块是如何工作的?
开发语言·python
WangMing_X40 分钟前
linux入门到实操-4 linux系统网络配置、连接测试、网络连接模式、修改静态IP、配置主机名
linux·运维·服务器
有杨既安然1 小时前
Python数据分析与可视化基础教程
开发语言·python·信息可视化·数据分析·excel
丨我是张先生丨1 小时前
Python 导出Excel
python·excel
计算机学姐1 小时前
基于python+django+vue的视频点播管理系统
vue.js·python·mysql·django·pip·web3.py·ipython
AI让世界更懂你1 小时前
漫谈设计模式 [9]:外观模式
python·设计模式·外观模式
SilentCodeY2 小时前
docker 安装 mysql5.7
linux·运维·mysql·docker·容器
爱里承欢。2 小时前
【python - 函数】
开发语言·python
Python极客之家2 小时前
基于Python的B站热门视频可视化分析与挖掘系统
大数据·python·数据分析·毕业设计·网络爬虫·线性回归·课程设计
シ風箏2 小时前
MinIO【部署 02】Linux集群版本及Windows单机版、单机多目录版、分布式版(cmd启动脚本及winsw脚本分享)
linux·windows·分布式·minio·文件存储系统