FreeBSD10.2にClojureWebアプリケーションをデプロイする方法
序章
関数型プログラミング、より具体的には、ClojureでのWeb用プログラミングについては引き続き関心が高まっています。 基本的なアプリケーションを構築する方法に関する多くのチュートリアルでは、デプロイメントの詳細を見落としがちです。 この記事では、ClojureWebアプリケーションをFreeBSD10.2Dropletにデプロイする方法を説明します。
具体的には、サンプルのClojureアプリケーションを作成して本番環境で使用するためにパッケージ化し、Supervisorを使用してアプリを実行し、Nginxを使用してサーバー上にClojureアプリ環境をセットアップしてリクエストを処理します。
前提条件
このガイドを開始する前に、次のものが必要です。
- 1つのFreeBSD10.2ドロップレット。オプションで、これらの命令でカスタマイズできます。
ステップ1—サンプルClojureアプリの作成とパッケージ化
最初のステップは、git
を使用して、Clojureプロジェクトの例を取得してデプロイすることです。
まず、パッケージを更新し、サーバーにgit
をインストールします。
- sudo pkg update
- sudo pkg install git
次に、サンプルプロジェクトリポジトリのクローンを作成します。
- git clone https://github.com/do-community/do-clojure-web.git
このリポジトリは、 Clojure Basic WebDevelopmentチュートリアルに従った最終結果です。 必要に応じて、このリポジトリのクローンを作成する代わりに、そのチュートリアルを自分で実行できます。
ClojureはJVMを利用してコードを実行するため、プロジェクトをコンパイルして実行する必要があります。 Clojureアプリの依存関係管理およびビルド自動化ツールであるLeiningenを使用すると、これが簡単になります。
Leiningenをインストールしましょう。
- sudo pkg install leiningen
Javaにはいくつかの特別なファイルシステムマウントポイントが必要であることを宣言する出力がいくつかあります。 これは次のステップで処理します。
これで、lein
を使用してサーバー上で実行するようにプロジェクトをコンパイルできます。
- cd ~/do-clojure-web
- lein uberjar
ステップ2—Clojureアプリケーション環境のセットアップ
このアプリケーションが正しく機能するには、Java、Supervisor、Nginxの3つの主要な要素が必要です。 最後のステップでLeiningenのインストールの一部としてJavaをインストールしたので、次に、SupervisorとNginxをインストールします。
- sudo pkg install nginx py27-supervisor
手順1で説明したように、Javaにはいくつかの特別なファイルシステムマウントポイントが必要です。 これらの2つのコマンドを実行して、それらがマウントされていることを確認します。
- sudo mount -t fdescfs fdesc /dev/fd
- sudo mount -t procfs proc /proc
システムが起動するたびにこれらのコマンドを実行するのではなく、自動的に実行します。 ee
またはお好みのテキストエディタを使用して/etc/fstab
ファイルを編集します。
- sudo ee /etc/fstab
/etc/fstab
ファイルの最後に次の2つのエントリがあることを確認してください。
fdesc /dev/fd fdescfs rw 0 0
proc /proc procfs rw 0 0
ClojureWebアプリケーションとそのログファイルも保管する場所が必要になります。 次に、そのディレクトリ構造を作成します。
- sudo mkdir -p /www/data/do-clojure-web/app/db/ /www/logs
これで、Clojureアプリケーションファイルとデータベースファイルを作成したディレクトリに移動できます。
- sudo cp ~/do-clojure-web/target/do-clojure-web-0.1.0-standalone.jar /www/data/do-clojure-web/app/
- sudo cp ~/do-clojure-web/db/do-clojure-web.h2.db /www/data/do-clojure-web/app/db/
アプリケーションはシステム上でユーザーwwwとして実行されるため、組み込みデータベースに書き込むことができます。 アプリケーションパスの所有者をwwwに設定します。
- sudo chown -R www /www/data/do-clojure-web/
Clojureアプリケーションディレクトリに移動します。
- cd /www/data/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アプリを実行するためのSupervisorの構成
アプリケーションをサービスとして管理するためのいくつかのオプションがあります。 本当にスケーリングが必要なサービスについては、Clojureアプリケーションの実行に関するuWSGIドキュメントを参照することをお勧めします。
/usr/local/etc/supervisord.conf
ファイルを作成して編集します。
- sudo ee /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
ファイルを編集します。
- sudo ee /usr/local/etc/nginx/nginx.conf
まず、ファイル内のserver
ブロックの上に、下に赤で強調表示されているupstream
ブロックを追加します。
. . .
#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アプリケーションにリクエストをプロキシするように指示されます。
. . .
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
ファイルを編集します。
- sudo ee /etc/rc.conf
/etc/rc.conf
ファイルの最後にこれらの2行を追加します。
nginx_enable="YES"
supervisord_enable="YES"
ファイルを保存して終了します。
先に進み、Supervisorデーモンを起動して、Clojureアプリケーションを起動します。
- sudo service supervisord start
起動するまで約30秒待ってから、NginxWebサーバーのフロントエンドプロキシを起動します。
- 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サイトやアプリケーションでさえも展開するというトピックについて学ぶことはたくさんあります。 次のステップは、このチュートリアルで使用されているデモアプリケーションではなく、カスタムアプリケーションをデプロイすることです。