如何使用 Django 与 uWSGI

uWSGI 是一个快速、自愈且对开发人员/系统管理员友好的应用程序容器服务器,完全用 C 语言编写。

另请参阅

uWSGI 文档提供了一个 教程,涵盖了 Django、nginx 和 uWSGI(众多部署设置中的一种)。下面的文档重点介绍如何将 Django 与 uWSGI 集成。

先决条件: uWSGI

uWSGI wiki 描述了多个 安装过程。使用 Python 包管理器 pip,您可以使用单个命令安装任何 uWSGI 版本。例如

# Install current stable version.
$ python -m pip install uwsgi

# Or install LTS (long term support).
$ python -m pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz

uWSGI 模型

uWSGI 采用客户端-服务器模型。您的 Web 服务器(例如 nginx、Apache)与 django-uwsgi “工作进程” 通信以提供动态内容。

为 Django 配置和启动 uWSGI 服务器

uWSGI 支持多种配置进程的方式。请参阅 uWSGI 的 配置文档

以下是一个启动 uWSGI 服务器的示例命令

uwsgi --chdir=/path/to/your/project \
    --module=mysite.wsgi:application \
    --env DJANGO_SETTINGS_MODULE=mysite.settings \
    --master --pidfile=/tmp/project-master.pid \
    --socket=127.0.0.1:49152 \      # can also be a file
    --processes=5 \                 # number of worker processes
    --uid=1000 --gid=2000 \         # if root, uwsgi can drop privileges
    --harakiri=20 \                 # respawn processes taking more than 20 seconds
    --max-requests=5000 \           # respawn processes after serving 5000 requests
    --vacuum \                      # clear environment on exit
    --home=/path/to/virtual/env \   # optional path to a virtual environment
    --daemonize=/var/log/uwsgi/yourproject.log      # background the process

这假设您有一个名为 mysite 的顶级项目包,并且在其内部有一个模块 mysite/wsgi.py,其中包含一个 WSGI application 对象。如果您运行了 django-admin startproject mysite(使用您自己的项目名称替换 mysite)并使用了最新版本的 Django,那么您将拥有此布局。如果此文件不存在,则需要创建它。请参阅 如何使用 WSGI 部署 文档以了解应在此文件中放入的默认内容以及可以添加的其他内容。

此处特定于 Django 的选项为

  • chdir:需要位于 Python 导入路径上的目录的路径,即包含 mysite 包的目录。

  • module:要使用的 WSGI 模块,可能是 startproject 创建的 mysite.wsgi 模块。

  • env:可能至少应包含 DJANGO_SETTINGS_MODULE

  • home:项目虚拟环境的可选路径。

示例 ini 配置文件

[uwsgi]
chdir=/path/to/your/project
module=mysite.wsgi:application
master=True
pidfile=/tmp/project-master.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi/yourproject.log

示例 ini 配置文件用法

uwsgi --ini uwsgi.ini

修复文件上传的 UnicodeEncodeError

如果在上传包含非 ASCII 字符的文件名的文件时遇到 UnicodeEncodeError,请确保 uWSGI 配置为接受非 ASCII 文件名,方法是在您的 uwsgi.ini 中添加以下内容

env = LANG=en_US.UTF-8

有关详细信息,请参阅 Unicode 参考指南的 文件 部分。

有关启动、停止和重新加载 uWSGI 工作进程的信息,请参阅 uWSGI 文档中关于 管理 uWSGI 进程 的内容。

返回顶部