前書き

関数型プログラミング、より具体的にはClojureのWeb向けプログラミングに関心が高まっています。 基本的なアプリケーションの構築方法に関する多くのチュートリアルでは、多くの場合、展開の詳細を見落としています。 この記事では、Clojure WebアプリケーションをUbuntu 14.04ドロップレットにデプロイする方法を説明します。

具体的には、サンプルのClojureアプリケーションを作成して本番用にパッケージ化し、Supervisorを使用してサーバー上でClojureアプリ環境をセットアップし、アプリを実行してリクエストを処理するNginxを設定します。

前提条件

このガイドを始める前に、次のものが必要です。

  • Ubuntu 14.04ドロップレット1つ

  • サーバー上のsudoアクセスを持つ非ルートユーザーアカウント。https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 [これらの手順に従って設定できます]

手順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

このリポジトリは、http://clojure-doc.org/articles/tutorials/basic_web_development.html [Clojure Basic Web Development]チュートリアルの最終結果です。 必要に応じて、このリポジトリのクローンを作成する代わりに、そのチュートリアルを自分で実行できます。

Clojureはhttps://en.wikipedia.org/wiki/Java_virtual_machine[JVM]を利用してコードを実行するため、プロジェクトをコンパイルして実行する必要があります。 Clojureアプリの依存関係管理およびビルド自動化ツールであるLeiningenは、これを簡単にします。 ライニンゲンをセットアップするには、いくつかの手順があります。

まず、Javaをインストールします。

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

次に、Leiningenインストールスクリプトをダウンロードします。 Leiningen用のUbuntuパッケージがありますが、非常に古いものです。

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

Leiningenが提供する「+ lein +」ユーティリティをすべてのユーザーが使用できるように権限を設定します。

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

これで、プロジェクトをコンパイルして、 `+ lein +`でサーバー上で実行できます。

cd ~/do-clojure-web
lein uberjar

ステップ2-Clojureアプリケーション環境のセットアップ

このアプリケーションが正しく機能するためには、Java、Supervisor、およびNginxの3つの主要部分が必要です。 最後のステップでJavaをインストールしたので、次に、SupervisorとNginxをインストールします。

sudo apt-get install nginx supervisor

Clojure Webアプリケーションとそのログファイルを保管する場所も必要です。 次にそのディレクトリ構造を作成します。

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 として実行されるため、組み込みデータベースに書き込むことができます。 アプリケーションパスの所有者を 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 [email protected]:5000

キーの組み合わせ `+ CTRL + C +`を押して、今のところアプリケーションを停止します。

手順3-Clojureアプリを実行するためのスーパーバイザーの構成

アプリケーションをサービスとして管理するためのいくつかのオプションがあります。 ここで使用するオプションはhttps://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps[Supervisor]と呼ばれます。シンプルなスクリプトよりも管理が簡単で、より汎用性があります。 ただし、本当に拡張する必要があるサービスについては、Clojureアプリケーションの実行に関するhttp://uwsgi-docs.readthedocs.org/en/latest/Ring.html[uWSGI documentation]を確認してください。

`+ / etc / supervisor / conf.d / do-clojure-web.conf +`ファイルを作成して編集します。

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

この構成をファイルに追加して保存します。

/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

この構成は非常に簡単です。 スーパーバイザーデーモン(サービス)は、 `+ / var / www / do-clojure-web / app `ディレクトリ内からアプリケーションを実行します。 また、 ` / var / www / logs / do-clojure-web.app.log +`にログを記録し、クラッシュした場合はアプリケーションの再起動を試みます。

手順4-Nginxをプロキシサーバーとして構成する

Clojure Webアプリケーションは、ポート5000のローカルホストからの接続のみを受け入れるため、外部アクセスを提供するには、NginxなどのWebサーバーをその前に配置する必要があります。 これは、アプリケーションを展開するときに静的アセットを提供する場合にも非常に便利です。

`+ / etc / nginx / sites-available / default +`ファイルを編集します。

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

赤で強調表示されたセクションをファイルに追加します。 これにより、次の構成セクションで簡単に参照できるようにバックエンドが定義されます。

/ etc / nginx / sites-available / default

. . .
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##




server {
   listen 80 default_server;
. . .

ここで、 `+ location / `で始まるブロックを見つけます。 各行の先頭に「#+」を追加して、その中のすべての行をコメント化します。

/ etc / nginx / sites-available / default

. . .
       # 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で通常のWebサーバーのようにリッスンし、Clojureアプリケーションにリクエストをプロキシするように指示されます。

/ etc / nginx / sites-available / default

. . .

       # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests














       #location /RequestDenied {
       #       proxy_pass http://127.0.0.1:8080;
       #}

ステップ5-サービスの開始とアクセスのテスト

すべてのピースを起動し、物事が適切に機能していることを確認します。 先に進み、スーパーバイザーデーモンを起動して、Clojureアプリケーションを開始します。

sudo service supervisor start

起動するまで約30秒待ってから、Nginx Webサーバーフロントエンドプロキシを起動します。

sudo service nginx start

ブラウザで `+ http:// +`にアクセスします。 Clojureアプリケーションサイトのロード例が表示されます。

デフォルトのNginxページを取得している場合は、「+ sudo service Supervisor restart 」でスーパーバイザーを再起動し、30秒待ってから、「 sudo service nginx restart +」でNginxを再起動してください。

サイトが読み込まれたら、画面の上部にある*場所を追加*リンクをクリックし、いくつかの数値座標を追加して、データベースアクセス許可が正しいことを確認します。 たとえば、* x値*に1を追加し、* y値*に2を追加できます。 これにより、次のようなページが表示されます。

追加場所の出力

Added [1, 2] (id: 1) to the db. See for yourself.

画面上部の[すべての場所を表示]リンクをクリックすると、新しいエントリが記載された表が表示されます。

結論

Leiningen、Supervisor、およびNginxを使用してClojureアプリケーションをデプロイしました! 最も単純なWebサイトやアプリケーションでさえもデプロイするというトピックについて、学ぶべきことがたくさんあります。 次のステップは、このチュートリアルで使用したデモアプリケーションではなく、カスタムアプリケーションをデプロイすることです。