Как правильно настроить Nginx для того, чтобы он выдавал статические файлы из бэкенда?

Я развернул приложение с бэкендом на NestJS и фронтендом на Next.js на VPS сервере. В приложении есть статические изображения, которые успешно загружаются из папки /public на фронте. Однако, у меня также есть аватары и логотипы пользователей, которые загружаются на бэк в директорию /static. При попытке отобразить список пользователей на сайте изображения, находящиеся на бэке, возвращают ошибку 400, хотя они существуют и имеют формат webp. <br/> Как правильно настроить Nginx для этой ситуации? Если проблема не в настройках сервера, то что еще может быть причиной? Были ли у кого-то подобные проблемы?
  • 10 марта 2025 г. 17:04
Ответы на вопрос 2
Для настройки Nginx таким образом, чтобы он правильно обслуживал статические файлы из папки на сервере, необходимо создать соответствующий блок конфигурации в файле конфигурации Nginx. Приведу пример базовой конфигурации для вашего случая.

### Пример конфигурации Nginx

1. Откройте файл конфигурации Nginx. Обычно он расположен в `/etc/nginx/sites-available/default` или `/etc/nginx/nginx.conf`.

2. Добавьте следующий блок конфигурации или отредактируйте существующий:

```nginx
server {
    listen 80;
    server_name ваш_домен; # Замените на ваш домен или IP адрес

    root /путь/к/вашему/проекту; # Замените на путь к корню вашего приложения

    location / {
        try_files $uri $uri/ /index.html; # Для маршрутизации Next.js
    }

    location /static {
        alias /путь/к/вашему/проекту/static; # Замените на путь к директории с вашими статическими файлами на бэкенде
        expires 30d; # Устанавливает кэширование на 30 дней
        access_log off; # Опционально: отключает логирование доступа к статическим файлам
    }
    
    location ~* \.(?:webp|jpg|jpeg|png|gif|ico|svg)$ {
        expires 30d;
        access_log off;
    }

    # Обработка ошибок
    error_page 400 /custom_400.html; # Укажите кастомную страницу (если нужна)
    error_page 404 /custom_404.html; # Укажите кастомную страницу (если нужна)
    error_page 500 /custom_500.html; # Укажите кастомную страницу (если нужна)
}
```

### Пояснение конфигурации:

- `root /путь/к/вашему/проекту;` — задает корневую директорию вашего приложения.
  
- `location /static` — создаёт правило для обработки запросов к статическим файлам, которые находятся в директории `/static`. Не забудьте заменить путь на актуальный путь к вашей директории с файлами.

- `alias` используется для указания альтернативного пути к директории, где находятся статические файлы.

- `expires` указывает время кэширования для браузеров.

### Проверка и перезапуск Nginx

После редактирования конфигурации необходимо проверить её на наличие синтаксических ошибок и перезапустить Nginx:

```bash
sudo nginx -t # Проверка конфигурации
sudo systemctl restart nginx # Перезапуск сервера Nginx
```

### Проверка других причин ошибки

Если проблема сохраняется после настройки Nginx, то стоит проверить:

1. **Логи Nginx**: посмотрите журналы доступа и ошибок в `/var/log/nginx/access.log` и `/var/log/nginx/error.log`. Это может помочь понять, в чем может быть проблема.

2. **Настройки NestJS**: убедитесь, что все маршруты настроены правильно и вы используете правильные пути для загрузки изображений.

3. **Права на файлы и директории**: проверьте, что у Nginx есть доступ к файлам и директориям, где хранятся изображения.

4. **Кросс-доменные запросы (CORS)**: если ваша фронтенд-часть обслуживается с другого домена, убедитесь, что запросы к бэкенду правильно настроены с точки зрения CORS.

Эти шаги должны помочь вам настроить корректную работу с статическими файлами в Nginx и устранить проблемы, с которыми вы сталкиваетесь.
Попробуйте следующую конфигурацию nginx для статики, которая находится на бэкенде: 
server {
    listen 80;
    server_name yourdomain.com;

    # Отдача статики, загруженной на бек
    location /static/ {
        alias /полный/путь/до/backend/static/;
        try_files $uri $uri/ =404;
    }

    # Проксирование остальных запросов (например, на фронтенд NextJS)
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}


Если после такой настройки проблема сохраняется, проверьте логи nginx и NestJS — возможно, ошибка 400 генерируется на уровне приложения из-за неверных URL или заголовков запроса.
Похожие вопросы