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

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

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

/ files /: id

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

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

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

для этой архитектуры:

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

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

path
mimetype
originalname

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

0
задан 20 May 2018 в 19:49
3 ответа

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

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

это пример конфигурации:

express:

    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;
        }
    }

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

/ home / ypj / x / y / z

0
ответ дан 24 November 2019 в 02:40

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

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

Произойдет следующее:

  1. nginx проксирует запрос на / files /: id. в бэкэнд
  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

0
ответ дан 24 November 2019 в 02:40

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

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

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

0
ответ дан 24 November 2019 в 02:40

Теги

Похожие вопросы