開発者ドキュメント

Ubuntu14.04にClojureWebアプリケーションをデプロイする方法

序章

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

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

前提条件

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

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

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

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

  1. sudo apt-get update
  2. sudo apt-get install git

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

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

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

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

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

  1. 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ユーティリティを使用できるように権限を設定します。

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

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

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

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

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

  1. sudo apt-get install nginx supervisor

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

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

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

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

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

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

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

  1. cd /var/www/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 SelectChannelConnector@127.0.0.1:5000

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

ステップ3—Clojureアプリを実行するためのSupervisorの構成

アプリケーションをサービスとして管理するためのいくつかのオプションがあります。 ここで使用するオプションは、スーパーバイザーと呼ばれます。 単純なスクリプトよりも管理が簡単で、用途が広いです。 ただし、実際にスケーリングする必要があるサービスについては、Clojureアプリケーションの実行に関するuWSGIドキュメントを確認してください。

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

  1. 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ファイルを編集します。

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

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

/ 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 /で始まるブロックを見つけます。 各行の先頭に#を追加して、その中のすべての行をコメント化します。

/ 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 / {
        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アプリケーションを起動します。

  1. sudo service supervisor start

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

  1. sudo service nginx start

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

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

モバイルバージョンを終了