============================How to use Django with uWSGI============================.. highlight:: bashuWSGI_ is a fast, self-healing and developer/sysadmin-friendly applicationcontainer server coded in pure C... _uWSGI: https://uwsgi-docs.readthedocs.io/.. seealso::The uWSGI docs offer a `tutorial`_ covering Django, nginx, and uWSGI (onepossible deployment setup of many). The docs below are focused on how tointegrate Django with uWSGI... _tutorial: https://uwsgi.readthedocs.io/en/latest/tutorials/Django_and_nginx.htmlPrerequisite: uWSGI===================The uWSGI wiki describes several `installation procedures`_. Using pip, thePython package manager, you can install any uWSGI version with a singlecommand. For example:.. code-block:: console# 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.. _installation procedures: https://uwsgi-docs.readthedocs.io/en/latest/Install.htmluWSGI model-----------uWSGI operates on a client-server model. Your web server (e.g., nginx, Apache)communicates with a ``django-uwsgi`` "worker" process to serve dynamic content.Configuring and starting the uWSGI server for Django----------------------------------------------------uWSGI supports multiple ways to configure the process. See uWSGI's`configuration documentation`_... _configuration documentation: https://uwsgi.readthedocs.io/en/latest/Configuration.htmlHere's an example command to start a uWSGI server::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 processThis assumes you have a top-level project package named ``mysite``, andwithin it a module :file:`mysite/wsgi.py` that contains a WSGI ``application``object. This is the layout you'll have if you ran ``django-adminstartproject mysite`` (using your own project name in place of ``mysite``) witha recent version of Django. If this file doesn't exist, you'll need to createit. See the :doc:`/howto/deployment/wsgi/index` documentation for the defaultcontents you should put in this file and what else you can add to it.The Django-specific options here are:* ``chdir``: The path to the directory that needs to be on Python's importpath -- i.e., the directory containing the ``mysite`` package.* ``module``: The WSGI module to use -- probably the ``mysite.wsgi`` modulethat :djadmin:`startproject` creates.* ``env``: Should probably contain at least :envvar:`DJANGO_SETTINGS_MODULE`.* ``home``: Optional path to your project virtual environment.Example ini configuration file::[uwsgi]chdir=/path/to/your/projectmodule=mysite.wsgi:applicationmaster=Truepidfile=/tmp/project-master.pidvacuum=Truemax-requests=5000daemonize=/var/log/uwsgi/yourproject.logExample ini configuration file usage::uwsgi --ini uwsgi.ini.. admonition:: Fixing ``UnicodeEncodeError`` for file uploadsIf you get a ``UnicodeEncodeError`` when uploading files with file namesthat contain non-ASCII characters, make sure uWSGI is configured to acceptnon-ASCII file names by adding this to your ``uwsgi.ini``::env = LANG=en_US.UTF-8See the :ref:`unicode-files` section of the Unicode reference guide fordetails.See the uWSGI docs on `managing the uWSGI process`_ for information onstarting, stopping and reloading the uWSGI workers... _managing the uWSGI process: https://uwsgi-docs.readthedocs.io/en/latest/Management.html