Overview
このガイドでは、フォーク Webサーバー を使用するようにアプリケーションを構成する方法について学習できます。
フォーク ウェブサーバーで Mongoid を使用する場合は、次のガイドラインに従います。
可能であれば、フォークする前に親プロセスでMongoDB操作を実行しないでください。
次のアクションを実行することで、
Mongo::Error::SocketError
やMongo::Error::NoServerAvailable
などの接続エラーを回避できます。メソッドを使用して、フォークする前に親Rubyプロセス内のMongoDBクライアントを切断します。
Mongoid.disconnect_clients
これにより、親プロセスと子プロセスが誤って同じソケットを再利用したり、I/O 競合が発生したりすることがなくなります。Mongoid.disconnect_clients
は実行中のMongoDB操作を中断することがなく、新しい操作を実行すると自動的に再接続します。子Rubyプロセス内のMongoDBクライアントは、フォーク後すぐに
Mongoid.reconnect_clients
メソッドを使用して再接続します。これは、子プロセスでドライバーの監視スレッドを再生成するために必要です。
ほとんどのウェブ サーバーは、ワーカー プロセスがフォークされたときにアプリケーションがアクションを実行するために使用できるフックを提供しています。 次のセクションでは、一般的なRubyウェブ サーバーの構成例を示します。
Puma
ワーカー内のクライアントを再接続するには、on_worker_boot
フックを使用します。before_fork
フックと on_refork
フックを使用して、親プロセス内のクライアントを閉じます。これらのフックの詳細については、Pma APIドキュメントの クラスターモードフック を参照してください。
次のコードでは、サンプルPume構成ファイルで on_worker_boot
、before_fork
、on_refork
フックを使用します。
# Runs in the Puma master process before it forks a child worker. before_fork do Mongoid.disconnect_clients end # Required when using Puma's fork_worker option. Runs in the # child worker 0 process before it forks grandchild workers. on_refork do Mongoid.disconnect_clients end # Runs in each Puma child process after it forks from its parent. on_worker_boot do Mongoid.reconnect_clients end
Unicode
親プロセス内のクライアントを閉じるには、before_fork
フックを使用します。 ワーカー内のクライアントを再接続するには、 after_fork
フックを使用します。 これらのフックの詳細については、Unicode APIドキュメントの「 構成要素 」を参照してください。
次のコードでは、サンプルUnicode構成ファイルで before_fork
フックと after_fork
フックを使用します。
before_fork do |_server, _worker| Mongoid.disconnect_clients end after_fork do |_server, _worker| Mongoid.reconnect_clients end
乗用者
ワーカー内のクライアントを再接続するには、starting_worker_process
フックを使用します。 このフックの詳細については、 カスタマー ドキュメントの「 スマート ピアリング フック 」を参照してください。
注意
乗用者には、ワーカーがフォークされる前に親プロセスで呼び出されるフックがあります。
次のコードでは、starting_worker_process
フックを使用してクライアントを再接続します。
if defined?(PhusionPassenger) PhusionPassenger.on_event(:starting_worker_process) do |forked| Mongoid.reconnect_clients if forked end end