序章

関数型プログラミング、より具体的には、ClojureでのWeb用プログラミングについては引き続き関心が高まっています。 基本的なアプリケーションを構築する方法に関する多くのチュートリアルでは、デプロイメントの詳細を見落としがちです。 この記事では、ClojureWebアプリケーションをFreeBSD10.2Dropletにデプロイする方法を説明します。

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

前提条件

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

  • 1つのFreeBSD10.2ドロップレット。オプションで、これらの命令でカスタマイズできます。

ステップ1—サンプルClojureアプリの作成とパッケージ化

最初のステップは、gitを使用して、Clojureプロジェクトの例を取得してデプロイすることです。

まず、パッケージを更新し、サーバーにgitをインストールします。

  1. sudo pkg update
  2. sudo pkg install git

次に、サンプルプロジェクトリポジトリのクローンを作成します。

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

このリポジトリは、 Clojure Basic WebDevelopmentチュートリアルに従った最終結果です。 必要に応じて、このリポジトリのクローンを作成する代わりに、そのチュートリアルを自分で実行できます。

ClojureはJVMを利用してコードを実行するため、プロジェクトをコンパイルして実行する必要があります。 Clojureアプリの依存関係管理およびビルド自動化ツールであるLeiningenを使用すると、これが簡単になります。

Leiningenをインストールしましょう。

  1. sudo pkg install leiningen

Javaにはいくつかの特別なファイルシステムマウントポイントが必要であることを宣言する出力がいくつかあります。 これは次のステップで処理します。

これで、leinを使用してサーバー上で実行するようにプロジェクトをコンパイルできます。

  1. cd ~/do-clojure-web
  2. lein uberjar

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

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

  1. sudo pkg install nginx py27-supervisor

手順1で説明したように、Javaにはいくつかの特別なファイルシステムマウントポイントが必要です。 これらの2つのコマンドを実行して、それらがマウントされていることを確認します。

  1. sudo mount -t fdescfs fdesc /dev/fd
  2. sudo mount -t procfs proc /proc

システムが起動するたびにこれらのコマンドを実行するのではなく、自動的に実行します。 eeまたはお好みのテキストエディタを使用して/etc/fstabファイルを編集します。

  1. sudo ee /etc/fstab

/etc/fstabファイルの最後に次の2つのエントリがあることを確認してください。

/ etc / fstab
fdesc   /dev/fd     fdescfs     rw  0   0
proc    /proc       procfs      rw  0   0

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

  1. sudo mkdir -p /www/data/do-clojure-web/app/db/ /www/logs

これで、Clojureアプリケーションファイルとデータベースファイルを作成したディレクトリに移動できます。

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

アプリケーションはシステム上でユーザーwwwとして実行されるため、組み込みデータベースに書き込むことができます。 アプリケーションパスの所有者をwwwに設定します。

  1. sudo chown -R www /www/data/do-clojure-web/

Clojureアプリケーションディレクトリに移動します。

  1. cd /www/data/do-clojure-web/app/

実稼働環境では、アプリケーションのバージョン番号は更新のたびに変更されます。 発生するたびにシステム構成を更新する必要はありません。 これを防ぐには、現在実行中のバージョンのアプリケーションへのシンボリックリンクを作成します。 次の手順でシンボリックリンクを参照します。

  1. sudo ln -s do-clojure-web-0.1.0-standalone.jar do-clojure-web.jar

アプリケーションは現在、ローカルホスト経由でのみアクセスできるように構成されていますが、エラーなしで起動することを確認できます。 先に進む前にそれを行ってください。

  1. 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アプリを実行するためのSupervisorの構成

アプリケーションをサービスとして管理するためのいくつかのオプションがあります。 本当にスケーリングが必要なサービスについては、Clojureアプリケーションの実行に関するuWSGIドキュメントを参照することをお勧めします。

/usr/local/etc/supervisord.confファイルを作成して編集します。

  1. sudo ee /usr/local/etc/supervisord.conf

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

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

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

ステップ4—Nginxをプロキシサーバーとして構成する

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

/usr/local/etc/nginx/nginx.confファイルを編集します。

  1. sudo ee /usr/local/etc/nginx/nginx.conf

まず、ファイル内のserverブロックの上に、下に赤で強調表示されているupstreamブロックを追加します。

/usr/local/etc/nginx/nginx.conf
. . .
    #gzip  on;
    
    upstream http_backend {
        server 127.0.0.1:5000;
        keepalive 32;
    }

    server {
            listen       80;
            server_name  localhost;
. . .

次に、location /で始まるブロックを見つけます(serverブロック内)。 各行の先頭に#を追加してその中のすべての行をコメント化し、赤で強調表示された新しいlocation /セクションを追加します。 これにより、Nginxはポート80で通常のWebサーバーのようにリッスンし、Clojureアプリケーションにリクエストをプロキシするように指示されます。

/usr/local/etc/nginx/nginx.conf
. . .
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #location / {
        #    root   /usr/local/www/nginx;
        #    index  index.html index.htm;
        #}

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

        #error_page  404              /404.html;
. . .

ファイルを保存して終了します。

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

すべてのピースを起動し、物事が適切に機能していることを確認する時が来ました。 最初のステップは、サービスが起動時に起動するように構成されていることを確認することです。

/etc/rc.confファイルを編集します。

  1. sudo ee /etc/rc.conf

/etc/rc.confファイルの最後にこれらの2行を追加します。

/usr/local/etc/rc.conf
nginx_enable="YES"
supervisord_enable="YES"

ファイルを保存して終了します。

先に進み、Supervisorデーモンを起動して、Clojureアプリケーションを起動します。

  1. sudo service supervisord start

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

  1. sudo service nginx start

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

デフォルトのNginxページを取得している場合は、sudo service supervisord restartでSupervisorを再起動し、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サイトやアプリケーションでさえも展開するというトピックについて学ぶことはたくさんあります。 次のステップは、このチュートリアルで使用されているデモアプリケーションではなく、カスタムアプリケーションをデプロイすることです。