Запуск веб-сервера на базе 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

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

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.