序章

関数型プログラミング、より具体的には、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.

前提条件

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

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

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

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

  1. sudo pkg update
  2. sudo pkg install git

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

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

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

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

Leiningenをインストールしましょう。

  1. sudo pkg install leiningen

Javaにはいくつかの特別なファイルシステムマウントポイントが必要であることを宣言する出力がいくつかあります。 これは次のステップで処理します。

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

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

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

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

  1. sudo pkg install nginx py27-supervisor

手順1で説明したように、Javaにはいくつかの特別なファイルシステムマウントポイントが必要です。 これらの2つのコマンドを実行して、それらがマウントされていることを確認します。

  1. sudo mount -t fdescfs fdesc /dev/fd
  2. sudo mount -t procfs proc /proc

システムが起動するたびにこれらのコマンドを実行するのではなく、自動的に実行します。 編集します /etc/fstab を使用してファイル ee またはお気に入りのテキストエディタ。

  1. sudo ee /etc/fstab

あなたの終わりを確認してください /etc/fstab ファイルには次の2つのエントリがあります。

/ etc / fstab
fdesc   /dev/fd     fdescfs     rw  0   0
proc    /proc       procfs      rw  0   0

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

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

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

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

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

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

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

  1. cd /www/data/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ドキュメントを参照することをお勧めします。

を作成および編集します /usr/local/etc/supervisord.conf ファイル。

  1. 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 ファイル。

  1. sudo ee /usr/local/etc/nginx/nginx.conf

まず、を追加します upstream ブロック、下、上に赤で強調表示 server すでにファイルにあるブロック。

/usr/local/etc/nginx/nginx.conf
. . .
    #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アプリケーションにリクエストをプロキシするように指示されます。

/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;
        #}

        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 ファイル。

  1. sudo ee /etc/rc.conf

これらの2行をの最後に追加します /etc/rc.conf ファイル。

/usr/local/etc/rc.conf
nginx_enable="YES"
supervisord_enable="YES"

ファイルを保存して終了します。

先に進み、Supervisorデーモンを起動して、Clojureアプリケーションを起動します。

  1. sudo service supervisord start

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

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