Запуск веб-сервера на базе RaspberryPi (Ruby/Sinatra)

Запуск веб-сервера на базе RaspberryPi (Ruby/Sinatra)

У вас есть RaspberryPi микрокомпьютер и вы хотите сделать простую веб-админку.

Для этого можно использовать Ruby язык, и простой веб-фреймворк — Sinatra.

Весь процесс от начала, и до открытия веб-страницы в браузере займёт не более 10 минут,
при этом знание Ruby на данном этапе — не обязательное.

Предполагается, что вы проделали процедуру настройки RPi (например на базе данного туториала
https://github.com/robotclass/robotclass/blob/master/articles/raspberry-pi-start/raspberry-pi-start.md)

Установлена система Raspberian (aka Debian)

Начальное состояние

RPi подключен к интернету, вы зашли в него по SSH.

Установка Ruby

Можно установить из пакетов:

sudo apt-get install ruby

Будет установлен Ruby 1.9.3 версии, и менеджер пакетов Gem.

Установка фреймворка Sinatra

Многие наверное слышали про веб-фреймвор на базе Ruby — RubyOnRails,
для наших несложных задач можно попробовать простой и элегантный фреймворк Sinatra.

Устанавливаем его с помощью менеджера пакетов Gem:

sudo gem install sinatra

Запуск веб-сервера

Мы не будем устанавливать и конфигурировать Apache или Nginx — для тестовых задач вполне подойдёт
поставляемый вместе с Ruby веб-сервер WEBRick.

Нам необходимо только написать программу для обработки входящих запросов по HTTP,
и выдачу результатов браузеру.

Создаём папку web в ней будет наше приложение:

mkdir web

Переходим в папку:

cd web

Создаём и открываем на редактирование файл app.rb:

nano app.rb

Открывается текстовый редактор, вводим этот код:

require 'sinatra'

get '/' do
  'Hello world!'
end

Сохраняем — нажимая "F2", подтверждаем сохранение нажав "Y",
видим название файла — нажимаем Enter.

Всё программа написана, в наше программе один обработчик на входящий GET запрос "/", и выдачу
текста 'Hello world!' в ответ.

Для старта нашего приложения надо набрать:

ruby app.rb -o IP.IP.IP.IP

Где IP.IP.IP.IP — это IP адрес вашего микрокомпьютера RaspberryPi.

В случае успешного запуска будет выведено что-то вроде этого:

[2013-07-19 06:04:22] INFO  WEBrick 1.3.1
[2013-07-19 06:04:22] INFO  ruby 1.9.3 (2012-04-20) [arm-linux-eabihf]
== Sinatra/1.4.3 has taken the stage on 4567 for development with backup from WEBrick
[2013-07-19 06:04:22] INFO  WEBrick::HTTPServer#start: pid=2794 port=4567

Что означает, что веб-сервер WEBrick успешно стартовал и слушает порт 4567, по-умолчанию
(можно указать свой порт с помощью ключика -p).

Открываем браузером адрес:

http://IP.IP.IP.IP:4567

Видим: Hello world!

Управление воспроизведением интернет радио

Я в качестве эксперимента установил на RPi Music Player Daemon (MPD) (http://www.musicpd.org/)
и проигрываю интернет радио.

И можно продемострировать как создать веб-приложение для старта и стопа этого приложения.

Старт и остановка осуществляются командами:

mpc play

и

mpc stop

Нам надо сделать URL, при запросе которых будет выполнена соотв. команда.

В Ruby запуск команд выполняется командой system("CMD") где CMD — команда, которую
необходимо выполнить.

Изменяем наш код на следующий:

require 'sinatra'

get '/' do
  'Hello world'
end

get '/stop' do
  system('mpc stop')
end

get '/play' do
  system('mpc play')
end

Останавливаем веб-сервер Ctrl-C (если он стартован), открываем на редактирование файл:

nano app.rb

Сохраняем, и запускаем опять веб-сервер.

Открываем браузером URL для запуска:

http://IP.IP.IP.IP:4567/start

URL для остановки:

http://IP.IP.IP.IP:4567/stop

Шаблоны и редиректы

Доработаем наше приложение, чтобы на стартовой странице отображалось состояние проигрывателя, ссылка для старта,
и для остановки.

Получится такое приложение:

require 'sinatra'

get '/' do
  @status = `mpc status`
  erb :main
end

get '/stop' do
  system('mpc stop')
  redirect '/'
end

get '/play' do
  system('mpc play')
  redirect '/'
end

__END__

@@main
<!DOCTYPE html>
<html>
  <head>
    <title>Ruby demo</title>
  </head>
  <body>
  <pre><%= @status %></pre>
  <a href="/play">PLAY</a> |
  <a href="/stop">STOP</a>
  </body>
</html>

Замечания:

Видим строку:

@status = `mpc status`

Здесь переменной @status присваивается результат выполнения шелл команды mpc status, в отличие от
формата system('mpc play') — результат выполнения возвращается строкой (обратный апостроф).

В Sinatra можно включать шаблон внутрь файла с программой, для этого добавляется разделитель __END__

После него идут шаблоны (html) с вставками руби кода — <%= @status %> — выводит значение переменной @status.
В руби переменная экземпляра класса начинается с @.

Шаблоны называются в начале с помощью @@NAME — это формат Sinartra.

Далее редиректы redirect — и указывается УРЛ куда надо редиректить браузер — в нашем случае на корневую страницу.

Резюме

У нас достаточно быстро получился несложный пример веб-приложения на языке Ruby,
которое легко можно изменить для запуска любых shell команд на RaspberryPi
микрокомпьютере.

Производительность

В качестве эксперимента был создан тестовый роутер:

get '/test' do
  @t = 'test'
  erb :test
end

И шаблон:

@@test

<!DOCTYPE html>
<html>
  <head>
    <title>Ruby demo</title>
  </head>
  <body>
  <pre><%= @t %></pre>
  </body>
</html>

И выполнен запрос командой ApacheBench

ab -c 1 -n 100 http://IP.IP.IP.IP:PORT/test

С другой машины, результат:

Requests per second:    12.64 [#/sec] (mean)

То есть порядка 10 запросов в секунду может выдавать Ruby Sinatra веб-фреймвор,
на простых задачах отображения, установленный на микрокомпьютере RaspberryPi.

Ссылки

Основной сайт фреймворка Sinatra: http://www.sinatrarb.com/

Русскоязычная страничка: http://sinatraruby.ru/

Руби вики-страница: http://ru.wikibooks.org/wiki/Ruby

Самые основы Ruby: http://www.shokhirev.com/mikhail/ruby/ltp/title.html

auto generated by github2wp

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *