前書き
関数型プログラミング、より具体的にはClojureのWeb向けプログラミングに関心が高まっています。 基本的なアプリケーションの構築方法に関する多くのチュートリアルでは、多くの場合、展開の詳細を見落としています。 この記事では、Clojure WebアプリケーションをFreeBSD 10.2 Dropletにデプロイする方法を説明します。
具体的には、サンプルのClojureアプリケーションを作成して本番用にパッケージ化し、Supervisorを使用してサーバー上でClojureアプリ環境をセットアップし、アプリを実行してリクエストを処理するNginxを設定します。
前提条件
このガイドを始める前に、次のものが必要です。
-
オプションでhttps://www.digitalocean.com/community/tutorials/how-to-get-started-with-freebsd-10-1でカスタマイズできる1つのFreeBSD 10.2ドロップレット[これらの手順]
手順1-サンプルClojureアプリの作成とパッケージ化
最初のステップは、 `+ git +`を使用してサンプルのClojureプロジェクトを取得してデプロイすることです。
まず、パッケージを更新し、サーバーに `+ git +`をインストールします。
sudo pkg update
sudo pkg 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は、これを簡単にします。
ライニンゲンをインストールしましょう。
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
Javaでは、手順1で説明したように、いくつかの特別なファイルシステムマウントポイントが必要です。 これらの2つのコマンドを実行して、それらがマウントされていることを確認します。
sudo mount -t fdescfs fdesc /dev/fd
sudo mount -t procfs proc /proc
システムを起動するたびにこれらのコマンドを実行するのではなく、自動的に実行します。 `+ ee `またはお気に入りのテキストエディタを使用して、 ` / etc / fstab +`ファイルを編集します。
sudo ee /etc/fstab
`+ / etc / fstab +`ファイルの最後に次の2つのエントリがあることを確認してください。
/ etc / fstab
fdesc /dev/fd fdescfs rw 0 0
proc /proc procfs rw 0 0
Clojure Webアプリケーションとそのログファイルを保管する場所も必要です。 次にそのディレクトリ構造を作成します。
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アプリを実行するためのスーパーバイザーの構成
アプリケーションをサービスとして管理するためのいくつかのオプションがあります。 本当に拡張する必要があるサービスについては、Clojureアプリケーションの実行に関するhttp://uwsgi-docs.readthedocs.org/en/latest/Ring.html[uWSGI documentation]を参照することをお勧めします。
`+ / usr / local / etc / supervisord.conf +`ファイルを作成および編集します。
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 +`ファイルを編集します。
sudo ee /usr/local/etc/nginx/nginx.conf
最初に、下の赤で強調表示されている、ファイル内の既存の `+ server `ブロックの上に、 ` upstream`ブロックを追加します。
/usr/local/etc/nginx/nginx.conf
. . .
#gzip on;
server {
listen 80;
server_name localhost;
. . .
ここで、 `+ location / `で始まるブロックを見つけます( ` server `ブロック内)。 各行の先頭に「#」を追加して、その中のすべての行をコメントアウトし、赤で強調表示された新しい「 location / +」セクションを追加します。 これは、ポート80で通常のWebサーバーのようにリッスンし、リクエストをClojureアプリケーションにプロキシするようにNginxに指示します。
/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;
#error_page 404 /404.html;
. . .
ファイルを保存して終了します。
ステップ5-サービスの開始とアクセスのテスト
すべてのピースを起動し、物事が適切に機能していることを確認します。 最初のステップは、起動時にサービスが起動するように設定されていることを確認することです。
`+ / etc / rc.conf +`ファイルを編集します。
sudo ee /etc/rc.conf
これらの2行を `+ / etc / rc.conf +`ファイルの最後に追加します。
/usr/local/etc/rc.conf
nginx_enable="YES"
supervisord_enable="YES"
ファイルを保存して終了します。
先に進み、スーパーバイザーデーモンを起動して、Clojureアプリケーションを開始します。
sudo service supervisord start
起動するまで約30秒待ってから、Nginx Webサーバーフロントエンドプロキシを起動します。
sudo service nginx start
ブラウザで `+ http:// +`にアクセスします。 Clojureアプリケーションサイトのロード例が表示されます。
デフォルトのNginxページを取得している場合は、「+ sudo service Supervisord 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サイトやアプリケーションでさえもデプロイするというトピックについて、学ぶべきことがたくさんあります。 次のステップは、このチュートリアルで使用したデモアプリケーションではなく、カスタムアプリケーションをデプロイすることです。