Гид по технологиям

Развёртывание Clojure веб‑приложения на Ubuntu 16.04 с Supervisor и Nginx

• 5 min read • DevOps • Обновлено 19 Nov 2025
Clojure: развернуть веб‑приложение на Ubuntu
Clojure: развернуть веб‑приложение на Ubuntu

Коротко о терминах

  • Clojure — функциональный язык для JVM. Простой для параллельного кода.
  • Leiningen — инструмент управления зависимостями и сборки Clojure‑проектов.
  • Supervisor — менеджер процессов для запуска приложений как сервиса.
  • Nginx — высокопроизводительный веб‑сервер и обратный прокси.

Требования

  • Сервер с Ubuntu 16.04.
  • Доступ root (или пользователь с sudo и настроенным паролем).

Важно: Ubuntu 16.04 устарела и не получает новых функций; для продакшена рассмотрите более свежую LTS‑версию (например, 18.04/20.04/22.04). Инструкции здесь адаптированы под 16.04, но общая логика применима и к другим версиям.

План работ (микро‑методология)

  1. Обновить систему и установить Java, git, curl.
  2. Установить Nginx и Supervisor.
  3. Клонировать репозиторий с примером.
  4. Установить Leiningen, собрать uberjar.
  5. Подготовить файловую структуру и права.
  6. Настроить Supervisor и Nginx.
  7. Перезагрузить сервисы и проверить работу.

Обновление системы

Перед началом рекомендуется обновить пакеты:

apt-get update -y  
apt-get upgrade -y

После обновления перезагрузите сервер, чтобы применить изменения:

reboot

Установка необходимых пакетов

Установите git, curl и Java (OpenJDK 8):

apt-get install git curl openjdk-8-jre-headless -y

Проверьте версию Java:

java -version

Ожидаемый пример вывода:

openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

Установка Nginx и Supervisor

В репозитории Ubuntu 16.04 доступны Nginx и Supervisor — установите их:

apt-get install nginx supervisor -y

Запустите сервисы и включите автозапуск при старте ОС:

systemctl start nginx  
systemctl start supervisor  
systemctl enable nginx  
systemctl enable supervisor

Загрузка примерного Clojure‑приложения

Склонируйте репозиторий с примером:

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

Leiningen — инструмент для сборки Clojure. Скачайте исполняемый скрипт lein:

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

Дайте права на исполнение:

chmod 755 /usr/bin/lein

Соберите uberjar проекта (внутри каталога проекта):

cd do-clojure-web  
lein uberjar

Примерный вывод сборки (сниппет):

WARNING: You're currently running as root; probably by accident.
Press control-C to abort or Enter to continue as root.
Set LEIN_ROOT to disable this warning.

Downloading Leiningen to /root/.lein/self-installs/leiningen-2.7.1-standalone.jar now...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   618    0   618    0     0    309      0 --:--:--  0:00:02 --:--:--   207
100 14.6M  100 14.6M    0     0   326k      0  0:00:46  0:00:46 --:--:--  279k
Retrieving lein-ring/lein-ring/0.8.13/lein-ring-0.8.13.pom from clojars
...

Если сборка прошла успешно, в каталоге target появится файл do-clojure-web-0.1.0-standalone.jar.

Подготовка окружения веб‑приложения

Создайте структуру директорий для размещения приложения:

mkdir -p /var/www/html/do-clojure-web/app/db

Скопируйте сгенерированный jar в директорию приложения:

cp /root/do-clojure-web/target/do-clojure-web-0.1.0-standalone.jar /var/www/html/do-clojure-web/app/

Установите владельца каталога на www-data (пользователь, под которым работает Nginx):

chown -R www-data:www-data /var/www/html/do-clojure-web/

Создайте символическую ссылку для удобства:

cd /var/www/html/do-clojure-web/app/  
ln -s do-clojure-web-0.1.0-standalone.jar do-clojure-web.jar

Запустите приложение вручную, чтобы убедиться, что оно стартует:

java -jar do-clojure-web.jar

Ожидаемый вывод сервера (пример):

2017-10-01 10:30:48.349:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
2017-10-01 10:30:48.590:INFO:oejs.AbstractConnector:Started [email protected]:5000

Если приложение слушает на localhost:5000, можно переходить к автоматизации через Supervisor.

Настройка Supervisor для управления приложением

Создайте конфигурацию Supervisor:

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/html/do-clojure-web/app
user=www-data
autostart=true
autorestart=true
startretries=3
redirect_stderr=true
stdout_logfile=/var/log/log/do-clojure-web.app.log

Сохраните файл и закройте редактор. Затем перечитайте конфигурацию Supervisor и перезапустите сервис:

supervisorctl reread
supervisorctl update
systemctl restart supervisor

Примечание: путь до лога /var/log/log/ должен существовать; создайте директорию, если необходимо и назначьте права:

mkdir -p /var/log/log
chown -R www-data:www-data /var/log/log

Настройка Nginx как обратного прокси

