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
Pume のバージョンに対応するタブを選択します。
ワーカー プロセス内のクライアントを再接続するには、on_worker_boot フックを使用します。 before_fork フックと on_refork フックを使用して、親プロセス内のクライアントを閉じます。
次のコードでは、サンプル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 worker processes. 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
ワーカー プロセス内のクライアントを再接続するには、before_worker_boot フックを使用します。before_fork フックと before_refork フックを使用して、親プロセス内のクライアントを閉じます。これらのフックの詳細については、Puma APIドキュメントの クラスターモードフック を参照してください。
次のコードでは、サンプルPume構成ファイルで before_worker_boot、before_fork、before_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 worker processes. before_refork do Mongoid.disconnect_clients end # Runs in each Puma child process after it forks from its parent. before_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