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

Функциональное программирование, и в частности разработка в Clojure, сегодня пользуются широкой популярностью. Данное руководство поможет развернуть приложение Clojure на сервере Ubuntu 14.04. Оно охватывает следующие этапы:

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

Требования

Для выполнения руководства понадобится:

  • Предварительно настроенный сервер Ubuntu 14.04.
  • Не-root пользователь с правами sudo (о создании такого пользователя можно прочесть здесь).

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

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

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

sudo apt-get update
sudo apt-get install git

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

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

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

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

Сначала установите Java:

sudo apt-get install openjdk-7-jre-headless

Затем загрузите установочный скрипт Leiningen. Система Ubuntu предоставляет пакет Leiningen, но он очень устарел.

sudo curl https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein -o /usr/local/bin/lein

Измените права на пакет, чтобы все пользователи получили доступ к утилите lein, предоставляемой инструментом Leiningen.

sudo chmod a+x /usr/local/bin/lein

Теперь можно скомпилировать проект при помощи lein:

cd ~/do-clojure-web
lein uberjar

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

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

sudo apt-get install nginx supervisor

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

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

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

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

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

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

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

cd /var/www/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.

Создайте и отредактируйте файл /etc/supervisor/conf.d/do-clojure-web.conf:

sudo nano /etc/supervisor/conf.d/do-clojure-web.conf

Добавьте в него такой код:

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

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

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

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

Отредактируйте файл /etc/nginx/sites-available/default:

sudo nano /etc/nginx/sites-available/default

Добавьте в этот файл выделенный красным блок кода, который настраивает бэк-энд:

. . .
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##
upstream http_backend {
server 127.0.0.1:5000;
keepalive 32;
}
server {
listen 80 default_server;
. . .

Затем найдите блок location / и закомментируйте его (для этого нужно добавить символ # в начало каждой строки):

. . .
# Make site accessible from http://localhost/
server_name localhost;
# location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
# }
# Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
. . .

Сразу после этого блока добавьте следующий раздел, который настраивает Nginx для прослушивания порта 80 и проксирования запросов приложению Clojure.

. . .
# Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
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 /var/www/logs/do-clojure-web.access.log;
error_log /var/www/logs/do-clojure-web.error.log;
}
#location /RequestDenied {
#       proxy_pass http://127.0.0.1:8080;
#}

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

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

sudo service supervisor start

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

sudo service nginx start

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

http://your_server_ip

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

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

sudo service supervisor 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: , , ,

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