{"title":"如何用 uWSGI 托管 Django","version":"3.0","locale":"zh-hans","docname":"howto/deployment/wsgi/uwsgi","url":"/zh-hans/3.0/howto/deployment/wsgi/uwsgi/","canonical":"https://djangodocs.dev/zh-hans/3.0/howto/deployment/wsgi/uwsgi/","summary":"uWSGI 是一个快速的，自我驱动的，对开发者和系统管理员友好的应用容器服务器，完全由 C 编写。 See also uWSGI 文档提供了一个覆盖 Django，nginx，和 uWSGI（一个配置，多种适配）。以下文档专注于如何用 uWSGI 集成 Django。 前置条件：uWSGI Link to this…","html":"<h1>如何用 uWSGI 托管 Django<a class=\"heading-anchor\" href=\"#how-to-use-django-with-uwsgi\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p><a class=\"reference external\" href=\"https://uwsgi-docs.readthedocs.io/\">uWSGI</a> 是一个快速的，自我驱动的，对开发者和系统管理员友好的应用容器服务器，完全由 C 编写。</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<p>uWSGI 文档提供了一个覆盖 Django，nginx，和 uWSGI（一个配置，多种适配）。以下文档专注于如何用 uWSGI 集成 Django。</p>\n</aside>\n<section id=\"prerequisite-uwsgi\">\n<h2>前置条件：uWSGI<a class=\"heading-anchor\" href=\"#prerequisite-uwsgi\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>uWSGI 百科介绍了几种 <a class=\"reference external\" href=\"https://uwsgi-docs.readthedocs.io/en/latest/Install.html\">安装流程</a>。Pip （Python 包管理器）能让你仅用一行代码就安装任意版本的 uWSGI。例子：</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\"># </span>Install<span class=\"w\"> </span>current<span class=\"w\"> </span>stable<span class=\"w\"> </span>version.\n<span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>uwsgi\n\n<span class=\"gp\"># </span>Or<span class=\"w\"> </span>install<span class=\"w\"> </span>LTS<span class=\"w\"> </span><span class=\"o\">(</span>long<span class=\"w\"> </span>term<span class=\"w\"> </span>support<span class=\"o\">)</span>.\n<span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>https://projects.unbit.it/downloads/uwsgi-lts.tar.gz\n</code></pre></div>\n<section id=\"uwsgi-model\">\n<h3>uWSGI 模块<a class=\"heading-anchor\" href=\"#uwsgi-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>uWSGI operates on a client-server model. Your Web server (e.g., nginx, Apache)\ncommunicates with a <code class=\"docutils literal notranslate\"><span class=\"pre\">django-uwsgi</span></code> &quot;worker&quot; process to serve dynamic content.</p>\n</section>\n<section id=\"configuring-and-starting-the-uwsgi-server-for-django\">\n<h3>配置并启动用于 Django 的 uWSGI 服务器<a class=\"heading-anchor\" href=\"#configuring-and-starting-the-uwsgi-server-for-django\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>uWSGI 支持多种配置进程的方式。参考 uWSGI 的 <a class=\"reference external\" href=\"https://uwsgi.readthedocs.io/en/latest/Configuration.html\">配置文档</a>。</p>\n<p>以下是个示例命令，用于启动一个 uWSGI 服务器:</p>\n<div class=\"code-block\" data-language=\"bash\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>uwsgi<span class=\"w\"> </span>--chdir<span class=\"o\">=</span>/path/to/your/project<span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">    </span>--module<span class=\"o\">=</span>mysite.wsgi:application<span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">    </span>--env<span class=\"w\"> </span><span class=\"nv\">DJANGO_SETTINGS_MODULE</span><span class=\"o\">=</span>mysite.settings<span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">    </span>--master<span class=\"w\"> </span>--pidfile<span class=\"o\">=</span>/tmp/project-master.pid<span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">    </span>--socket<span class=\"o\">=</span><span class=\"m\">127</span>.0.0.1:49152<span class=\"w\"> </span><span class=\"se\">\\ </span><span class=\"w\">     </span><span class=\"c1\"># can also be a file</span>\n<span class=\"w\">    </span>--processes<span class=\"o\">=</span><span class=\"m\">5</span><span class=\"w\"> </span><span class=\"se\">\\ </span><span class=\"w\">                </span><span class=\"c1\"># number of worker processes</span>\n<span class=\"w\">    </span>--uid<span class=\"o\">=</span><span class=\"m\">1000</span><span class=\"w\"> </span>--gid<span class=\"o\">=</span><span class=\"m\">2000</span><span class=\"w\"> </span><span class=\"se\">\\ </span><span class=\"w\">        </span><span class=\"c1\"># if root, uwsgi can drop privileges</span>\n<span class=\"w\">    </span>--harakiri<span class=\"o\">=</span><span class=\"m\">20</span><span class=\"w\"> </span><span class=\"se\">\\ </span><span class=\"w\">                </span><span class=\"c1\"># respawn processes taking more than 20 seconds</span>\n<span class=\"w\">    </span>--max-requests<span class=\"o\">=</span><span class=\"m\">5000</span><span class=\"w\"> </span><span class=\"se\">\\ </span><span class=\"w\">          </span><span class=\"c1\"># respawn processes after serving 5000 requests</span>\n<span class=\"w\">    </span>--vacuum<span class=\"w\"> </span><span class=\"se\">\\ </span><span class=\"w\">                     </span><span class=\"c1\"># clear environment on exit</span>\n<span class=\"w\">    </span>--home<span class=\"o\">=</span>/path/to/virtual/env<span class=\"w\"> </span><span class=\"se\">\\ </span><span class=\"w\">  </span><span class=\"c1\"># optional path to a virtual environment</span>\n<span class=\"w\">    </span>--daemonize<span class=\"o\">=</span>/var/log/uwsgi/yourproject.log<span class=\"w\">      </span><span class=\"c1\"># background the process</span>\n</code></pre></div>\n<p>假设你有个叫做 <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite</span></code> 的顶级项目包，期中包含一个模板 <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/wsgi.py</span></code>，模块包含一个 WSGI <code class=\"docutils literal notranslate\"><span class=\"pre\">application</span></code> 对象。如果你使用的是较新的 Django，这就是你运行 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">startproject</span> <span class=\"pre\">mysite</span></code> （使用你的项目名替换 <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite</span></code>）后得到的目录结构。若该文件不存在，你需要创建它。参考文档 <a class=\"reference internal\" href=\"/zh-hans/3.0/howto/deployment/wsgi/\"><span class=\"doc\">如何使用 WSGI 进行部署</span></a> 看看你需要配置的默认内容，以及你还能添加什么。</p>\n<p>Django 指定的参数如下：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">chdir</span></code>：需要包含于 Python 的导入路径的目录的路径——例如，包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite</span></code> 包的目录。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">module</span></code>：要使用的 WSGI 模块——可能是 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">startproject</span></code></a> 创建的 <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite.wsgi</span></code> 的模块。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">env</span></code>：至少要包括 <code class=\"docutils literal notranslate\"><span class=\"pre\">DJANGO_SETTINGS_MODULE</span></code>。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">home</span></code>: Optional path to your project virtual environment.</p></li>\n</ul>\n<p>示例 ini 配置文件:</p>\n<div class=\"code-block\" data-language=\"bash\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"o\">[</span>uwsgi<span class=\"o\">]</span>\n<span class=\"nv\">chdir</span><span class=\"o\">=</span>/path/to/your/project\n<span class=\"nv\">module</span><span class=\"o\">=</span>mysite.wsgi:application\n<span class=\"nv\">master</span><span class=\"o\">=</span>True\n<span class=\"nv\">pidfile</span><span class=\"o\">=</span>/tmp/project-master.pid\n<span class=\"nv\">vacuum</span><span class=\"o\">=</span>True\nmax-requests<span class=\"o\">=</span><span class=\"m\">5000</span>\n<span class=\"nv\">daemonize</span><span class=\"o\">=</span>/var/log/uwsgi/yourproject.log\n</code></pre></div>\n<p>示例 ini 配置文件语法:</p>\n<div class=\"code-block\" data-language=\"bash\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>uwsgi<span class=\"w\"> </span>--ini<span class=\"w\"> </span>uwsgi.ini\n</code></pre></div>\n<aside class=\"admonition-fixing-unicodeencodeerror-for-file-uploads admonition\">\n<p class=\"admonition-title\">为文件上传修复 <code class=\"docutils literal notranslate\"><span class=\"pre\">UnicodeEncodeError</span></code></p>\n<p>如果上传的文件名包含非 ASCII 字符时，可能抛出 <code class=\"docutils literal notranslate\"><span class=\"pre\">UnicodeEncodeError</span></code>，确保 uWSGI 已正确配置，能接受非 ASCII 字符的文件名，通过在 <code class=\"docutils literal notranslate\"><span class=\"pre\">uwsgi.ini</span></code> 添加以下内容:</p>\n<div class=\"code-block\" data-language=\"bash\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"nv\">env</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">LANG</span><span class=\"o\">=</span>en_US.UTF-8\n</code></pre></div>\n<p>参考 Unicode 参考指引的 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/unicode/#unicode-files\"><span class=\"std std-ref\">Files</span></a> 章节获取细节信息。</p>\n</aside>\n<p>参考 uWSGI 文档 <a class=\"reference external\" href=\"https://uwsgi-docs.readthedocs.io/en/latest/Management.html\">管理 uWSGI 进程</a> 获取更多关于开启，关闭和重载 uWSGI workers 的信息。</p>\n</section>\n</section>","rootId":"how-to-use-django-with-uwsgi","toc":[{"title":"前置条件：uWSGI","anchor":"prerequisite-uwsgi","children":[{"title":"uWSGI 模块","anchor":"uwsgi-model","children":[]},{"title":"配置并启动用于 Django 的 uWSGI 服务器","anchor":"configuring-and-starting-the-uwsgi-server-for-django","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"操作指南","url":"/zh-hans/3.0/howto/"},{"docname":"howto/deployment/index","title":"部署 Django","url":"/zh-hans/3.0/howto/deployment/"},{"docname":"howto/deployment/wsgi/index","title":"如何使用 WSGI 进行部署","url":"/zh-hans/3.0/howto/deployment/wsgi/"}],"prev":{"docname":"howto/deployment/wsgi/gunicorn","title":"如何使用 Gunicorn 托管 Django","url":"/zh-hans/3.0/howto/deployment/wsgi/gunicorn/"},"next":{"docname":"howto/deployment/wsgi/modwsgi","title":"如何使用 Apache 和 mod_wsgi 托管 Django","url":"/zh-hans/3.0/howto/deployment/wsgi/modwsgi/"},"formats":{"html":"/zh-hans/3.0/howto/deployment/wsgi/uwsgi/","markdown":"/zh-hans/3.0/howto/deployment/wsgi/uwsgi.md","json":"/zh-hans/3.0/howto/deployment/wsgi/uwsgi.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/howto/deployment/wsgi/uwsgi.txt","official":"https://docs.djangoproject.com/zh-hans/3.0/howto/deployment/wsgi/uwsgi/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}