Using uwsgi to deploy django site on ubuntu server

Here are some few things to know before deploying django site on ubuntu server

install uwsgi

You have two ways to install uwsgi on ubuntu: apt-get or pip

apt-get

if you use apt-get, you need to install the python plugin:

sudo apt-get install uwsgi-plugin-python
sudo apt-get install uwsgi

And, in your uwsgi ini file for your site, you need to add this:

plugins=python

pip

if you use pip, you need to install python-dev first:

sudo apt-get install python3-dev
sudo pip install uwsgi

And, you don't need the plugins=python in ini file anymore.

  • Note: See the sudo before pip? Yes, uwsgi should be installed in global system. If you miss the sudo here, you may install it in your virtualenv. It's meaningless and you may have trouble running it.

daemonize uwsgi

Daemonize means make uwsgi run on system boot and in the background. According to how you install uwsgi, you have two ways.

apt-get

When you use apt-get install uwsgi on ubuntu, it's installed as a service automatically. The magic lies in this file: /etc/init.d/uwsgi

Files in /etc/init.d will be loaded by sysvinit. Then you can manage your uwsgi service like this:

  • sudo /etc/init.d/uwsgi start|stop|restart|reload

or:

  • sudo service uwsgi start|stop|restart|reload

the service command can find the service managed by sysvinit

pip

If you uwsgi is installed by pip, you only have the executable file in /etc/systemd/system, you need to daemonize it yourself.

Just create a file /etc/systemd/system/uwsgi.service with following content:

[Unit]
Description=uWSGI Emperor service

[Service]
ExecStartPre=/bin/bash -c 'mkdir -p /run/uwsgi; chown mulondu:www-data /run/uwsgi'
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target
  • Note: Replace the mulondu user name with your ubuntu user name

Then you can manage your uwsgi process like this:

sudo systemctl start|stop|restart|reload| uwsgi

or, still this:

sudo service uwsgi start|stop|restart|reload

uwsgi config for your site

I recommend everyone to use the pip way, it's much better then the apt-get way.

If so, you are using the emperor mode of uwsgi, which is very handy and powerful.

Now, you can create a ini file in /etc/uwsgi/vassals/ like this:

[uwsgi]
virtualenv=/path/to/venv/
chdir=/path/to/proj/root
module=wsgi:application
env=DJANGO_SETTINGS_MODULE=settings
master=True
vacuum=True
socket=/tmp/%n.sock
pidfile=/tmp/%n.pid
daemonize=/var/log/uwsgi/%n.log

The %n means your file name. For example, my project name is 'example', I create a example.ini file for it. Then the %n means 'example'. You don't need to replace it with real name. uwsgi will do this for you.

And then restart or reload uwsgi:

sudo service uwsgi restart

Check your socket file:

ll /tmp/*.sock

If it's there, you are successful with uwsgi now:)

Setting up Nginx

installing nginx

sudo apt-get install nginx

nginx config for your site

Take domain example.com for example:

server {
    listen          80;
    server_name     www.example.com;
    return          301 $scheme://example.com$request_uri;
}

server {
    listen 80;
    charset utf-8;
    server_name example.com;

    location  /static/ {
        alias  /path/to/static/;
    }

    location  /media/ {
        alias /path/to/media/;
    }

    location / {
        try_files $uri @django;
    }

    location @django {
       uwsgi_pass unix:///tmp/example.sock;
       include uwsgi_params;
    }
}

To test the nginx configurations:

sudo nginx -t

If everything is okay, restart nginx and uwsgi, you will see your site:

sudo systemctl restart uwsgi
sudo systemctl restart nginx

References:

  1. How To Serve Django Applications with uWSGI and Nginx on Debian 8
  2. Use uwsgi the right way