Deploy Django Apps with uWSGI and Nginx on Ubuntu 14.04
Traducciones al EspañolEstamos traduciendo nuestros guías y tutoriales al Español. Es posible que usted esté viendo una traducción generada automáticamente. Estamos trabajando con traductores profesionales para verificar las traducciones de nuestro sitio web. Este proyecto es un trabajo en curso.
DeprecatedThis guide has been deprecated and is no longer being maintained.
Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design. This guide provides an introduction to deploying Django applications using uWSGI and nginx on Ubuntu 14.04.
Before You Begin
- Familiarize yourself with our Getting Started guide and complete the steps for setting your Linode’s hostname and timezone. 
- This guide will use an example account named - django. Complete the sections of our Securing Your Server guide to create the- djangouser, harden SSH access and remove unnecessary network services. You may need to create additional firewall rules for your specific application.
- Update your system: - sudo apt-get update && sudo apt-get upgrade
sudo. If you’re not familiar with the sudo command, you can check our
Users and Groups guide.Install nginx, Python Tools and uWSGI
- Install the system packages required for nginx, the SQLite Python bindings, and managing Python Tools: - sudo apt-get install build-essential nginx python-dev python-pip python-sqlite sqlite- Note If your application uses another database, skip installing- python-sqliteand- sqlite.
- Install virtualenv and virtualenvwrapper: - sudo pip install virtualenv virtualenvwrapper- virtualenvand- virtualenvwrapperare tools to create isolated Python environments. They help better manage application dependencies, versions and permissions. For- virtualenvwrapperto function correctly, run the following commands:- echo "export WORKON_HOME=~/Env" >> ~/.bashrc echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc
- Activate - virtualenvwrapperin the current session:- source ~/.bashrc
- Install uWSGI using - pip:- sudo pip install uwsgi
Set up a Sample Django Application
- Be sure that you’re in the - djangouser’s home directory and create the virtual environment for the application:- cd /home/django && mkvirtualenv sample- After executing this command your prompt will change to something like - (sample)django@example.com:~$indicating that you are using the sample virtual environment. To quit the virtual environment, enter- deactivate.
- Install the Django framework: - pip install Django
- Create the new Django application sample, located at - /home/django/sample:- django-admin.py startproject sample
- Switch to the Django application’s directory and initialize SQLite database: - cd ~/sample && ./manage.py migrate
- When running Django with nginx, it’s necessary to configure Django to put all static assets in your application’s - staticfolder. Specify its location in- settings.py:- echo 'STATIC_ROOT = os.path.join(BASE_DIR, "static/")' >> sample/settings.py
- Run the following command to move all static assets into the directory mentioned above: - ./manage.py collectstatic
- Start a development server to test the sample application: - ./manage.py runserver 0.0.0.0:8080- Visit - http://example.com:8080in your browser to confirm that the sample application is set up correctly and working. You should see the Django test page:   - Then stop development server with Ctrl-C. 
Configure uWSGI
- Create a directory with uWSGI configuration files: - sudo mkdir -p /etc/uwsgi/sites
- Create configuration file - sample.iniwith the following contents:- File: /etc/uwsgi/sites/sample.ini
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14- [uwsgi] project = sample base = /home/django chdir = %(base)/%(project) home = %(base)/Env/%(project) module = %(project).wsgi:application master = true processes = 2 socket = %(base)/%(project)/%(project).sock chmod-socket = 664 vacuum = true
 
- Create an Upstart job for uWSGI: - File: /etc/init/uwsgi.conf
- 1 2 3 4 5 6 7 8 9- description "uWSGI" start on runlevel [2345] stop on runlevel [06] respawn env UWSGI=/usr/local/bin/uwsgi env LOGTO=/var/log/uwsgi.log exec $UWSGI --master --emperor /etc/uwsgi/sites --die-on-term --uid django --gid www-data --logto $LOGTO
 - This job will start uWSGI in Emperor mode, meaning that it will monitor - /etc/uwsgi/sitesdirectory and will spawn instances (vassals) for each configuration file it finds. Whenever a config file is changed, the emperor will automatically restart its vassals.
- Start the - uwsgiservice:- sudo service uwsgi start
Configure nginx
- Remove the default nginx site configuration: - sudo rm /etc/nginx/sites-enabled/default
- Create an nginx site configuration file for your Django application: - File: /etc/nginx/sites-available/sample
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14- server { listen 80; server_name example.com; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/django/sample; } location / { include uwsgi_params; uwsgi_pass unix:/home/django/sample/sample.sock; } }
 
- Create a symlink to nginx’s - sites-enableddirectory to enable your site configuration file:- sudo ln -s /etc/nginx/sites-available/sample /etc/nginx/sites-enabled
- Check nginx’s configuration and restart it: - sudo service nginx configtest && sudo service nginx restart
- You should now be able to reach your Django application by visiting your Linode’s hostname or IP address on port 80 in your browser. 
More Information
You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials.
This page was originally published on
