FreeBSD10.2にClojureWebアプリケーションをデプロイする方法
序章
関数型プログラミング、より具体的には、ClojureでのWeb用プログラミングについては引き続き関心が高まっています。 基本的なアプリケーションを構築する方法に関する多くのチュートリアルでは、デプロイメントの詳細を見落としがちです。 This article will show you how to deploy a Clojure web application to a FreeBSD 10.2 server.
具体的には、サンプルのClojureアプリケーションを作成して本番環境で使用するためにパッケージ化し、Supervisorを使用してサーバー上にClojureアプリ環境をセットアップし、アプリを実行し、Nginxを使用してリクエストを処理します。
Note: As of July 1, 2022, DigitalOcean no longer supports FreeBSD Droplets through the Control Panel or API. However, you can still spin up FreeBSD Droplets using a custom image. Learn how to import a custom image to DigitalOcean by following our product documentation.
前提条件
このガイドを開始する前に、次のものが必要です。
- One FreeBSD 10.2 server, which you can optionally customize with these instructions
ステップ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
システムが起動するたびにこれらのコマンドを実行するのではなく、自動的に実行します。 編集します /etc/fstab
を使用してファイル ee
またはお気に入りのテキストエディタ。
- 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
まず、を追加します upstream
ブロック、下、上に赤で強調表示 server
すでにファイルにあるブロック。
. . .
#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
これらの2行をの最後に追加します /etc/rc.conf
ファイル。
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
、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サイトやアプリケーションでさえも展開するというトピックについて学ぶことはたくさんあります。 次のステップは、このチュートリアルで使用されているデモアプリケーションではなく、カスタムアプリケーションをデプロイすることです。