VII. ポートバインディング
ポートバインディングを通してサービスを公開する
WebアプリケーションはWebサーバーコンテナの内部で実行されることがある。例えば、PHPアプリケーションはApache HTTPD内部のモジュールとして実行されるかもしれないし、JavaアプリケーションはTomcatの内部で実行されるかもしれない。
Twelve-Factor Appは完全に自己完結 し、Webに公開されるサービスを作成するために、コンテナが実行環境にWebサーバーランタイムを注入することを頼りにしない。Webアプリケーションは ポートにバインドすることでHTTPをサービスとして公開し、 そのポートにリクエストが来るのを待つ。
ローカルの開発環境では、開発者はアプリケーションによって公開されたサービスにアクセスするために、http://localhost:5000/
のようなサービスのURLにアクセスする。本番環境ではルーティング層が、外向きのホスト名からポートにバインドされたWebプロセスへとリクエストをルーティングする。
これは一般に、依存関係宣言を使ってWebサーバーライブラリをアプリケーションに追加することで実装される。Webサーバーライブラリの例として、PythonにおけるTornado、RubyにおけるThin、Javaやその他のJVMベースの言語におけるJettyなどがある。これは ユーザー空間 すなわちアプリケーションのコード内で完結する。リクエストを処理するための実行環境との契約は、ポートをバインドすることである。
ポートバインディングによって公開されるサービスはHTTPだけではない。ほぼすべてのサーバーソフトウェアは、ポートをバインドするプロセスを用いて動作し、リクエストが来るのを待つ。例として、ejabberd(XMPPを話す)や Redis(Redisプロトコルを話す)などがある。
ここで注目すべきは、ポートバインディングの方法によって、あるアプリケーションが他のアプリケーションにとってのバックエンドサービスになれる点である。バックエンドアプリケーションへのURLを提供し、利用するアプリケーションの設定にリソースハンドルとして格納すればよい。