Статьи

Запуск Leiningen / Ring Webapp в качестве демона с помощью Upstart (Ubuntu)

Запуск приложения Java / Clojure в качестве демона в Linux раньше был сложным, но с Ubuntu Upstart  ( docs ) это довольно просто  . Короткая история:

  1. Создайте  универсальный  uberjar с помощью «производственного кольца lein с профилем uberjar» (с помощью  плагина lein-ring  ; простого приложения lein uberjar будет достаточно для приложения с  main- методом)
  2. Создайте файл upstart <имя службы> .conf в / etc / init /
  3. Запустите sudo start / stop / status <имя службы>

И, конечно, это работает и с Puppet.

Пример /etc/init/mongodiffer.conf

Пример файла конфигурации Upstart для службы mongodiffer:

## Upstart config file (use 'start mongodiffer', 'stop mongodiffer')
## Note: Stdout and stderr will be captured in /var/log/upstart/mongodiffer.log
## (aside of the native log in /var/log/mongodiffer.log)
author "Jakub Holy"
description "Start the MongoDiffer webapp on its default port (80)"
start on (local-filesystems and net-device-up IFACE!=lo)
# Note: "start on runlevel [2345]" would also do but I want to be explicit that
# running it w/o network is meaningless
# Must run as root to be able to run on port 80; ugly but quick
#setuid mongodiffer
#setgid mongodiffer
exec java -jar /srv/mongodiffer/clj-analytics-mongodiffer-standalone.jar
## TODO: Consider enabling respawning
# respawn
## Try to restart up to 10 times within 5 min:
# respawn limit 10 300

Единственными необходимыми « строфами » являются « start on » и « exec » (см. Также  Upstart для приложений Java ). Мы также могли бы включить  респаун  (оба раздела), чтобы Upstart попытался снова запустить сервис в случае сбоя. (Конечно, сервис Clojure никогда не вылетает  ;-) )

логирование

Я использую  tools.logging  с  logback  (ch.qos.logback / logback-classic) и его  RollingFileAppender  с  SizeAndTimeBasedFNATP,  чтобы сохранить журналы до разумного размера:

<configuration>
 
<appender name="FILE">
<file>/var/log/mongodiffer/mongodiffer.log</file>
<rollingPolicy>
<!-- rollover daily -->
<fileNamePattern>/var/log/mongodiffer/mongodiffer-%d{yyyy-MM}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy>
<!-- or whenever the file size reaches the size -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
 
<appender name="STDOUT">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
 
<root level="info">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" /> <!-- Useful when running locally/dev -->
</root>
</configuration>

Stdout и stderr службы автоматически записываются в /var/log/upstart/mongodiffer.log через раздел журнала консоли по умолчанию   . Я не смог выяснить, что делать, чтобы убедиться, что он не будет расти бесконечно.

Обслуживание статических ресурсов из Ring uberjar

  1. Поместите ресурсы в каталог ресурсов, например. ресурсы / статические / (=> например ресурсы / статические / js / zepto / zepto.min.js)
  2. Сконфигурируйте промежуточное ПО кольца wrap-resource: «(wrap-resource« static »)»
  3. Обратитесь к ресурсам, используя путь после статического (например, «/js/zepto/zepto.min.js»)