Question

Nginx unable to server static and media images

I have a django app on DigitalOcean droplet running using gunicorn and nginx. The site is working but the static files are giveing 404. Below is my ‘/etc/nginx/sites-available/django-project’ file:

server {

        #listen 80 default_server;
        #listen [::]:80 default_server ipv6only=on;

        server_name aakar.in;

        root /usr/share/nginx/html;
        index index.html index.htm;

        #access_log off;

        client_max_body_size 4G;
        #server_name _;

        keepalive_timeout 5;

        location /media  {
           alias /home/django/django_project/django_project/media;
        }

        location /static/ {
            alias /home/django/django_project/django_project/static;
        }

        location / {

                proxy_pass http://127.0.0.1:9000;
                proxy_redirect off;
                proxy_set_header X-Forwarded-Host $server_name;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host $http_host;
                add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM N$
        }
    }

Submit an answer


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Sign In or Sign Up to Answer

These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.

KFSys
Site Moderator
Site Moderator badge
January 31, 2024
Pinned Answer

Heya,

To anyone stumbling upon this, here is a full revisited answer.

To configure Nginx to serve static files and media files for a Django web application, you’ll need to make sure your Django project is correctly configured for serving static and media files, and then set up Nginx to handle these files efficiently. Here are the steps to achieve this:

  1. Configure Django for Static and Media Files: In your Django project’s settings (typically found in the settings.py file), make sure you have the following configurations set correctly:
# settings.py

# Define the URL path for static files (CSS, JavaScript, etc.).
STATIC_URL = '/static/'

# Define the absolute filesystem path to the directory that will hold your static files.
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

# Define the URL path for media files (user-uploaded files).
MEDIA_URL = '/media/'

# Define the absolute filesystem path to the directory where media files will be uploaded.
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Ensure that you’ve also added the following line to your project’s urls.py to serve media files during development:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
  1. Install Nginx: If you haven’t already, install Nginx on your server:
sudo apt-get update
sudo apt-get install nginx
  1. Create an Nginx Configuration File for Your Django Project: Create an Nginx configuration file for your Django project in the /etc/nginx/sites-available/ directory. Replace your_project_name with a meaningful name for your project:
sudo nano /etc/nginx/sites-available/your_project_name
server {
    listen 80;
    server_name your_domain.com; # Replace with your domain or IP address

    location /static/ {
        alias /path/to/your/static/root; # Replace with the actual path to your STATIC_ROOT
    }

    location /media/ {
        alias /path/to/your/media/root; # Replace with the actual path to your MEDIA_ROOT
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/path/to/your/project.sock; # Replace with your project's Unix socket
    }

    location /favicon.ico {
        alias /path/to/your/static/root/favicon.ico; # Replace with the path to your favicon
    }

    location /robots.txt {
        alias /path/to/your/static/root/robots.txt; # Replace with the path to your robots.txt file
    }

    error_page 500 502 503 504 /static/500.html;
}

Save the file and exit the text editor.

  1. Enable the Nginx Configuration and Test: Create a symbolic link to enable the site configuration and then test the Nginx configuration:
sudo ln -s /etc/nginx/sites-available/your_project_name /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
    1. Adjust Permissions: Make sure that the Nginx user (www-data on Ubuntu) has read access to your static and media directories. You can adjust permissions with the following commands:
sudo chown -R www-data:www-data /path/to/your/static/root 
sudo chown -R www-data:www-data /path/to/your/media/root

That’s it! Nginx should now be correctly configured to serve your Django project’s static and media files. Make sure to replace placeholders like your_domain.com, /path/to/your/static/root, /path/to/your/media/root, and /path/to/your/project.sock with your actual values.

Ryan Quinn
DigitalOcean Employee
DigitalOcean Employee badge
May 25, 2016

As long as the path you have listed is correct this should work. I would recommend checking to ensure that the files and directory will allow the www-data user (which nginx is running as) is able to view files in that location. You may need to adjust permissions or ownership (especially if you uploaded them as root or this home directory is not set up to allow access by non-root users other than the django user).

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel