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

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

相关推荐
q5673152323 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
是萝卜干呀24 分钟前
Backend - Python 爬取网页数据并保存在Excel文件中
python·excel·table·xlwt·爬取网页数据
代码欢乐豆25 分钟前
数据采集之selenium模拟登录
python·selenium·测试工具
狂奔solar1 小时前
yelp数据集上识别潜在的热门商家
开发语言·python
Tassel_YUE1 小时前
网络自动化04:python实现ACL匹配信息(主机与主机信息)
网络·python·自动化
聪明的墨菲特i1 小时前
Python爬虫学习
爬虫·python·学习
hjjdebug1 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯1 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流1 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
斑布斑布1 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习