序章

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

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

前提条件

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

  • 1つのUbuntu14.04ドロップレット
  • サーバー上でsudoアクセス権を持つ非rootユーザーアカウント。これらの手順に従って設定できます。

ステップ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

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

  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 [email protected]: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、30秒待ってから、Nginxを再起動します sudo service nginx restart.

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

追加場所の出力
Added [1, 2] (id: 1) to the db. See for yourself.

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

結論

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