如何使用uWSGI部署Django

uWSGI是一个快速、自我修复、开发人员/系统管理员友好的容器服务器,代码完全用C编写。

请参见

uWSGI文档提供一个教程,覆盖Django、nginx和uWSGI(多种部署方式中的一种)。 下面的文档集中在如何将Django与uWSGI集成。

前提条件:uWSGI

uWSGI的Wiki讲述了几个安装过程 使用Python包管理器pip,你只用一个命令即可安装任何版本的uWSGI。 像这样:

# Install current stable version.
$ pip install uwsgi

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

uWSGI模型

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

为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 virtualenv
    --daemonize=/var/log/uwsgi/yourproject.log      # background the process

它假设你有一个顶层的项目包名mysite,且里面有一个包含一个WSGI application对象的模块mysite/wsgi.py 如果你用最近版本的Django 运行django-admin startproject mysite,将就是这个结构(使用你自己的项目的名称来替代mysite)。 如果这个文件不存在,你需要创建它。 这个文件的默认内容以及可以添加的其它内容,参见如何使用WSGI部署 的文档。

与Django相关的选项是:

  • chdir:目录的路径,应该在Python导入路径中 — 例如包含mysite包的目录。
  • module:使用的WSGI 模块 — 可以是startproject创建的mysite.wsgi模块。
  • env:应该至少包含DJANGO_SETTINGS_MODULE
  • home:可选,你的项目的virtualenv的路径。

示例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.ini以确保uWSGI接受非ASCII文件名:

env = LANG=en_US.UTF-8

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

参见uWSGI关于管理uWSGI进程 的文档,以获得启动、停止和重新加载uWSGI工作者进程的信息。