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: