Django笔记四十三之使用uWSGI部署Django系统
本文首发于公众号:Hunter后端
目前部署 Django 的方式一般来说是使用 Nginx + uWSGI + Django 来实现。
处理流程是,当一个请求发送过来会先经过 Nginx,如果是静态文件请求,Nginx 这一层直接处理,如果是后端动态接口,则会发送至 uWSGI,而 uWSGI 是一个 web 服务器,它实现的操作是将 HTTP 请求转换成 Python 支持的网络协议,比如 WSGI 协议。
以下是本篇笔记目录:
- Nginx 和 uWSGI
- WSGI、uWSGI 和 uwsgi
- uWSGI 示例及启动
- 配置项详解
1、Nginx 和 uWSGI
使用 Nginx 相当于实现了一次反向代理,也可以通过使用 Nginx 实现负载均衡,将请求分配给不同的后端服务,同时静态文件和动态接口分开请求,提高服务响应性能。
如果部署操作直接使用 uWSGI + Django,那么 uWSGI 就相当于一个 web 服务器,用于直接处理 HTTP 请求。如果是配合 Nginx 使用,相当于是一个中间件的作用,起到转发来自 Nginx 请求的作用。
2、WSGI、uWSGI 和 uwsgi
接下来理解一下 uWSGI,WSGI 和 uwsgi 这几个概念。
WSGI
web server gateway interface,web 服务器网关接口,是一种协议规范,是用于 wsgi 服务器(比如 uWSGI) 和 wsgi 应用(比如 Django)之间进行通信的规范。
uWSGI
web 服务器,或者叫 wsgi 服务器,实现 http 协议,用于接收 http 请求并能够解析信息。要将信息发给 Django,必须要用到 WSGI 协议,所以同时也可以实现 WSGI 协议。
uwsgi
是 uWSGI 服务器自有的线路协议,用于与 Nginx 等代理服务器通信。
3、uWSGI 示例及启动
我们可以通过 uWSGI 命令,将参数都写入命令行直接运行,也可以将配置项写入配置文件,用 uWSGI 直接获取配置信息,这里我们介绍都写入配置文件的方法来操作。
1、uWSGI 安装
首先我们需要安装一下 uWSGI:
pip3 install uwsgi -i https://mirrors.aliyun.com/pypi/simple/
2、配置示例及启动
假设我们的 Django 系统目录为 /path/to/hunter/,我们在该目录下创建一个文件 uwsgi.ini。
uwsgi.ini 内容如下:
# uwsgi.ini
[uwsgi]
http = :9898
chdir = /path/to/hunter/
wsgi-file = hunter/wsgi.py
master=true
processes = 4
threads = 2
以上是一个简单的可运行 uwsgi.ini 配置示例。
接着我们运行一下:
uwsgi uwsgi.ini
可以看到在 shell 的前台输出下面的信息:
*** Starting uWSGI 2.0.21 (64bit) on [Mon Mar 20 00:14:08 2023] ***
...
...
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 16291)
spawned uWSGI worker 1 (pid: 16295, cores: 2)
spawned uWSGI worker 2 (pid: 16296, cores: 2)
spawned uWSGI worker 3 (pid: 16299, cores: 2)
spawned uWSGI worker 4 (pid: 16301, cores: 2)
表示 uWSGI 已经正常启动,接着我们在浏览器访问该地址的 9898 端口的 admin 页面,可以看到没有样式的 admin 登录页面,如下:

