Назад | Перейти на главную страницу

разгрузка обслуживания динамических файлов с сервера приложений на nginx

я использую Nginx так как Обратный прокси для меня Сервер приложений.

Сервер приложений получает запросы на загрузку файлов по этому маршруту:

/ файлы /: идентификатор

Затем приложение находит путь к файлу в файловой системе т.е. / путь / к / файлу / с / id и отвечает содержимым файла.

Я не хочу открывать пользователю путь к файлу.

Есть ли способ сообщить Nginx путь к файлу, чтобы Nginx мог обрабатывать загрузку файла для пользователя, вместо моего сервера приложений, я не хочу использовать Nginx только в качестве обратного прокси или кеш-сервера, мне нужно больше сервера приложений от Nginx.


Обзор:

Хотите отказаться от этой архитектуры:

[nodejs / express]> файл содержание [nginx]> файл содержание [браузер]

к этой архитектуре:

[nodejs / express]> файл Информация [nginx]> файл содержание [браузер]

информация о файле:

path
mimetype
originalname

Nginx должен сообщить браузеру исходное имя и mimetype файла. имя файла хешируется в пути, и в имени файла нет никаких признаков его mimetype, поэтому я должен использовать информацию о файле, возвращаемую с сервера приложений.

Благодаря @MichaelHampton Я использовал x-Accel

https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/

это образец конфигурации:

экспресс:

    if (file_info.mimetype.split('/')[0] === 'image') {
      res.header(
        'Content-Disposition',
        'inline');
    } else {
      res.header(
        'Content-Disposition',
        'attachment; filename=' + file_info.originalname);
    }

    res.header('Content-Type', file_info.mimetype);
    res.header('X-Accel-Redirect', file_info.path.split('/home')[1]);

nginx:

    location ~ ^/ypj* {
        internal;
        root /home;
    }

    location ~ .* {
        if ($host ~ ^cdn\.(.+)$) {
            proxy_pass http://127.0.0.1:4000;
        }
    }

путь к файлу выглядит примерно так:

/ главная / ypj / x / y / z

Вам необходимо настроить сервер приложений для перенаправления (а не перезаписи!) URL-адресов, т.е. если я запрашиваю / files /: id, я должен получить перенаправление 301 на / path / to / file.

Затем вам нужно настроить nginx для обслуживания файлов из локальной файловой системы, если они найдены, и возврата к обратному прокси-серверу, если они не найдены.

Что произойдет:

  1. Запрос / files /: id передается nginx на бэкэнд.
  2. Бэкэнд отправляет клиенту перенаправление 301 на / путь / к / файлу.
  3. Клиент запрашивает / путь / к / файлу
  4. nginx находит файл в локальной файловой системе и обслуживает его напрямую

Что-то вроде этого:

location / {
    try_files $uri $uri/ @backend;
}

location @backend {
    proxy_pass http://ip:80;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
}

РЕДАКТИРОВАТЬ: если вы не хотите, чтобы пользователь знал истинный URL-адрес файла, ваш единственный вариант - попросить удаленный сервер перевести URL-адрес или создать логику для выполнения сопоставления внутри самого nginx. Это можно сделать, переключившись с nginx на openresty и используя lua-resty-http: https://github.com/pintsized/lua-resty-http

nginx имеет очень ограниченную логику формы поддержки для выполнения подобных операций, чтобы узнать имя файла для обслуживания.

Вам нужно изменить свое приложение так, чтобы вместо выдачи URL /files/:id пользователям будет предоставлен URL-адрес фактического статического файла.

Другой вариант - просто добавить кеширование в nginx.