Docs Menu

포크 서버 구성

이 페이지의 내용

이 가이드 에서는 포크 웹 서버 사용하도록 애플리케이션 구성하는 방법을 학습 수 있습니다.

포크 웹 서버 와 함께 Mongoid를 사용할 때는 다음 지침을 따르세요.

  • 가능하면 포크하기 전에 상위 프로세스 에서 MongoDB 작업을 수행하지 마세요. Ruby 운전자 포크를 처리하는 방법에 대해 자세히 학습 운전자 설명서에서 포크 서버와 함께 사용을 참조하세요.

  • 다음 작업을 수행하여 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_forkon_refork 후크를 사용하여 상위 프로세스 에서 클라이언트를 닫습니다. 이러한 후크에 대해 자세히 학습 Puma API 문서에서 클러스터형 모드 후크를 참조하세요.

다음 코드는 샘플 Puma 구성 파일 에서 on_worker_boot, before_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 훅을 사용하여 작업자의 클라이언트를 다시 연결합니다. 이러한 후크에 대해 자세히 학습 Unicorn API 문서에서 구성기를 참조하세요.

다음 코드는 샘플 Unicorn 구성 파일 에서 before_forkafter_fork 후크를 사용합니다.

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

이 페이지의 내용