4、配置项详解
在这里我们是直接使用 uWSGI + Django 的方式启动,所以首行是 http=:9898,表示可以通过浏览器的方式访问。
如果回头我们使用 Nginx + uWSGI + Django 的方式启动,这里就要改成 socket=:9898。
chdir
chdir 参数指向的是我们项目根目录
wsgi-file
这里我们填写的是相对地址,文件是 Django 系统在创建项目时自动创建的。
master
表示的是启动的 uWSGI 主进程是否开启
processes
表示启动的是进程数,所以在启动后输出的信息里,会有主进程和四个进程的信息
threads
表示的线程数,在上面的进程数后面 cores: 2,输出的就是线程信息。
除了上面这些参数,我们还可以定义一些其他的参数
daemonize
daemonize 的值为一个地址,用于记录 uWSGI 运行的日志,同时将服务在后台运行。
daemonize = /var/log/uwsgi/xxx.log
static-map
static-map 参数作用是映射 Django 的静态文件路径,前面我们运行之后,访问后台 admin 界面,发现没有前端样式对不对,如果想要有样式显示,则需要先定义这个参数,然后将 Django 的 admin 样式文件迁移到指定文件,操作步骤如下:
1.定义 STATIC_ROOT
首先,我们需要在 settings.py 里定义 STATIC_ROOT,这个参数是一个路径,表示我们在下一步需要将静态文件集中到的文件路径,假设我们需要把文件都集中到 /var/static/ 目录下:
# settings.py
STATIC_ROOT = "/var/static/"
2.collectstatic命令
接下来执行静态文件集中的命令:
python3 manage.py collectstatic --no-input
本来前面的命令就可以了,但是执行的时候会有选择项需要我们选择,在后续部署的时候,我们可以加上 --no-input 表示不需要提示输入信息。
3.定义static-map
接下来我们定义 static-map 就可以映射静态文件的地址,这样,我们使用 uWSGI 部署 Django 后也可以访问 admin 的静态文件里。
static-map = /static/=/var/static/
stats
stats 参数后面接的内容是端口,用于获取 uWSGI 几个 worker 的状态信息。
如果想要到浏览器访问的话还需要加一个 stats-http=true,如下:
stats = 127.0.0.1:9897
stats-http = true
timeout
关于 timeout 有两个参数,一个是 http-timeout,一个是 socket-timeout。
前面介绍了开放端口的时候,如果是 uWSGI 单独使用,就使用 http,那么 timeout 就使用 http-timeout
如果是配合 Nginx 使用,那么就使用 socket-timeout。
它的单位是秒.
http-socket=60 # 60秒超时时间
注意:上面的计算运行超时之后,会断开与前端的连接,但是后端还是会继续执行逻辑
harakiri
这个也是超时时间,但是与 timeout 不同的是,这个参数在超时之后断开连接之后,同时后端也停止执行运算,具体的操作是重启该请求所在的进程。
它的单位也是秒。
max-requests
重启进程的最大请求数,比如我们设置:
max-requests=5000
那么在某个 worker 进程处理 5000 个请求之后则会重启。
以上就是使用 uWSGI 启动 Django 系统的示例及介绍,在之后的笔记中会再介绍如何使用 Nginx 进行操作,包括使用 Nginx 进行反向代理和负载均衡的配置。
如果想获取更多相关文章,可扫码关注阅读:

