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