Hi everyone, so I took over someone’s project and I am supposed to deploy it on a new server. We have an Nginx server that is supposed to be handling a Django application static media files but I keep getting a 404 not found error here is the Nginx.conf file:

server {

    listen 80;
    server_name localhost;

    return 301 https://$host$request_uri;

}

server {

    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name localhost;
    charset utf-8;
    client_max_body_size 150M;

    include /config/nginx/proxy-confs/*.subfolder.conf;

    include /config/nginx/ssl.conf;

    location /static {
        sendfile  on;
        sendfile_max_chunk 25m;
        alias /static;
    }

    location /media/user {
        sendfile  on;
        sendfile_max_chunk 50m;
        internal;
        alias /media/user;
    }

    location /admin/login {
        return 301 " /login";
    }

    location /media/protected {
        if ($http_user_agent ~* (360Spider|80legs.com|Abonti|AcoonBot|Acunetix|adbeat_bot|AddThis.com|adidxbot|ADmantX|AhrefsBot|AngloINFO|Antelope|Applebot|BaiduSpider|BeetleBot|billigerbot|binlar|bitlybot|BlackWidow|BLP_bbot|BoardReader|Bolt\ 0|BOT\ for\ JCE|Bot\ mailto\:craftbot@yahoo\.com|casper|CazoodleBot|CCBot|checkprivacy|ChinaClaw|chromeframe|Clerkbot|Cliqzbot|clshttp|CommonCrawler|comodo|CPython|crawler4j|Crawlera|CRAZYWEBCRAWLER|Curious|Curl|Custo|CWS_proxy|Default\ Browser\ 0|diavol|DigExt|Digincore|DIIbot|discobot|DISCo|DoCoMo|DotBot|Download\ Demon|DTS.Agent|EasouSpider|eCatch|ecxi|EirGrabber|Elmer|EmailCollector|EmailSiphon|EmailWolf|Exabot|ExaleadCloudView|ExpertSearchSpider|ExpertSearch|Express\ WebPictures|ExtractorPro|extract|EyeNetIE|Ezooms|F2S|FastSeek|feedfinder|FeedlyBot|FHscan|finbot|Flamingo_SearchEngine|FlappyBot|FlashGet|flicky|Flipboard|g00g1e|Genieo|genieo|GetRight|GetWeb\!|GigablastOpenSource|GozaikBot|Go\!Zilla|Go\-Ahead\-Got\-It|GrabNet|grab|Grafula|GrapeshotCrawler|GTB5|GT\:\:WWW|Guzzle|harvest|heritrix|HMView|HomePageBot|HTTP\:\:Lite|HTTrack|HubSpot|ia_archiver|icarus6|IDBot|id\-search|IlseBot|Image\ Stripper|Image\ Sucker|Indigonet|Indy\ Library|integromedb|InterGET|InternetSeer\.com|Internet\ Ninja|IRLbot|ISC\ Systems\ iRc\ Search\ 2\.1|jakarta|Java|JetCar|JobdiggerSpider|JOC\ Web\ Spider|Jooblebot|kanagawa|KINGSpider|kmccrew|larbin|LeechFTP|libwww|Lingewoud|LinkChecker|linkdexbot|LinksCrawler|LinksManager\.com_bot|linkwalker|LinqiaRSSBot|LivelapBot|ltx71|LubbersBot|lwp\-trivial|Mail.RU_Bot|masscan|Mass\ Downloader|maverick|Maxthon$|Mediatoolkitbot|MegaIndex|MegaIndex|megaindex|MFC_Tear_Sample|Microsoft\ URL\ Control|microsoft\.url|MIDown\ tool|miner|Missigua\ Locator|Mister\ PiX|mj12bot|Mozilla.*Indy|Mozilla.*NEWT|MSFrontPage|msnbot|Navroad|NearSite|NetAnts|netEstate|NetSpider|NetZIP|Net\ Vampire|NextGenSearchBot|nutch|Octopus|Offline\ Explorer|Offline\ Navigator|OpenindexSpider|OpenWebSpider|OrangeBot|Owlin|PageGrabber|PagesInventory|panopta|panscient\.com|Papa\ Foto|pavuk|pcBrowser|PECL\:\:HTTP|PeoplePal|Photon|PHPCrawl|planetwork|PleaseCrawl|PNAMAIN.EXE|PodcastPartyBot|prijsbest|proximic|psbot|purebot|pycurl|QuerySeekerSpider|R6_CommentReader|R6_FeedFetcher|RealDownload|ReGet|Riddler|Rippers\ 0|rogerbot|RSSingBot|rv\:1.9.1|RyzeCrawler|SafeSearch|SBIder|Scrapy|Scrapy|Screaming|SeaMonkey$|search.goo.ne.jp|SearchmetricsBot|search_robot|SemrushBot|Semrush|SentiBot|SEOkicks|SeznamBot|ShowyouBot|SightupBot|SISTRIX|sitecheck\.internetseer\.com|siteexplorer.info|SiteSnagger|skygrid|Slackbot|Slurp|SmartDownload|Snoopy|Sogou|Sosospider|spaumbot|Steeler|sucker|SuperBot|Superfeedr|SuperHTTP|SurdotlyBot|Surfbot|tAkeOut|Teleport\ Pro|TinEye-bot|TinEye|Toata\ dragostea\ mea\ pentru\ diavola|Toplistbot|trendictionbot|TurnitinBot|turnit|Twitterbot|URI\:\:Fetch|urllib|Vagabondo|Vagabondo|vikspider|VoidEYE|VoilaBot|WBSearchBot|webalta|WebAuto|WebBandit|WebCollage|WebCopier|WebFetch|WebGo\ IS|WebLeacher|WebReaper|WebSauger|Website\ eXtractor|Website\ Quester|WebStripper|WebWhacker|WebZIP|Web\ Image\ Collector|Web\ Sucker|Wells\ Search\ II|WEP\ Search|WeSEE|Wget|Widow|WinInet|woobot|woopingbot|worldwebheritage.org|Wotbox|WPScan|WWWOFFLE|WWW\-Mechanize|Xaldon\ WebSpider|XoviBot|yacybot|Yahoo|YandexBot|Yandex|YisouSpider|zermelo|Zeus|zh-CN|ZmEu|ZumBot|ZyBorg) ) {
            return 410;
        }
        sendfile  on;
        sendfile_max_chunk 50m;
        internal;
        alias /media/protected;
    }

    location /media {
        sendfile  on;
        sendfile_max_chunk 25m;
        alias /media;
    }

    location /media/images/company {
        alias /media/images/company;
    }

    location / {
        proxy_pass http://web:8000;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

}

if anyone can offer any insights that would be great!

2 comments
  • Have you run collectstaticfor the Django project?

  • @mjnicholson yes I did, this is supposed to be automated in “command” in the production.yml file here:

    
    version: '3.3'
    
    services:
      db:
        image: postgres
        restart: always
        container_name: db
        env_file:
          - db.env
        volumes:
          - ./prod_storage/pgdb:/var/lib/postgresql/data
      web:
        restart: always
        build: ./web
        image: web
        container_name: web
        expose:
          - "8000"
        volumes:
          - ./web:/web
          - static:/static
          - ./prod_storage/media:/media
        stdin_open: true
        tty: true
        depends_on: 
          - db
        env_file:
          - web.env
        command: bash -c "python manage.py collectstatic --noinput && python manage.py makemigrations --noinput && python manage.py migrate --noinput && python web/manage.py makemigrations && /usr/local/bin/gunicorn ace.wsgi:application -w 2 -b :8000"
      nginx:
        image: linuxserver/letsencrypt
        ports:
          - 80:80
          - 443:443
        volumes:
          - static:/static
          - ./prod_storage/media:/media
          - ./nginx-prod/config:/config
          - ./nginx-prod/config/nginx.conf:/config/nginx/site-confs/default
          - ./nginx-prod/config/ssl.conf:/config/nginx/ssl.conf
        container_name: nginx
        restart: unless-stopped
        links:
          - web:web
        environment: 
          - PUID=1000
          - PGID=1000
          - TZ=America/Toronto
          - URL=concordia-ace.ca
          - SUBDOMAINS=www,
          - VALIDATION=http
          - STAGING=false #optional
    
    volumes:
      static:
    

    Thank you for replying, I appreciate it!

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.

×
2 answers

Your alias statements could be wrong in location branches. Point those to full pathes.

    location /media {
        add_header Cache-Control "public, stale-if-error=144000";
        expires 30d;
        alias /mnt/volume_nyc3_whatever/whatever/media;
    }

@mjnicholson @AlexeiRamone so this is an example of a file I'am trying to access:
https://ace-concordia.com/media/protected/2020/Aly_Gasser_40135687/transcript/9c0be77746d84dceaec44dc2e5b64b07/Sample.pdf

I went inside the Nginx container to this directory:/media/protected/2020/AlyGasser40135687/transcript/9c0be77746d84dceaec44dc2e5b64b07

and the file is actually there! Nginx is just not getting it for some reason, the error logs have nothing on this but the access logs show it and that it gets 404 answer

Thanks, folks your help is really appreciated!

Submit an Answer