Django笔记四十三之使用uWSGI部署Django系统的更多相关文章
- 填坑!!!virtualenv 中 nginx + uwsgi 部署 django
一.为什么会有这篇文章 第一次接触 uwsgi 和 nginx ,这个环境搭建,踩了太多坑,现在记录下来,让后来者少走弯路. 本来在 Ubuntu14.04 上 搭建好了环境,然后到 centos7. ...
- Django笔记二十三之case、when操作条件表达式搜索、更新等操作
本文首发于公众号:Hunter后端 原文链接:Django笔记二十三之条件表达式搜索.更新等操作 这一篇笔记将介绍条件表达式,就是如何在 model 的使用中根据不同的条件筛选数据返回. 这个操作类似 ...
- nginx + uwsgi 部署 Django+Vue项目
nginx + uwsgi 部署 Django+Vue项目 windows 本地 DNS 解析 文件路径 C:\Windows\System32\drivers\etc 单机本地测试运行方式,调用dj ...
- Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统
Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统 这个是写好的Django程序在本地机运行的情况,一个查询接口. 准备工作 1.首先购买一台阿里云的EC ...
- nginx + uwsgi 部署django项目
因项目需求,需要部署django项目,这里是基础的nginx配合uwsgi部署django,后续会采用docker部署的方式 环境: centos7 python3.5.4 django2.1.4 u ...
- Django笔记四之字段属性
这篇笔记介绍的 field options,也就是 字段的选项属性. 首先,关于 model,是数据库与 python 代码里的一个映射关系,每一个 model 是django.db.models.M ...
- Django笔记三十三之缓存操作
本文首发于公众号:Hunter后端 原文链接:Django笔记三十三之缓存操作 这一节介绍一下如何在 Django 中使用 redis 做缓存操作. 在 Django 中可以有很多种方式做缓存,比如数 ...
- Nginx + uWSGI 部署Django 项目,并实现负载均衡
一.uWSGI服务器 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI ...
- 使用uWSGI部署django项目
先说说什么是uWSGI吧,他是实现了WSGI协议.uwsgi.http等协议的一个web服务器,那什么是WSGI呢? WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx)与应用服务 ...
- 生产环境使用Nginx+uwsgi部署Django
在本地运行django应用相对来说还是挺方便的,使用自带的runserver启动即可.如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等 在网上找到了不错的部署的教 ...
随机推荐
- ASP.NET WebForm中在TextBox输入框回车时会触发其他事件,如何处理?
一.TextBox在输入框回车时会触发其他事件,如何解决? 前台代码: <ul> <li><span>名称:</span><asp:TextBox ...
- 从 Pulsar Client 的原理到它的监控面板
背景 前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了.生产者消息发送缓慢等各种问题. 虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,比如速率.流量.消 ...
- 交换分区swap的创建与管理
前言 swap分区是linux系统中一块特殊的硬盘空间,当实际内存不够用的时候,系统会按照一定的算法将部分不用的数据放在swap分区中,从而为当前运行的程序腾出足够的内存空间.好处在于避免内存资源不足 ...
- [golang]使用gocron编写定时任务
前言 linux自带的crontab默认情况下只能精确到分钟,没法执行秒级任务.当然,也不是不行,比如: * * * * * for i in $(seq 1 11);do echo hello &g ...
- Jmeter:"An error occurred: Can't connect to X11 window server using 'lacalhost:12.0' as the value of the display variable." 解决办法
做各种不同项目的性能测试,都需要在项目本地压测服务器配置jmeter,需要时还要调出jmeter图形化界面来调试jmeter脚本. 标题中的问题遇过多次,这次做个记录. 1. 启动jmeter报错 在 ...
- Python 潮流周刊#16:优雅重要么?如何写出 Pythonic 的代码?
你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中两则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...
- AI绘画| 迪士尼风格|可爱头像【附Midjourney提示词】
Midjourney案例分享 图片预览 迪士尼风格|可爱头像 高清原图及关键词Prompt已经放在文末网盘,需要的自取 在数字艺术的新时代,人工智能绘画已经迅速崭露头角.作为最先进的技术之一,AI绘画 ...
- shopee的前景以及商用API(代码封装)
Shopee平台是东南亚和台湾地区最具代表性的电商平台之一,在过去几年里取得了巨大的成功.以下是Shopee平台的发展前景: 电商市场的快速增长:东南亚和台湾地区是人口众多.市场潜力巨大的区域,电商市 ...
- c语言代码练习--函数
函数: 一,概念: 1,在计算科学中,子程序(英语:Subroutione,procedure,function,rotine,method.subprogram,callable unit),是一个 ...
- 常见的企业Wiki
企业Wiki(Enterprise Wiki)指适用于企业或组织内部使用的Wiki.与非企业Wiki(如著名的MediaWiki)最根本的不同点在于,企业Wiki是为企业量身定做的Wiki.通过鼓励. ...