[Django]-Django nginx static files 404

29๐Ÿ‘

I encountered the same problem and was able to fix my nginx configuration by removing the trailing / from the /static/ location.

location /static {  # "/static" NOT "/static/"
    # ...
}
๐Ÿ‘คpztrick

6๐Ÿ‘

Try adding the ^~ prefix modifier to your static location to skip checking regular expressions:

location ^~ /static/ {
    alias /home/django-projects/tshirtnation/staticfiles/;
}
๐Ÿ‘คCole Tierney

1๐Ÿ‘

In your settings.py, put this:

STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder'
)
STATIC_ROOT = "/home/django-projects/tshirtnation/staticfiles/"
STATIC_URL = '/static/'

You donโ€™t need this:

STATICFILES_DIRS = ...
๐Ÿ‘คrafaels88

1๐Ÿ‘

settings.py:

ALLOWED_HOSTS = ['*']

STATIC_URL = '/static/'
STATIC_ROOT = '/home/calosh/PycharmProjects/Proyecto_AES/static/'

MEDIA_ROOT = '/home/calosh/PycharmProjects/Proyecto_AES/media/'
MEDIA_URL = '/media/'

In the nginx configurations(/etc/nginx/sites-enabled/default)

server {
    server_name localhost;

    access_log off;

    location /static/ {
        alias /home/calosh/PycharmProjects/Proyecto_AES/static/;
    }

    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;
            add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    }
}

Then restart the nginx server:

sudo service nginx restart

And run gunicorn:

gunicorn PFT.wsgi

Serves the application on localhost or the entire local network (on port 80).

http://127.0.0.1/
๐Ÿ‘คcalosh

0๐Ÿ‘

I think browser tries to find your static in:

http://127.0.0.1:8001/static/

While nginx by default work on 80 port.

You need to define 8001 port in nginx config or run django server on 80 port.

๐Ÿ‘คEugene Soldatov

0๐Ÿ‘

Check this things

1 Whether the static older is accessible by nginx, I mean the folder permission .

2 Or do this

Replace this:

STATIC_ROOT = '/home/django-projects/tshirtnation/staticfiles'

with this

STATIC_ROOT = โ€

And add this in settings

STATICFILES_DIRS = (
     '/home/django-projects/tshirtnation/staticfiles/',
)

Donโ€™t forget to reload the nginx server.

Hope this works.

๐Ÿ‘คShanki

0๐Ÿ‘

Your problem is that the location / block is always used, even after the location /static/ one, so everything will be proxy_passed.
The solution here is to use some try_files magic.

server {
    server_name 77.241.197.95;

    access_log off;

    location / {
        try_files $uri @django;
    }

    location /static/ {
        alias /home/django-projects/tshirtnation/staticfiles/;
        try_files $uri =404;
        # here we use =404 because there is no need to pass it to gunicorn.
    }

    location @djago {
        proxy_pass http://127.0.0.1:8001;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    }
}
๐Ÿ‘คn1xx1

0๐Ÿ‘

Mine looks like this, and it worked:

STATICFILES_DIRS = (
    os.path.join(os.path.dirname(__file__), '..', 'static'),
)

And in the nginx configuration, my location /static/ is above the location / like this,

location /static {
    //
}

# Finally, send all non-media requests to the Django server.
location / {
    //
}

And one more thing, I donโ€™t know if that matters, but I do have a โ€˜listenโ€™ in the server{}. Iโ€™m not sure if it can help.

๐Ÿ‘คshellbye

0๐Ÿ‘

try this in settings.py:

import os
ROOT_PATH = os.path.dirname(__file__)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(ROOT_PATH,'static/')
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]

and config file in nginx(or your server setting):

location /static {
    alias /home/djangohome/static; # your Django project's static files - amend as required
}
๐Ÿ‘คRobert Moon

0๐Ÿ‘

I ran into this issue and solved it by adding these lines to project urls.py file:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns


urlpatterns = [
   ...
] += staticfiles_urlpatterns()

Also there is another reason this kinda issues, and itโ€™s in nginx main configuration file at /etc/nginx/nginx.conf. Make sure this file contains these lines:

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

0๐Ÿ‘

Another gotcha to watch for โ€“ be sure to match the trailing slashes. In the example below both the location and the alias have trailing slashes. It would also work if neither did, but they must match.

location /static/ {
  alias /home/you/django/gtd/staticfiles/;
}

The location has a trailing slash, and the full path is an alias for that, so they both need trailing slashes to stay equivalent. Or you could remove the trailing slash from both.

๐Ÿ‘คshacker

-1๐Ÿ‘

Try to remove slash in nginx settings followed by static e.g. It should be โ€œ/staticโ€ not โ€œ/static/โ€, and if your settings were fine then try to reload the server on local machine and try rebooting on remote machine. I faced similar but after rebooting the machine, fixed the issue.

๐Ÿ‘คvikas0713

-2๐Ÿ‘

Use STATIC_URL with domain. Itโ€™s important!

๐Ÿ‘คAlexey

Leave a comment