NGINX не видит папку с файлами на сервере

Рейтинг: 0Ответов: 1Опубликовано: 22.05.2023

Прежде всего хочу сказать, что я новичок в nginx. Настраиваю веб-приложение. NGINX не видит файлы, которые находятся в папке resources. Сервер состоит из 5 контейнеров докер. Фронт, бек, постгрес, nginx и сертбот.

При создании записи изображение из контейнера backend копируется на основной сервер в папку resources. Откуда я хочу обрабатывать их на nginx.

docker-compsoe.yml

    version: '3.3'
services:

  db:
    image: postgres:13.0-alpine
    ports:
      - 5432:5432
    volumes:
      - ./postgres_data:/var/lib/postgresql/data/
    restart: always
    env_file:
      - ./.1env
    networks:
      - nginx_net

  backend:
    image: hinek/astsmarttime:main
    restart: always
    ports:
      - "8000:8000"
    volumes:
      - ./resources:/app/resources/
    env_file:
      - ./.1env
    networks:
      - nginx_net

  nextjs:
    image: hinek/astsmarttimefront:main
    restart: unless-stopped
    depends_on:
      - backend
    networks:
      - nginx_net
    env_file:
      - ./.env

  nginx:
    image: nginx:latest
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./certbot/www:/var/www/certbot
      - ./certbot/conf/:/etc/letsencrypt
      - ./resources:/etc/nginx/html/
    depends_on:
      - nextjs
      - backend
    networks:
      - nginx_net

  certbot:
    image: certbot/certbot:latest
    restart: unless-stopped
    volumes:
      - ./certbot/www/:/var/www/certbot
      - ./certbot/conf/:/etc/letsencrypt
    networks:
      - nginx_net
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

networks:
  nginx_net:
    name: nginx_net

volumes:
  postgres_data:
  frontend:
  resources:

nginx.conf

upstream backend_upstream {
  server backend:8000;
 } 

 upstream nextjs_upstream {
   server nextjs:3000;
 }

server {
    listen 80;
      
    server_tokens off;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
  }
  
  server {
    listen 443 default_server ssl http2;
    listen [::]:443 ssl http2;


    ssl_certificate /etc/letsencrypt/live/i-line.kz-0001/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/i-line.kz-0001/privkey.pem;

    server_tokens off;

    gzip on;
    gzip_proxied any;
    gzip_comp_level 4;
    gzip_types text/css application/javascript image/svg+xml;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;

    location /_next/static {
      proxy_pass http://nextjs_upstream;

      add_header X-Cache-Status $upstream_cache_status;
    }

    location /static {
      proxy_ignore_headers Cache-Control;
      proxy_cache_valid 60m;
      proxy_pass http://nextjs_upstream;
      add_header X-Cache-Status $upstream_cache_status;
    }

    location /resources/ {
      alias /resources/;
      proxy_hide_header Content-Type;
      add_header Content-Type image/jpg;
    }

    location / {
      proxy_pass http://nextjs_upstream;
    }
    
    location /api {
      rewrite /api/(.*) /$1  break;
      proxy_pass http://backend_upstream;
    }
  }

При создании записи в БД изображение успешно появляется на сервере в папке resources. Но при запросе через фронт получаю ошибку 404. Лог ошибки nginx

root-nginx-1  | 2023/05/22 11:00:52 [error] 21#21: *1 open() "/resources/Logo_3hVK350.jpg" failed (2: No such file or directory) request: "GET /resources/Logo_3hVK350.jpg HTTP/2.0", 
root-nginx-1  | - [22/May/2023:11:00:52 +0000] "GET /resources/Logo_3hVK350.jpg HTTP/2.0" 404 "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1" "-"

Понимаю, что скорее всего проблема в конфиге nginx, но не могу понять, как это исправить. Прошу помощи

Ответы

▲ 2Принят

Вы в конфиге написали alias /resources/, но в файловой системе контейнера у вас ресурсы лежат в каталоге /etc/nginx/html/, верно? Поэтому и в конфиге вам нужно писать alias /etc/nginx/html/

Для проверки зайдите внутрь контейнера

docker exec -it nginx /bin/sh

Эта команда откроет для вас строку интерпретатора. Проверьте ls /resources/, ls /etc/nginx/html/