Развёртывание веб-приложения Clojure на сервере FreeBSD 10.2

Функциональное программирование (а в частности разработка в Clojure) сегодня пользуется широкой популярностью. Данное руководство поможет развернуть приложение Clojure на сервере FreeBSD 10.2; руководство охватывает следующие этапы:

  • Создание приложения Clojure;
  • Подготовка приложения к производству;
  • Настройка серверной среды для приложения Clojure (Supervisor для запуска приложения и Nginx для обслуживания запросов).

Требования

Для выполнения руководства понадобится предварительно настроенный сервер FreeBSD 10.2. Все необходимые инструкции по настройке можно найти в руководстве «Начало работы с FreeBSD 10.1».

1: Создание и упаковка приложения Clojure

Сначала при помощи git загрузите образец приложения Clojure.

Обновите список пакетов и установите git:

sudo pkg update
sudo pkg install git

Клонируйте репозиторий проекта:

git clone https://github.com/do-community/do-clojure-web.git

Примечание: Создать такое приложение можно по этому руководству. При желании создайте приложение самостоятельно.

Для запуска кода Clojure использует JVM, потому проект должен быть настроен для использования этой виртуальной машины. Для этого можно использовать Leiningen – инструмент для обработки зависимостей и автоматизации сборки приложений Clojure. Чтобы установить Leiningen, введите:

sudo pkg install leiningen

На экране появится вывод, сообщающий о том, что Java требует несколько специальных точек монтирования для файловой системы. Об этом – в следующем разделе руководства. .

Скомпилируйте проект при помощи lein:

cd ~/do-clojure-web
lein uberjar

2: Настройка среды приложения Clojure

Для работы приложения необходимо установить три основных компонента окружения: Java, Supervisor и Nginx. Java была установлена ранее как часть установки Leiningen, осталось установить Supervisor и Nginx.

sudo pkg install nginx py27-supervisor

Как говорилось ранее, для работы Java необходимы точки монтирования файловой системы. Чтобы выполнить монтирование, запустите:

sudo mount -t fdescfs fdesc /dev/fd
sudo mount -t procfs proc /proc

Запуск этих команд можно автоматизировать, чтобы не запускать их вручную при каждой загрузке системы. Отредактируйте файл /etc/fstab.

sudo ee /etc/fstab

Добавьте в конец файла следующие записи:

fdesc   /dev/fd     fdescfs     rw  0   0
proc    /proc       procfs      rw  0   0

Также нужно подготовить место для хранения файлов приложения и логов Clojure. Для этого создайте структуру каталогов:

sudo mkdir -p /www/data/do-clojure-web/app/db/ /www/logs

Теперь можно переместить файлы и БД приложения Clojure в эти каталоги:

sudo cp ~/do-clojure-web/target/do-clojure-web-0.1.0-standalone.jar /www/data/do-clojure-web/app/
sudo cp ~/do-clojure-web/db/do-clojure-web.h2.db /www/data/do-clojure-web/app/db/

В системе приложение будет запущено как пользователь www; передайте этому пользователю все права на приложение.

sudo chown -R www /www/data/do-clojure-web/

Вернитесь в каталог приложения Clojure:

cd /www/data/do-clojure-web/app/

В среде производства версия приложения будет изменяться при каждом обновлении пакетов, это повлечёт за собой изменения конфигураций системы. Чтобы это предотвратить, создайте символьную ссылку на текущую версию приложения.

sudo ln -s do-clojure-web-0.1.0-standalone.jar do-clojure-web.jar

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

sudo java -jar do-clojure-web.jar

Примечание: Обязательно проверьте работу приложения, прежде чем продолжать.

Если всё работает как положено, на экране появится вывод:

. . .
2015-06-12 04:30:17.882:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
2015-06-12 04:30:17.995:INFO:oejs.AbstractConnector:Started SelectChannelConnector@127.0.0.1:5000

Чтобы остановить приложение, нажмите CTRL+C.

3: Настройка Supervisor

Существует несколько способов настройки приложения как сервиса; в данном случае для этого используется простой в обращении инструмент Supervisor.

Примечание: Сервис, требующий масштабирования, нужно настраивать согласно документации uWSGI для Clojure.

Создайте и отредактируйте файл /usr/local/etc/supervisord.conf.

sudo ee /usr/local/etc/supervisord.conf

Добавьте в конец файла такой код и сохраните его:

[program:do-clojure-web] command=/usr/local/bin/java -jar do-clojure-web.jar
directory=/www/data/do-clojure-web/app
user=www
autostart=true
autorestart=true
startretries=3
redirect_stderr=true
stdout_logfile=/www/logs/do-clojure-web.app.log

При помощи этих настроек демон (сервис) Supervisor запустит приложение из каталога /www/data/do-clojure-web/app/. Кроме того, он будет вносить данные в лог /www/logs/do-clojure-web.app.log и перезапускать приложение в случае сбоя.

4: Прокси-сервер Nginx

Веб-приложение Clojure принимает соединения только от локального хоста на порт 5000. Чтобы открыть внешний доступ к приложению, нужно настроить веб-сервер, например, Nginx. Также это поможет обслуживать статический контент после расширения приложения.

Отредактируйте файл /usr/local/etc/nginx/nginx.conf.

sudo ee /usr/local/etc/nginx/nginx.conf

Добавьте блок upstream, который настраивает бэк-энд (выделен красным).

. . .
#gzip  on;
upstream http_backend {
server 127.0.0.1:5000;
keepalive 32;
}
server {
listen       80;
server_name  localhost;
. . .

Затем найдите блок location / в блоке server, закомментируйте его (для этого нужно добавить символ # в начало каждой строки) и добавьте новый блок location (далее он выделен красным). После этого сервер Nginx будет слушать порт 80 и проксировать запросы на приложение Clojure.

. . .
server {
listen       80;
server_name  localhost;
#charset koi8-r;
#access_log  logs/host.access.log  main;
#location / {
#    root   /usr/local/www/nginx;
#    index  index.html index.htm;
#}
location / {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
access_log /www/logs/do-clojure-web.access.log;
error_log /www/logs/do-clojure-web.error.log;
}
#error_page  404              /404.html;
. . .

Сохраните и закройте файл.

5: Запуск сервиса. Проверка доступа

Теперь можно проверить, всё ли работает должным образом. Сначала нужно настроить автоматический запуск сервисов. Для этого отредактируйте /etc/rc.conf:

sudo ee /etc/rc.conf

Добавьте в файл следующий код:

nginx_enable="YES"
supervisord_enable="YES"

Сохраните и закройте файл.

Запустите демон Supervisor, чтобы запустить приложение Clojure.

sudo service supervisord start

Подождите около 30 секунд, а затем запустите прокси-сервер Nginx.

sudo service nginx start

Откройте в браузере ссылку:

http://your_server_ip

После этого сайт Clojure должен загрузиться.

Если вместо этого на экране появилась стандартная страница Nginx, попробуйте перезапустить Supervisor:

sudo service supervisord restart

подождать 30 секунд и перезапустить Nginx.

sudo service nginx restart

После загрузки сайта откройте ссылку Add a Location и попробуйте добавить пару координат, чтобы убедиться, что доступ к БД настроен правильно. К примеру, можно добавить 1 как x value и 2 как y value. После этого появится такой вывод:

Added [1, 2] (id: 1) to the db. See for yourself.

Чтобы просмотреть эту запись, кликните по ссылке View All Locations в верхней части экрана.

Заключение

Приложение Clojure можно очень быстро развернуть при помощи Leiningen, Supervisor и Nginx. Попробуйте создать и развернуть собственное приложение.

Tags: ,

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