Foreman-Webアプリケーションのプロセスマネージャー

プロセスに合わせてスケーリングするという考え方に基づいたWebアプリケーション開発モデルは、ますます一般的になっています。 最新のアプリケーションは、状態を保存しない実行中のプロセスのセットであり、それぞれが互いに分離されています。 このような各プロセスには独自のローカルポートが割り当てられます。これにより、サービスを透過的にエクスポートして、他の誰か、おそらくお互いに消費させることができます(たとえば、1つはユーザーからのHTTP要求を処理し、もう1つはゆっくりとURLを受け入れます)ただし、それらをダウンロードして変換してください)。 原則として、ほとんどの場合、httpサービスはnginxのリバースプロキシ用に設定されるだけですが、オプションは可能です。



各開発者が自分のツールを持っているのは秘密ではありません。 今日は、フォアマンのようなツールについてお話します。 これを使用すると、アプリケーションの実行に必要なすべてのプロセスを1か所で宣言できます。 これを行うには、次のようないわゆるProcfileを使用します。



web: mono ./awesome-app --port $PORT api: node ./api.js -p $PORT worker: bundle exec rake resque:work QUEUE=* habr: bundle exec ./bin/thin -a localhost -p $PORT
      
      





ご覧のとおり、すべてが非常に単純です。ファイルの各行には、プロセスタイプの名前とそれを開始する行が含まれています。



インストールと使用



使用を開始するには、システムパッケージマネージャーまたはrubygemsを使用してインストールします。



 $ gem install foreman
      
      





アプリケーションでForemanを使用している場合、それを起動すると、既製のProcfileがあれば、非常に簡単に見えます。



 $ editor .env $ foreman start
      
      





すべてのプロセスの起動は次のようになります。







Foremanは、必要な環境変数を設定し、アプリケーションに関連付けられているすべてのプロセスを開始し、それぞれの標準スレッド(stdoutおよびstderr)の出力も表示します。 ご覧のとおり、プロセスの名前はさまざまな色でペイントされているため、視覚的に区別できます。 $PORT



変数の値は、実行中のプロセスごとにForemanによって個別に自動的に設定されます。



この場合、Foremanは開始停止のサイクルを制御できないため、プロセス自体を悪魔にしないでください。



展開



Foremanは、スタートアップタスクをupstartにエクスポートできるだけでなく、従来のUnix init (ただし、これは推奨されません)、 bluepillrunitsupervisordエクスポートできます。 Systemdのサポートも進行中です。



新興企業にエクスポート



 $ foreman export upstart /etc/init [foreman export] writing: /etc/init/testapp.conf [foreman export] writing: /etc/init/testapp-web.conf [foreman export] writing: /etc/init/testapp-web-1.conf [foreman export] writing: /etc/init/testapp-worker.conf [foreman export] writing: /etc/init/testapp-worker-1.conf [foreman export] writing: /etc/init/testapp-habr.conf [foreman export] writing: /etc/init/testapp-habr-1.conf
      
      





upstartにエクスポートすると、次のコマンドが使用可能になります。



 $ start testapp $ stop testapp-habr $ restart testapp-worker-1
      
      





inittabにエクスポート



 $ foreman export inittab # ----- foreman testapp processes ----- TE01:4:respawn:/bin/su - testapp -c 'PORT=5000 mono ./awesome-app --port $PORT >> /var/log/testapp/web-1.log 2>&1' TE02:4:respawn:/bin/su - testapp -c 'PORT=5100 bundle exec rake resque:work QUEUE=* >> /var/log/testapp/worker-1.log 2>&1' TE03:4:respawn:/bin/su - testapp -c 'PORT=5200 bundle exec ./bin/thin -a localhost -p $PORT >> /var/log/testapp/habr-1.log 2>&1' # ----- end foreman testapp processes -----
      
      







機能



並行性





Foremanを使用すると、プロセスの各タイプの実行中のインスタンスの数を制御できます。これは、プロセスを使用したスケーリングの考え方を反映しています。 ところで、このアプローチはすでにHerokuユーザーに好まれています。


 #      «worker»,   «habr»   «web» $ foreman start -c habr=4 -c web=2
      
      





 #   ,   ,    upstart $ foreman export upstart /etc/init -c habr=4 -c web=2
      
      





 #    «worker» $ foreman start -c worker=0
      
      





環境変数



開発者の間で徐々に人気が高まっているアプローチがあります。これは、環境変数にアプリケーション構成を保存することから成ります。 ここの職長は脇に立ちませんでしたし、すべてを簡素化することができます。



この機能を使用するには、プロジェクトディレクトリで、環境変数のすべての必要な値の列挙を含む.env



ファイルを作成する必要があります。次に例を示します。



 APP_ENV=production DATABASE_URL=mysql://user:password@localhost/table
      
      





バージョン管理システムにsample.env



ファイルを作成して登録することをおsample.env



ます。これには、アプリケーションの設定例が含まれます。 したがって、新しい環境にデプロイするには、 .env



ファイルを.env



にコピーし、環境に応じて編集してから、Foremanを実行する必要があります。



Foremanに、別のファイルの環境変数を使用してプロセスを開始するように依頼することもできます。



 $ foreman start -e development.env
      
      





ポート割り当て



デフォルトでは、Foremanは5000から始まるプロセスにポートを割り当て、Procfileにリストされている順序で、プロセスのタイプごとに100のブロックで割り当てます。



上記の例のProcfileの場合、web.1プロセスは5000番目のポート、worker.1は5100番目、habr.1は5200番目のポートを受け取ります。 2つのhabrプロセスを開始する場合、ポート番号5201がプロセスhabr.2に割り当てられます。



たとえば、開始ポートを手動で選択することもできます。



 $ foreman start -p 7000
      
      







結論



ご覧のとおり、このような優れたプラクティスを使用することで複雑なことはまったくありません。今回は、高度な開発者の武器になるのに十分な時間を節約できます。



利用可能なすべての機能の詳細については、 ドキュメント 、およびgithubのプロジェクトリポジトリページを参照できます。



All Articles