Вступление
Интерес к функциональному программированию и, в частности, программированию для Интернета в Clojure продолжает расти. Многие учебные пособия по созданию базовых приложений часто упускают из виду детали развертывания. Эта статья покажет вам, как развернуть веб-приложение Clojure в FreeBSD 10.2 Droplet.
В частности, мы создадим пример приложения Clojure и упакуем его для производственного использования, а также настроим среду приложения Clojure на сервере, используя Supervisor для запуска приложения и Nginx для обслуживания запросов к нему.
Предпосылки
Прежде чем начать это руководство, вам потребуется следующее:
-
Одна капля FreeBSD 10.2, которую вы можете по желанию настроить с помощью these инструкций
Шаг 1. Создание и упаковка образца приложения Clojure
Самый первый шаг - использовать + git +
для захвата примера проекта Clojure для развертывания.
Сначала обновите ваши пакеты и установите + git +
на сервер.
sudo pkg update
sudo pkg install git
Затем клонируйте репозиторий образцов проекта.
git clone https://github.com/do-community/do-clojure-web.git
Этот репозиторий является конечным результатом следования учебнику Clojure Basic Web Development. Если вам нравится, вместо того, чтобы клонировать этот репозиторий, вы можете самостоятельно следовать этому руководству.
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 требует пары специальных точек монтирования файловой системы, как указано в шаге 1. Запустите эти две команды, чтобы убедиться, что они смонтированы.
sudo mount -t fdescfs fdesc /dev/fd
sudo mount -t procfs proc /proc
Вместо того, чтобы выполнять эти команды каждый раз при загрузке системы, мы сделаем это автоматически. Отредактируйте файл + / etc / fstab +
, используя + ee +
или ваш любимый текстовый редактор.
sudo ee /etc/fstab
Убедитесь, что в конце вашего файла + / etc / fstab +
есть следующие две записи.
/ И т.д. / 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 * в системе, чтобы оно могло писать в нашу встроенную базу данных. Установите для владельца пути приложения значение * 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
Приложение в настоящее время настроено на доступ только через localhost, но вы все равно можете убедиться, что оно запускается без ошибок. Сделайте это, прежде чем двигаться дальше.
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 [email protected]:5000
Чтобы остановить приложение, нажмите комбинацию клавиш + CTRL + C +
.
Шаг 3 - Настройка Supervisor для запуска приложения Clojure
Есть несколько вариантов управления вашим приложением как сервисом. Для службы, которая действительно нуждается в масштабировании, я рекомендую взглянуть на uWSGI документацию по запуску приложения Clojure.
Создайте и отредактируйте файл + / usr / local / etc / supervisord.conf +
.
sudo ee /usr/local/etc/supervisord.conf
Добавьте эту конфигурацию в самый конец файла и сохраните ее.
/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
, выделенный красным цветом ниже, над блоком` + server + `, который уже находится в файле.
/usr/local/etc/nginx/nginx.conf
. . .
#gzip on;
server {
listen 80;
server_name localhost;
. . .
Теперь найдите блок, который начинается с + location / +
(внутри блока + server +
). Закомментируйте все строки в нем, добавив + # +
в начале каждой строки и добавьте в новый раздел + location / +
, выделенный красным. Это говорит Nginx прослушивать как обычный веб-сервер на порту 80 и передавать ваши запросы в приложение Clojure.
/usr/local/etc/nginx/nginx.conf
. . .
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;
#error_page 404 /404.html;
. . .
Сохраните и выйдите из файла.
Шаг 5 - Запуск сервисов и тестирование доступа
Пришло время запустить все части и убедиться, что все работает правильно. Первый шаг - убедиться, что ваши службы настроены на загрузку.
Отредактируйте файл + / etc / rc.conf +
.
sudo ee /etc/rc.conf
Добавьте эти две строки в конец файла + / etc / rc.conf +
.
/usr/local/etc/rc.conf
nginx_enable="YES"
supervisord_enable="YES"
Сохраните и выйдите из файла.
Запустите демон Supervisor, чтобы запустить приложение Clojure.
sudo service supervisord start
Подождите около 30 секунд, пока он запустится, а затем запустите интерфейсный прокси-сервер веб-сервера Nginx.
sudo service nginx start
Посетите + http: // +
в вашем браузере. Вы должны увидеть пример загрузки сайта приложения Clojure.
Если вы просто получаете страницу Nginx по умолчанию, попробуйте перезапустить Supervisor с помощью + sudo service supervisord restart +
, подождать 30 секунд и перезапустить Nginx с помощью + sudo service nginx restart +
.
Как только сайт загрузится, нажмите на ссылку * Добавить местоположение * в верхней части экрана и попробуйте добавить несколько числовых координат, чтобы убедиться, что ваши права доступа к базе данных верны. Например, вы можете добавить 1 для * x value * и 2 для * y value *. Это должно привести вас к странице, которая говорит:
добавление местоположения
Added [1, 2] (id: 1) to the db. See for yourself.
Если вы нажмете на ссылку «Просмотреть все местоположения» в верхней части экрана, вы увидите таблицу с новой записью.
Заключение
Вы только что развернули приложение Clojure, используя Leiningen, Supervisor и Nginx! По теме развертывания даже самых простых веб-сайтов и приложений можно многому научиться. Следующим шагом является развертывание пользовательского приложения вместо демонстрационного приложения, используемого в этом руководстве.