I had to deploy a web application I just created using Django. I will describe the steps I followed.
- Make sure you have you Django setted up correctly. I followed this guide.
- Install uWSGI into your virtualenv:
pip install uwsgi
- Install nginx:
sudo aptitude install nginx sudo service nginx start
- Edit nginx.conf file (it is in /etc/nginx if you are using ubuntu), it should be something like this:
upstream django { server unix:///path/to/your/mysite/mysite.sock; } server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name mysite.com; charset utf-8; # max upload size client_max_body_size 5M; # adjust to taste location /robots.txt { alias /path/to/your/mysite/robots.txt; } # Django media location /files { alias /path/to/your/mysite/files; # your Django project's media files - amend as required } location /static { alias /path/to/your/mysite/static; # your Django project's static files - amend as required } # Finally, send all non-media requests to the Django server. location / { uwsgi_pass django; include /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed } }
Make sure it matches your Django app settings.py configuration:
PROJECT_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'files') MEDIA_URL = '/files/' STATIC_ROOT = '' STATIC_URL = '/static/'
- Configure you uWSGI .ini file:
# mysite_uwsgi.ini file [uwsgi] # Django-related settings # the base directory (full path) chdir = /path/to/your/mysite # Django's wsgi file module = mysite.wsgi # the virtualenv (full path) .virtualenvs at home folder home = /path/to/your/mysitevirtualenv # process-related settings # master master = true # maximum number of worker processes processes = 10 # the socket (use the full path to be safe socket = /path/to/your/mysite.sock # ... with appropriate permissions - may be needed chmod-socket = 666 # clear environment on exit vacuum = true lgger = syslog
- Add uwsgi_params file to your project:
uwsgi_param QUERY_STRING $query_string; uwsgi_param REQUEST_METHOD $request_method; uwsgi_param CONTENT_TYPE $content_type; uwsgi_param CONTENT_LENGTH $content_length; uwsgi_param REQUEST_URI $request_uri; uwsgi_param PATH_INFO $document_uri; uwsgi_param DOCUMENT_ROOT $document_root; uwsgi_param SERVER_PROTOCOL $server_protocol; uwsgi_param HTTPS $https if_not_empty; uwsgi_param REMOTE_ADDR $remote_addr; uwsgi_param REMOTE_PORT $remote_port; uwsgi_param SERVER_PORT $server_port; uwsgi_param SERVER_NAME $server_name;
- Run in emperor mode:
# create a directory for the vassals sudo mkdir /etc/uwsgi sudo mkdir /etc/uwsgi/vassals # symlink from the default config directory to your config file sudo ln -s /path/to/your/mysite/mysite_uwsgi.ini /etc/uwsgi/vassals/ /usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
You can run the last command on screen or when the system starts.
And thats it, hope this can be helpful. You can find more info here.