Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Mongoid
/

サーバー構成のフォーク

このガイドでは、フォーク Webサーバー を使用するようにアプリケーションを構成する方法について学習できます。

フォーク ウェブサーバーで Mongoid を使用する場合は、次のガイドラインに従います。

  • 可能であれば、フォークする前に親プロセスでMongoDB操作を実行しないでください。

  • 次のアクションを実行することで、Mongo::Error::SocketErrorMongo::Error::NoServerAvailable などの接続エラーを回避できます。

    1. メソッドを使用して、フォークする前に親Rubyプロセス内のMongoDBクライアントを切断します。Mongoid.disconnect_clientsこれにより、親プロセスと子プロセスが誤って同じソケットを再利用したり、I/O 競合が発生したりすることがなくなります。 Mongoid.disconnect_clients は実行中のMongoDB操作を中断することがなく、新しい操作を実行すると自動的に再接続します。

    2. 子Rubyプロセス内のMongoDBクライアントは、フォーク後すぐに Mongoid.reconnect_clientsメソッドを使用して再接続します。これは、子プロセスでドライバーの監視スレッドを再生成するために必要です。

ほとんどのウェブ サーバーは、ワーカー プロセスがフォークされたときにアプリケーションがアクションを実行するために使用できるフックを提供しています。 次のセクションでは、一般的なRubyウェブ サーバーの構成例を示します。

ワーカー内のクライアントを再接続するには、on_worker_boot フックを使用します。before_fork フックと on_refork フックを使用して、親プロセス内のクライアントを閉じます。これらのフックの詳細については、Pma APIドキュメントの クラスターモードフック を参照してください。

次のコードでは、サンプルPume構成ファイルで on_worker_bootbefore_forkon_refork フックを使用します。

config/puma.rb
# 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

親プロセス内のクライアントを閉じるには、before_fork フックを使用します。 ワーカー内のクライアントを再接続するには、 after_fork フックを使用します。 これらのフックの詳細については、Unicode APIドキュメントの「 構成要素 」を参照してください。

次のコードでは、サンプルUnicode構成ファイルで before_fork フックと after_fork フックを使用します。

config/unicode.rb
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

戻る

クエリキャッシュミドルウェア

項目一覧