Thursday, November 15th, 2018

Реализация контролируемых скачиваний в nginx (nginx accel proxy cache download auth rails php)

Published on Январь 24, 2009 by   ·   Один комментарий

Использование X-Accel-Redirect с Nginx для реализации контролируемых
скачиваний (с примерами для rails и php)

Иногда вам может быть нужно реализовать т.н. контролируемое
скачивание, когда все запросы на скачивание файлов передаются скрипту,
который решает, как поступить: отправить пользователю какой-либо файл,
или показать стриницу access denied, или, может быть, сделать что-то
еще. При использовании сервера lighttpd это может быть реализовано при
помощи заголовка X-Sendfile, возвращаемого из скрипта. Nginx имеет
свою союственную реализацию описанной идеи с использованием заголовка
X-Accel-Redirect. В этой короткой статье я попытаюсь описать, как
использовать эту возможность из приложений на PHP или Rails.

Представим, что у вас есть какой-либо сайт, работающий на Apache с PHP
или Rails для генерации нинамического контента. Если вы будете
использовать nginx в качестве reverse-proxy перед вашим сервером
Apache, вы получите сразу две положительных возможности:

1. Вы сможете освободить больше ресурсов вашего сервера для
обслуживания клиентов, т.к. nginx возьмет на себя работу с
медленными клиентами (детальнее — здесь).

2. Вы сможете реализовать контролируемое скачивание статических
файлов с вашего сайта.

В этой статье я предпологаю, что сайт расположен в каталоге /var/www и
статические файлы (например, фильмы, музыка или что-то еще)
расположены в каталоге /var/www/files. Apache слушает на порту
http://127.0.0.1:8080.

Для начала, давайте рассмотрим нашу конфигурацию сервера nginx:

http {
....
server {
listen       80;
server_name  your-domain.com;
location / {
rewrite ^/download/(.*) /down.php?path=$1 last;
proxy_pass         http://127.0.0.1:8080/;
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;
client_max_body_size       10m;
client_body_buffer_size    128k;
proxy_connect_timeout      90;
proxy_send_timeout         90;
proxy_read_timeout         90;
proxy_buffer_size          4k;
proxy_buffers              4 32k;
proxy_busy_buffers_size    64k;
proxy_temp_file_write_size 64k;
}
location /files {
root /var/www;
internal;
}
}
}

Как вы видите, у нас есть дополнительная «internal» секция location
/files. Это ключевое влово «internal» позволяет нам иметь секции
location, которые будут доступны для польщователя только в случае
внутренних редиректов внутри nginx и при использование заголовка
X-Accel-Redirect в ответах от сриптов backend-сервера. Итак, мы можем
использовать простой скрипт на PHP или код на Rails для реализации
контролируемых скачиваний с поддержкой заголовков Ranges (докачка) и
всех остальных возможностей, предоставляемых при прямом скачивании
статического контента с серверов под управлением nginx.

Вот пример очень простого скрипта down.php:

<?php
// Get requested file name
$path = $_GET["path"];
//...
// Perform any required security checks, validation
// and/or stats accounting
//...
// And redirect user to internal location
header("X-Accel-Redirect: /files/" . $path);
?>

В приложениях Rails вы можете использовать следубщий код в вашем
controller’е:

// Get requested file name
path = @params["path"]
# ...
# Perform any required security checks, validation
# and/or stats accounting
# ...
# And redirect user to internal location
@response.headers['X-Accel-Redirect'] = "/files/" + path

Вот и все! При помощи описанного подхода вы сможете реализовать очень
гибкую и удивительно эффективную систему раздачи любого статического
контента!































Смотрите также:

Tags: , , , ,

Readers Comments (Один комментарий)

  1. timur:

    Знак @ перед response и params ставить не нужно,
    ети instance переменние depreciated.




Да человек я, человек! =)

Exchange 2007

Проведение мониторинга Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 3)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Проведение мониторинга Exchange 2007 с помощью диспетчера System ... [+]

Практическое рассмотрение перехода с Exchange 2003 на Exchange 2007 (часть 1)

Введение В этой статье из нескольких частей я хочу показать вам процесс, который недавно использовал для перехода с существующей среды Exchange 2003 ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 2)

Если вы пропустили первую часть этой серии, пожалуйста, прочтите ее по ссылке Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (Часть ... [+]

Мониторинг Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 2)

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Мониторинг Exchange 2007 с помощью диспетчера System Center Operations ... [+]

Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 5)

Если вы пропустили предыдущие части этой серии статей, перейдите по ссылкам: Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 1) ... [+]

Установка и настройка Exchange 2007 из командной строки (Часть 3)

If you missed the previous parts in this article series please read: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 1)

Инструмент ExRCA Текущий выпуск инструмента предоставляется только в целях тестирования и оснащен 5 опциями: Тест подключения Outlook 2007 Autodiscover Тест подключения Outlook 2003 RPC ... [+]

Развертывание сервера Exchange 2007 Edge Transport (часть 5)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Развертывание сервера Exchange 2007 Edge Transport (часть 1) Развертывание ... [+]

Установка и настройка Exchange 2007 из командной строки (часть 2)

Если вы пропустили первую статью данного цикла, пожалуйста, перейдите по ссылке: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование интегрированных сценариев Using Exchange Server 2007 – часть 2: генерирование отчетов агента Transport AntiSpam Agent

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Использование интегрированных сценариев Using Exchange Server 2007 – часть ... [+]