Заметки · 03.06.2022

Файловый http сервер

Эта статья полностью ориентирована на Linux-окружение с доступом к общим ресурсам, реализованным с помощью программы Samba. Если Вы никогда не сталкивались с конфигурированием общих сетевых папок в Linux — настоятельно рекомендую ознакомиться с этим постом.

Мною использовался дистрибутив операционной системы Ubuntu Server версии 20.04 (Focal Fossa).

Посты, посвященные ОС Linux Ubuntu и её базовой настройке можно найти по тегу ubuntu.

Допустим, у нас имеется какое-то количество платформ, которые с помощью VLC media player показывают один и тот же зацикленный видеофайл из сетевой папки. Теперь усложним — видеофайл требуется заменить на какой-то другой или же внести в него изменения. Само собой, так как файл читается — он занят и любые манипуляции с ним будут недоступны.

Есть три варианта решения этой задачи:

  1. останавливать на всех платформах VLC media player и/или заменять ссылку на файл;
  2. перезагружать платформы и стремительно заменять файл на новый;
  3. потратить немного времени и перевести доступ к файлу на http.

Обращение к файлам по протоколу http полностью решает проблему блокировки файлов на сервере. А при правильно настроенном плеере — можно заменить файл и платформа сразу начнет воспроизведение.

Проблема блокировки файлов при прямом доступе уже упоминалась ранее, когда я касался конкатенации видеофайлов с помощью утилиты ffmpeg.

В принципе, размещение файлов с доступом по http применимо для любого вида информации — вещаемой, демонстрационной, справочной, исполняемой и архивной.

В этом посте я расскажу как организовать простейшее файловое хранилище с доступом по протоколу http на ОС Ubuntu Server с помощью веб-сервера Nginx.

Разумеется, для начала требуется установить веб-сервер Nginx:

sudo apt-get install nginx -y

После установки проверяем статус службы nginx в системе:

systemctl status nginx

Служба должна быть загружена и запущена. Если по какой-то причине служба оказалась не активна поочерёдно выполните команды:

sudo systemctl enable nginx
sudo systemctl start nginx

Первой командой мы включаем автозагрузку службы, а второй — стартуем её.

Теперь редактируем основную конфигурацию веб-сервера (/etc/nginx/nginx.conf) с помощью редактора nano:

sudo nano /etc/nginx/nginx.conf

В конфигурации веб-сервера есть два основных блока — events и http.

В блок http необходимо добавить субблок server:

server {
        listen 80;
        server_name HOSTNAME IP;
        location / {
                     root /share;
                     index index.html index.htm;
                   }
       }
Пример оформления субблока server

В этой конструкции обозначается порт прослушивания — listen 80, имя текущего сервера и его IP-адрес — server_name HOSTNAME IP (заменяем HOSTNAME на имя сервера, а IP — IP-адресом сервера).

Далее в субблоке server задаётся ещё один субблок — location, в котором надо обозначить папку, где будут размещаться файлы и индексная страница сервера. После внесения изменений в конфигурационный файл — сохраняемся и выходим из редактора nano.

Важно! При внесении изменений в конфигурационные файлы не желательно использование табуляции для выравнивания строк.

Теперь попробуем провести тестирование файла конфигурации Nginx:

sudo nginx -t

Ознакомиться с параметрами командной строки можно в документации программы Nginx.

Если изменения в файл nginx.conf были внесены корректно — то терминал вернёт ответ:

Успешное тестирование файла конфигурации Nginx

В случае ошибок тестирования — утилита укажет номер строки с ошибкой и примерное описание. В моём случае, проблемы возникали только с нехваткой фигурных скобок.

Теперь немного о настройке брандмауэра в Ubuntu, если — само собой — он включён и используется. Подробную документацию по командам UFW можно найти вот здесь.

Итак, в процессе установки Nginx создаёт свои правила в брандмауэре UFW и с их помощью можно проводить открытие и закрытие необходимых портов.

Просмотреть все доступные правила UFW можно с помощью команды:

sudo ufw app list

Вывод будет примерно таким:

Правила брандмауэра UFW

На скриншоте видно, что в настоящее время доступны пять правил: три из них создал Nginx, а остальные OpenSSH и Samba. В Вашем выводе список может быть другим, но правила Nginx там должны быть обязательно.

Всего Nginx создаёт три правила:

  • Nginx Full: полный набор правил. Открыты порты 80 (стандартный http порт для нешифрованного трафика) и 443 (порт с TLS/SSL шифрованием трафика);
  • Nginx HTTP: правило открывает только 80 порт.
  • Nginx HTTPS: правило открывает только 443 порт.

Для рассматриваемой здесь задачи необходимо открыть только 80 порт. Для этого активируем правило Nginx HTTP:

sudo ufw allow 'Nginx HTTP'

Теперь все файлы, которые будут размещены в папке /share на нашем сервере будут доступны по протоколу http. Адреса для файлов будут иметь вот такой вид (URL) — http://IP-адрес-сервера/filename.format.

Возвращаясь к основной задаче поста касательно общего видеофайла: на всех задействованных платформах необходимо будет «скормить» программе VLC media player получившийся URL файла в любом удобном для Вас виде.

Постскриптум

Кстати, можно создать и разместить в общей папке страницу index.html, которая бы загружалась при переходе по http://IP-адрес-сервера в браузере. Для воспроизведения всё того же видеофайла предлагаю обратиться к video.js. Это наиболее простой и современный html5 плеер. Подключение и настройка займут несколько минут даже если вы не специалист в связках html/css/js.

Например, вот код странички с зацикленным воспроизведением файла video.mp4 (при условии, что вся скриптовая база video.js лежит в общей папке в директории videojs):

<html>
<head>
	<title>VIDEOPLAY</title>
	 <link href="videojs/video-js.min.css" rel="stylesheet">
    <script src="videojs/video.min.js"></script>
  <style type="text/css">
    body 
	{
      margin: 0;
		background: #000000;
    }
    .play 
	{
	   width: 100%;
		height: auto;
		display: inline-block;
		border: 0;
		margin: 0;
		padding: 0;
		margin-left: auto;
		margin-right: auto;
		display: block;
		max-height: 100%;
    }
  </style>  
</head>
<body>
	<div class="play">
      <video id="video" class="video-js vjs-default-skin vjs-16-9 vjs-big-play-centered" autoplay muted loop preload="none" data-setup='{"fluid": true}'>
		<source src="video.mp4" type="video/mp4">
		</video>
	</div>	
</body>
</html>

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

Для создания киоска под управлением Linux Ubuntu с автозапуском браузера Chromium — рекомендую ознакомиться с этим постом.