Откройте основной конфиг nginx для сайта по умолчанию:

nano /etc/nginx/sites-available/default

Измените конфигурацию на следующую, чтобы проксировать запросы к локальному приложению:

upstream http_backend {
    server 127.0.0.1:5000;
    keepalive 32;
}
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

    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/log/do-clojure-web.access.log;
        error_log /var/log/do-clojure-web.error.log;
    }
}

Сохраните и закройте файл, затем перезапустите Nginx и Supervisor:

systemctl restart nginx  
systemctl restart supervisor

Проверьте статус Supervisor и Nginx:

systemctl status supervisor

Пример успешного статуса Supervisor (сниппет):

? supervisor.service - Supervisor process control system for UNIX
   Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2017-10-02 10:19:32 EDT; 22min ago
     Docs: http://supervisord.org
 Main PID: 397 (supervisord)
    Tasks: 19 (limit: 4915)
   CGroup: /system.slice/supervisor.service
           ??397 /usr/bin/python /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
           ??446 /usr/bin/java -jar do-clojure-web.jar
systemctl status nginx

Пример вывода Nginx (сниппет):

? nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2017-10-02 10:19:35 EDT; 26min ago
     Docs: man:nginx(8)
  Process: 425 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 401 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 427 (nginx)

Доступ к приложению через браузер

Откройте в браузере URL http://your-ip-address — Nginx будет проксировать запросы на локальный порт 5000, где работает приложение.

Главная страница Clojure‑приложения

Кнопка Add Location откроет форму ввода координат:

Форма добавления локации

После отправки вы можете просмотреть добавленные локации:

Страница с результатами — список локаций

Типичные проблемы и способы их решения

  • Приложение не стартует под Supervisor: проверьте права на jar, путь в поле directory и user. Логи Supervisor и stdout_logfile подскажут причину.
  • Nginx возвращает 502 Bad Gateway: проверьте, слушает ли приложение порт 5000 на localhost (netstat или ss).
  • Проблемы с правами на директории /var/log/log или /var/www/html — убедитесь, что владелец и права установлены корректно.
  • Supervisor пишет «running as root» — укажите user в конфигурации программы (здесь использован www-data).

Безопасность и конфиденциальность

  • На продакшене не запускайте сервисы от root.
  • Закройте доступ к SSH ключам и ограничьте доступ к интерфейсам администратора.
  • Если приложение хранит личные данные, примените шифрование и уведомите пользователей в соответствии с местными требованиями по защите данных.

Рекомендации по жесткой настройке (hardening)

  • Используйте systemd unit вместо Supervisor, если хотите гибкую интеграцию с systemd‑логикой.
  • Включите HTTPS (Let’s Encrypt) на Nginx для защищённого доступа.
  • Настройте логротацию (logrotate) для /var/log/do-clojure-web. и /var/log/log/.

Роли и чек‑лист перед запуском (роли: разработчик, админ)

Разработчик:

  • Проверить сборку локально через lein uberjar.
  • Убедиться, что приложение слушает на 127.0.0.1:5000.

Системный администратор:

  • Выполнить обновление системы.
  • Установить Java, Nginx, Supervisor.
  • Настроить права на /var/www/html и /var/log.
  • Настроить Supervisor и Nginx, перезапустить сервисы.

Простое дерево решений для отладки

flowchart TD
  A[Не доступно через браузер] --> B{Приложение отвечает локально?}
  B -- Да --> C{Nginx запущен?}
  B -- Нет --> D[Запустить приложение вручную: java -jar do-clojure-web.jar]
  D --> E[Проверить логи приложения]
  C -- Да --> F[Проверить Nginx конфигурацию и логи]
  C -- Нет --> G[systemctl restart nginx]

Критерии приёмки

  • Приложение собирается с помощью lein uberjar без ошибок.
  • Supervisor запускает процесс под пользователем www-data и процесс остаётся в статусе RUNNING.
  • Nginx успешно проксирует HTTP‑запросы на локальный порт приложения, при обращении по http://your-ip-address появляется домашняя страница.

Когда этот подход не подходит

  • Если вы используете контейнеры (Docker, Kubernetes) — там предпочтительнее использовать контейнеризацию и orchestration.
  • Если приложение требует HTTPS, нагрузочного балансирования или автоматического масштабирования — добавьте соответствующие компоненты (certbot, LB, autoscale).

Вывод

Мы рассмотрели пошагово развёртывание простого Clojure‑веб‑приложения на Ubuntu 16.04 с использованием Leiningen для сборки, Supervisor для управления процессом и Nginx как обратного прокси. Следуйте чек‑листу перед запуском, настройте права и логи, и по возможности примените HTTPS и logrotate для продакшена. Если возникнут вопросы — опишите проблему и приложите логи, это ускорит ответ.

Важно: для новых проектов задумайтесь о переходе на более новую версию Ubuntu и использовании systemd‑юнитов или контейнеров, в зависимости от потребностей.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

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

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро