Search code examples
pythondjangonginxgunicorndjango-staticfiles

Django doesn't serve static files with NGINX + GUNICORN


Everything worked very well before gunicorn and nginx, static files were served to the website. But now, it doesn't work anymore.

Settings.py

STATICFILES_DIRS = [
'/root/vcrm/vcrm1/static/'
]

STATIC_ROOT = os.path.join(BASE_DIR, 'vcrm/static')
STATIC_URL = '/static/'

MEDIA_ROOT = '/root/vcrm/vcrm1/vcrm/media/'
MEDIA_URL = '/media/'

/etc/nginx/sites-available/vcrm

server {
listen 80;
server_name 195.110.58.168;

location = /favicon.ico { access_log off; log_not_found off; }
location /static {
    root /root/vcrm/vcrm1/vcrm;
}

location = /media {
    root /root/vcrm/vcrm1/vcrm;
}

location / {
    include proxy_params;
    proxy_pass http://unix:/run/gunicorn.sock;
}

}

When I run collectstatic:

You have requested to collect static files at the destination
location as specified in your settings:

/root/vcrm/vcrm1/vcrm/static

This will overwrite existing files!
Are you sure you want to do this?

and then:

Found another file with the destination path 'admin/js/vendor/jquery/jquery.min.js'. It will be 
ignored since only the first encountered file is collected. If this is not what you want, make sure 
every static file has a unique path.

0 static files copied to '/root/vcrm/vcrm1/vcrm/static', 251 unmodified.

Solution

  • NGINX + Gunicorn + Django

    Django project:

     djangoapp
     - ...
     - database
     - djangoapp
       - settings.py
       - urls.py
       - ...
     - media
     - static
     - manage.py
     - requirements.txt
    

    Server: install venv, requirements.txt:

    sudo apt-get update
    sudo apt-get install -y git python3-dev python3-venv python3-pip supervisor nginx vim libpq-dev
    --> cd djangoapp
    pathon3 -m venv venv
    source venv/bin/activate
    (venv) pip3 install -r requirements.txt 
    

    Server: install NGINX:

    sudo apt-get install nginx
    sudo vim /etc/nginx/sites-enabled/default
    

    Server: NGINX config:

       server {
            listen 80 default_server;
            listen [::]:80 default_server;
    
    
            location /static/ {
                alias /home/ubuntu/djangoapp/static/; 
            }
    
    
            location /media/ {
                alias /home/ubuntu/djangoapp/media/; 
            }
    
    
            location / {
                proxy_pass http://127.0.0.1:8000;
                proxy_set_header X-Forwarded-Host $server_name;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_redirect off;
                add_header P3P 'CP="ALL DSP COR PSAa OUR NOR ONL UNI COM NAV"';
                add_header Access-Control-Allow-Origin *;
            }
    }
    

    Server: setup supervisor:

    cd /etc/supervisor/conf.d/
    sudo vim djangoapp.conf
    

    Server: supervisor config:

    [program:djangoapp]
    command = /home/ubuntu/djangoapp/venv/bin/gunicorn djangoapp.wsgi  -b 127.0.0.1:8000 -w 4 --timeout 90
    autostart=true
    autorestart=true
    directory=/home/ubuntu/djangoapp 
    stderr_logfile=/var/log/game_muster.err.log
    stdout_logfile=/var/log/game_muster.out.log
    

    Server: update supervisor with the new process:

    sudo supervisorctl reread
    sudo supervisorctl update
    
    sudo supervisorctl restart djangoapp