포크 서버 구성
개요
이 가이드 에서는 포크 웹 서버 사용하도록 애플리케이션 구성하는 방법을 학습 수 있습니다.
포크 웹 서버 와 함께 Mongoid를 사용할 때는 다음 지침을 따르세요.
가능하면 포크하기 전에 상위 프로세스 에서 MongoDB 작업을 수행하지 마세요. Ruby 운전자 포크를 처리하는 방법에 대해 자세히 학습 운전자 설명서에서 포크 서버와 함께 사용을 참조하세요.
다음 작업을 수행하여
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
후크를 사용하여 상위 프로세스 에서 클라이언트를 닫습니다. 이러한 후크에 대해 자세히 학습 Puma API 문서에서 클러스터형 모드 후크를 참조하세요.
다음 코드는 샘플 Puma 구성 파일 에서 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
유니콘
before_fork
훅을 사용하여 상위 프로세스 에서 클라이언트를 닫습니다. after_fork
훅을 사용하여 작업자의 클라이언트를 다시 연결합니다. 이러한 후크에 대해 자세히 학습 Unicorn API 문서에서 구성기를 참조하세요.
다음 코드는 샘플 Unicorn 구성 파일 에서 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
훅을 사용하여 작업자의 클라이언트를 다시 연결합니다. 이 훅에 대한 자세한 학습 Passenger 문서에서 스마트 생성 훅을 참조하세요.
참고
Passenger는 작업자가 포크되기 전에 상위 프로세스 에서 호출되는 훅을 가지고 있습니다.
다음 코드는 starting_worker_process
후크를 사용하여 클라이언트를 다시 연결합니다.
if defined?(PhusionPassenger) PhusionPassenger.on_event(:starting_worker_process) do |forked| Mongoid.reconnect_clients if forked end end