Простой CDN сервер на базе связки Nginx+Lua и немного Python.
- Upload/Download файлов
- Upload progress
- Video streaming (.mp4)
- Resize/Crop/Blur изображений
В репозитории предоставлены конфигурационные файлы для обеспечения функциональности и не включают в себя тонкостей, специфичных для каждого проекта.
$ git clone https://github.com/pirsipy/cdn.git
$ cd cdn
$ vagrant up| Описание | URL | Тип запроса |
|---|---|---|
| Upload файлов | http://localhost:8080/upload/ |
POST |
| Upload progress | http://localhost:8080/progress/ |
GET |
| Download файлов | http://localhost:8080/<path> |
GET |
| Video streaming | http://localhost:8080/<path>.mp4 |
GET |
| Resize/Crop/Blur изображений | http://localhost:8080/<path>.<image type> |
GET |
Загрузка файла(ов) на сервер.
Для трэкинга прогресса загрузки необходимо передавать заголовок запроса X-Progress-Id: <unique_id> или аналогичный GET-параметр: http://localhost:8080/upload/?X-Progress-Id=<unique_id>.
В качестве
<unique_id>рекомендуется генерироватьuuid.
Возможна передача нескольких файлов одним запросом.
Пример ответа:
[
{
"type": "image/jpeg",
"url": "http://localhost:8080/a0/41/c9/be59f980ef.jpg",
"name": "example.jpg",
"md5": "a61abd29931707236bfeae95fda21a3e",
"size": "145400"
}
]Получение информации о статусе передачи контента на сервер.
Для получения информации нужно использовать X-Progress-Id, указанный при запросе передачи контента на сервер, следующим образом:
http://localhost:8080/progress/?X-Progress-Id=<unique_id>
Пример ответа:
{ "state" : "uploading", "received" : 388360, "size" : 2154474 }Получение загруженного файла по ссылке, сгенерированной при загрузке контента на сервер.
Пример ссылки:
http://localhost:8080/a0/41/c9/be59f980ef.jpg
В случае, когда контентом является видео в формате mp4, данные передаются по технологии streaming, что позволяет:
- Использовать
HTTPстатус206 Partial Contentдля получения чисти контента, т.е. так называемой "перемотки". - Использовать
GETпараметрstartс указанием значения в секундах для определения начала воспроизведения. - Использовать
GETпараметрendс указанием значения в секундах для определения конца воспроизведения.
Примеры запросов:
http://localhost:8080/e0/1c/88/0cd65b8f50.mp4
http://localhost:8080/e0/1c/88/0cd65b8f50.mp4?start=200
http://localhost:8080/e0/1c/88/0cd65b8f50.mp4?end=500
http://localhost:8080/e0/1c/88/0cd65b8f50.mp4?start=300&end=600
При первичном запросе генерируется файл по заданным параметрам. Последующие аналогичные запросы используют уже имеющийся файл. Своего рода кэширование.
Изменение размера/Обрезание части изображений с помощью GET параметра size.
"500x300" -- Изменение размера изображения с сохранением соотношения сторон,
-- ширина не превышает 500px, а высота 300px
"500x300!" -- Изменение размера изображения до 500px на 300px,
-- игнорируя соотношение
"500x" -- Изменение ширины изображения до 500px,
-- сохраняя соотношение
"x300" -- Изменение высоты изображения до 300px,
-- сохраняя соотношение
"50%x20%" -- Изменение ширины изображения до 50% и высоты до 20%
-- относительно оригинала
"500x300c" -- Изменение размера изображения до 500px на 300px, но обрезая
-- верхнюю или нижнюю часть, сохраняя соотношение сторон
"500x300+10+20" -- Обрезание части изображения до 500px на 300px
-- с позиционированием 10,20Примеры запросов:
http://localhost:8080/a0/41/c9/be59f980ef.jpg?size=500x300
http://localhost:8080/a0/41/c9/be59f980ef.jpg?size=500x300!
http://localhost:8080/a0/41/c9/be59f980ef.jpg?size=500x
http://localhost:8080/a0/41/c9/be59f980ef.jpg?size=x300
http://localhost:8080/a0/41/c9/be59f980ef.jpg?size=50%x20%
http://localhost:8080/a0/41/c9/be59f980ef.jpg?size=500x300c
http://localhost:8080/a0/41/c9/be59f980ef.jpg?size=500x300+10+20
Наложение фильтра blur на изображение с помощью одноименного GET параметра blur, в котором задается уровень от 1 до 100.
Пример запроса:
http://localhost:8080/a0/41/c9/be59f980ef.jpg?blur=5
Возможно комбинирование описанных параметров:
http://localhost:8080/a0/41/c9/be59f980ef.jpg?size=500x300&blur=5
Работоспособность проверена на
CentOS 7и предоставлена в видеvagrantобраза pirsipy/cdn.
Обновление системы и установка зависимостей
$ sudo yum update -y
$ sudo yum groupinstall -y "Development tools"
$ sudo yum install -y ImageMagick ImageMagick-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel pcre-develУстановка Python 3.4 (рекомендуется)
Переключение во временную директорию
$ cd /tmpЗагрузка, компиляция и установка Python 3.4
$ wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
$ tar xf Python-3.4.3.tgz
$ cd Python-3.4.3
$ ./configure --prefix=/usr/local --enable-shared
$ make
$ sudo make install
$ sudo echo /usr/local/lib >> /etc/ld.so.conf.d/local.conf
$ sudo ldconfigПереключение во временную директорию
$ cd /tmpЗагрузка upload-module для Nginx (http://wiki.nginx.org/HttpUploadModule)
$ git clone https://github.com/vkholodkov/nginx-upload-module.git --branch 2.2Загрузка upload-progress-module для Nginx (http://wiki.nginx.org/HttpUploadProgressModule)
$ git clone https://github.com/masterzen/nginx-upload-progress-module.gitЗагрузка готовой сборки Nginx с набором остальных необходимых компонентов (http://openresty.org)
$ wget http://openresty.org/download/ngx_openresty-1.7.10.1.tar.gzКонфигурирование, компиляция и установка
$ tar xzf ngx_openresty-1.7.10.1.tar.gz
$ cd ngx_openresty-1.7.10.1
$ ./configure --with-http_mp4_module --add-module=/tmp/nginx-upload-module --add-module=/tmp/nginx-upload-progress-module
$ make
$ sudo make install
$ sudo ln -s /usr/local/bin/python3 /usr/bin/
$ sudo ln -s /usr/local/bin/pip3 /usr/bin/Создание ссылки (для удобства) на исполняемый файл nginx
$ sudo ln -s /usr/local/openresty/nginx/sbin/nginx /usr/sbin/Некоторые из указанных настроек несут лишь рекомендуемый характер.
Добавим в систему пользователя webmaster, от имени которого будем производить запуск необходимых компонентов
$ sudo useradd webmasterДобавим директории для логирования
$ mkdir /home/webmaster/logs
$ mkdir /home/webmaster/logs/nginxПодключение дополнительного репозитория epel
$ sudo yum install -y epel-releaseУстановка supervisor для атоматического запуска необходимых компонентов
$ sudo yum install -y supervisorАвтоматический запуск supervisor при загрузке сервера
$ sudo systemctl enable supervisordИзменение настроек supervisor. Заменить содержимое файла /etc/supervisord.conf на:
[unix_http_server]
file=/tmp/supervisor.sock
username=user
password=123
[supervisord]
logfile=/home/webmaster/logs/supervisord.log
logfile_maxbytes=50MB
logfile_backups=5
loglevel=info
pidfile=/tmp/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200
user=webmaster
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock
username=user
password=123
history_file=~/.sc_history
[include]
files = /home/webmaster/app/*.iniИзменение настроек nginx. Заменить содержимое файла /usr/local/openresty/nginx/conf/nginx.conf на:
user webmaster;
worker_processes 1;
daemon off;
error_log /home/webmaster/logs/nginx/error.log;
pid /tmp/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
access_log /home/webmaster/logs/nginx/access.log;
sendfile on;
keepalive_timeout 65;
gzip on;
include /home/webmaster/app/*.conf;
}
Gist с файлами настроек: https://gist.github.com/vilisov/2656f0bf5f7e0ce5632f
Склонировать репозиторий в директорию /home/webmaster/app
$ cd /home/webmaster
$ git clone https://github.com/pirsipy/cdn.git appУстановка python зависимостей
$ cd /home/webmaster/app
$ sudo pip3 install -r requirements.txtЗапускаем supervisor
$ sudo service supervisord startИли перезапускаем, если уже был запущен
$ sudo service supervisord restartПосле запуска результат выполнения команды
$ supervisorctl statusдолжен выглядеть примерно так:
cdn:nginx RUNNING pid 2907, uptime 3:47:24
cdn:upload RUNNING pid 2909, uptime 3:47:24
Файл /home/webmaster/app/nginx.conf
| Переменная/Директива | Описание |
|---|---|
| listen | Порт, на котором будет запущен сервер |
| $BASE_PATH | Основной путь к директории, куда склонен репозиторий |
| $files | Дериктория, в которую будут загружаться файлы |
| $cache | Директория для кэширования преобразованных изображений |
| client_max_body_size | Максимальный размер запроса к серверу |
| $limit_rate | Ограничение на скорость отдачи контента от сервера |
| upload_limit_rate | Ограничение на скорость загрузки контента на сервер |
Файл /home/webmaster/app/server.py
| Переменная | Описание |
|---|---|
| BASE_PATH | Дериктория, в которую будут загружаться файлы |
В данном описании команды с префиксом sudo означают запуск с паравами root пользователя. О настройке данной возможности есть много информации в интернете. Если все же не получилось настроить, то данные команды можно выполнять авторизовавшись под пользователем root.
При использовании vagrant возможна длительная загрузка данных на виртуальную машину при использовании ресурса http://localhost:8080/upload/. Это связано с медленной синхронизацией смонтированной директории.
По всем вопросам можно обращаться любым удобным способом:
| VK | Skype | |
|---|---|---|
| https://vk.com/stas.vilisov | st@pirsipy.com | stas.pirsipy |
@ 2015 Pirsipy