18

Erlang/OTP アプリケーションを開発し、VPS で本番環境にデプロイしたいと考えています。

私はローカル マシンで Erlang コードを開発することにかなり精通しており、私の質問はデプロイに関するものです。

基本的に、Erlang コードをローカル マシンから本番サーバーに移動して実行する、つまりユーザーが利用できるようにするために必要な手順を知りたいと思います。

注: Erlang とコマンド ライン、Erlangコードモジュール、Erlangリリースに関するドキュメントをいくつか読みましたが、必要なタスクをどのように実行するかはまだわかりません。

sudo taskselただし、Erlang ベースのソフトウェアをサーバーにデプロイするのは、 LAMPの場合よりも少し難しいと思います。

Mochiweb、CouchDB ( couchbeam )、boss_dbを依存関係として持つ Erlang/OTP アプリケーションを用意する予定です。

したがって、本番サーバーにすべてのものをデプロイすることに関する私の初心者の質問は次のとおりです。

  • Ubuntu Server 12.04 を使用する予定です。本番環境で Erlang/OTP に使用する Linux ディストリビューションのより良い選択肢はありますか?
  • すべてのコードをどのように編成する必要がありますか? アプリケーションを /home/myapp/ ディレクトリに配置してから、すべての依存関係を /home/myapp/deps に配置する必要がありますか? それとも、すべての依存関係を /usr/local/lib/erlang/lib に入れる必要がありますか? (code:get_path() によって返されます)。どういうわけか依存関係を定期的に更新する必要がありますか、それとも凍結する必要がありますか?
  • サーバーの起動後にアプリケーション全体を起動するにはどうすればよいですか? それはある種のbashスクリプトか何かである必要がありますか?
  • Erlang でコードのホット アップグレードが可能であることは知っていますが、それをどのように整理すればよいでしょうか? Rails ではgitでコードを更新できましたが、Erlang の世界に同様のものはありますか?
4

2 に答える 2

12

依存関係には、内部と外部の 2 つのタイプがあります。正しい方法(tm)で実行したい場合は、作業に時間がかかります。

外部依存関係:

後者を最初に取り上げると、外部依存関係は、アプリケーションを実行する前に実行する必要がある他のものです。たとえば、PostgreSQL データベースや Riak クラスターなどです。それらについては、通常、Ubuntuを適切に起動させるために通常のものを使用するだけです。私はmonitこれらのタスクに使用して良い経験をしました:

http://mmonit.com/monit/

内部依存関係:

内部の依存関係については、プログラムをErlang VM 内のアプリケーションに配置する必要があります。これらには、外部依存関係のように、相互に依存関係があります。たとえば、メイン アプリケーションでは、開始する前にロガーを実行する必要がある場合があります。次に、リリースを作成します。リリースは、Erlang バイナリと必要なライブラリ/ビーム/アプリケーションをリリース ディレクトリにコピーし、自己完結型の Erlang システムを形成します。これには、アプリケーションを正しい順序で起動し、実行し続ける方法を示すブート スクリプトが含まれています。そのため、このリリースを tar ボール化し、サーバーにコピーしてから起動することができます。ここでは、いくつかの基本事項について説明します。

http://learnyousomeerlang.com/release-is-the-word

ただし、その前のアプリケーションに関する章もお読みください。また、リリースの構築を依頼することもできrebarます。reltoolこれは私が通常行うことです。

ホットアップグレード:

本番環境でホット アップグレードを処理するには、いくつかの方法があります。ビームをマシンに移動して展開し、シェルを取得して呼び出しl(Module)て実行中のシステムにロードできます。これは小さな修正に有効です。大規模で体系的なアップグレードの場合、サービスを停止することなく実行中のシステムをオンザフライでアップグレードするリリース アップグレードを実行できます。しかし、あなたのシステムがほとんど何も共有されていない場合、通常は価値がありません。代わりに、複数のマシンを用意して、それらを順番にアップグレードできます。

たとえば、マシンをアップグレードしてから HAProxy などのシステムを使用して、すべてのリクエストの 2% を新しいシステムに送信できます。次に、要求の負荷の重みを体系的に上げます。

于 2012-10-06T14:32:35.583 に答える
8

@I GIVE CRAP ANSWERS はかなり完全な要約を提供しましたが、モジュールのホット再コンパイルとリロードを自動化するのに役立つsyncの使用を導入せざるを得ないと感じています。

簡単な方法は、同期を rebar の依存関係として指定することです。その後、アップグレードをデプロイする準備ができたらsync:go()、Erlang ノードで実行できます。これにより、ファイルシステムの変更を監視する同期エンジンが開始されます。その後、git を使用してサーバーにプッシュできます。Sync はファイルの変更を認識し、それらを再コンパイルして、新しいビームを自動的にロードします。

sync:stop()次に、すぐに実行して、ファイルシステムの変更の監視を停止するようにシステムに指示できます (何らかの理由でソース ファイルが変更され、それが意図的でない場合に偶発的な再コンパイルを防ぐために、通常、ライブ サーバーで同期を実行し続けることはお勧めしません。

于 2012-10-07T01:10:59.850 に答える