Развёртывание веб-приложения Clojure на сервере FreeBSD 10.2
FreeBSD | Комментировать запись
Функциональное программирование (а в частности разработка в 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: Clojure, FreeBSD 10.2