구성
이 페이지의 내용
Mongoid는 일반적으로 옵션과 클라이언트를 지정하는 mongoid.yml
파일을 통해 구성됩니다. 가장 간단한 구성은 다음과 같으며, Mongoid가 'localhost:27017'에서 MongoDB 서버와 통신하고 'mongoid'라는 이름의 데이터베이스를 사용하도록 구성합니다.
development: clients: default: database: mongoid hosts: - localhost:27017
위의 예에서 구성 파일의 최상위 키인 development
는 애플리케이션이 실행 중인 환경 이름(예시: development
, test
또는 production
)을 나타냅니다. 위 예에서 세 번째 레벨 키인 default
는 Mongo 클라이언트 이름을 나타냅니다. 대부분의 애플리케이션은 default
라는 단일 클라이언트를 사용합니다.
기본 구성 생성
Ruby on Rails를 사용하는 경우 다음 명령을 실행하여 Mongoid에서 기본 구성 파일을 생성하도록 할 수 있습니다.
rails g mongoid:config
구성 파일은 config/mongoid.yml
에 배치됩니다. 이니셜라이저도 생성되어 config/initializers/mongoid.rb
에 배치됩니다. 모든 구성을 config/mongoid.yml
에 지정하는 것이 좋지만 원하는 경우 mongoid.rb
이니셜라이저를 사용하여 구성 옵션을 설정할 수도 있습니다. 그러나 mongoid.yml
의 설정은 항상 이니셜라이저의 설정보다 우선합니다.
Ruby on Rails를 사용하지 않는 경우 위에 제공된 최소 구성을 복사하여 config/mongoid.yml
로 저장할 수 있습니다.
Mongoid 구성 로드
Ruby on Rails를 사용하는 경우 애플리케이션이 로드될 때 Rails.env
에 저장된 현재 환경에 대한 Mongoid 구성이 자동으로 로드됩니다.
application.rb
에 다음을 추가하여 애플리케이션이 Mongoid가 되도록 ORM을 구성해야 할 수 있습니다.
config.generators do |g| g.orm :mongoid end
Ruby on Rails를 사용하지 않는 경우 Mongoid 구성을 수동으로 로드해야 합니다. 이 작업은 다음과 같이 구성 파일 경로를 인수로 사용하는 Mongoid.load!
메서드를 통해 수행할 수 있습니다.
# Use automatically detected environment name Mongoid.load!("path/to/your/mongoid.yml") # Specify environment name manually Mongoid.load!("path/to/your/mongoid.yml", :production)
Mongoid가 환경 이름을 자동으로 감지하라는 요청을 받으면 다음 소스를 순서대로 검사하여 이를 수행합니다.
Rails
최상위 상수가 정의되면Rails.env
가 됩니다.Sinatra
최상위 상수가 정의되면Sinatra::Base.environment
가 됩니다.RACK_ENV
환경 변수.MONGOID_ENV
환경 변수.
구성 파일을 사용하지 않고 Ruby에서 직접 Mongoid를 구성하는 것도 가능합니다. 이 구성 스타일은 환경 개념을 지원하지 않습니다. 어떤 구성이 제공되든 제공된 구성은 현재 환경에 적용됩니다. 그러나 여러 클라이언트를 정의하는 것은 지원합니다.
Mongoid.configure do |config| config.clients.default = { hosts: ['localhost:27017'], database: 'my_db', } config.log_level = :warn end
참고
Mongoid의 구성 요소를 사용하거나 참조하기 전에 Mongoid를 구성해야 합니다. 구성 요소가 사용되거나 참조되면 구성을 변경해도 이미 인스턴스화된 구성 요소에 변경 사항이 적용되지 않을 수 있습니다.
Mongoid 구성 옵션
다음 주석이 달린 예시 mongoid.yml
은 Mongoid를 구성하는 방법을 보여줍니다.
Mongoid는 클라이언트 구성을 위해 Ruby 드라이버에 위임합니다. 드라이버 옵션에 대한 자세한 내용은 드라이버 설명서 를 검토하세요.
development: # Configure available database clients. (required) clients: # Defines the default client. (required) default: # Mongoid can connect to a URI accepted by the driver: # uri: mongodb://user:password@mongodb.domain.com:27017/my_db_development # Otherwise define the parameters separately. # This defines the name of the default database that Mongoid can connect to. # (required). database: my_db_development # Provides the hosts the default client can connect to. Must be an array # of host:port pairs. (required) hosts: - localhost:27017 options: # Note that all options listed below are Ruby driver client options (the mongo gem). # Please refer to the driver documentation of the version of the mongo gem you are using # for the most up-to-date list of options. # Change the default write concern. (default = { w: 1 }) # write: # w: 1 # Change the default read preference. Valid options for mode are: :secondary, # :secondary_preferred, :primary, :primary_preferred, :nearest # (default: primary) # read: # mode: :secondary_preferred # tag_sets: # - use: web # The name of the user for authentication. # user: 'user' # The password of the user for authentication. # password: 'password' # The user's database roles. # roles: # - 'dbOwner' # Change the default authentication mechanism. Valid options include: # :scram, :scram256, :mongodb_cr, :mongodb_x509, :gssapi, :aws, :plain. # MongoDB Server defaults to :scram, which will use "SCRAM-SHA-256" if available, # otherwise fallback to "SCRAM-SHA-1" (:scram256 will always use "SCRAM-SHA-256".) # This setting is handled by the MongoDB Ruby Driver. Please refer to: # https://mongodb.com/ko-kr/docs/ruby-driver/current/reference/authentication/ # auth_mech: :scram # The database or source to authenticate the user against. # (default: the database specified above or admin) # auth_source: admin # Force a the driver cluster to behave in a certain manner instead of auto- # discovering. Can be one of: :direct, :replica_set, :sharded. Set to :direct # when connecting to hidden members of a replica set. # connect: :direct # Changes the default time in seconds the server monitors refresh their status # via hello commands. (default: 10) # heartbeat_frequency: 10 # The time in seconds for selecting servers for a near read preference. (default: 0.015) # local_threshold: 0.015 # The timeout in seconds for selecting a server for an operation. (default: 30) # server_selection_timeout: 30 # The maximum number of connections in the connection pool. (default: 5) # max_pool_size: 5 # The minimum number of connections in the connection pool. (default: 1) # min_pool_size: 1 # The time to wait, in seconds, in the connection pool for a connection # to be checked in before timing out. (default: 5) # wait_queue_timeout: 5 # The time to wait to establish a connection before timing out, in seconds. # (default: 10) # connect_timeout: 10 # How long to wait for a response for each operation sent to the # server. This timeout should be set to a value larger than the # processing time for the longest operation that will be executed # by the application. Note that this is a client-side timeout; # the server may continue executing an operation after the client # aborts it with the SocketTimeout exception. # (default: nil, meaning no timeout) # socket_timeout: 5 # The name of the replica set to connect to. Servers provided as seeds that do # not belong to this replica set will be ignored. # replica_set: name # Compressors to use for wire protocol compression. (default is to not use compression) # "zstd" requires zstd-ruby gem. "snappy" requires snappy gem. # Refer to: https://www.mongodb.com/ko-kr/docs/ruby-driver/current/reference/create-client/#compression # compressors: ["zstd", "snappy", "zlib"] # Whether to connect to the servers via ssl. (default: false) # ssl: true # The certificate file used to identify the connection against MongoDB. # ssl_cert: /path/to/my.cert # The private keyfile used to identify the connection against MongoDB. # Note that even if the key is stored in the same file as the certificate, # both need to be explicitly specified. # ssl_key: /path/to/my.key # A passphrase for the private key. # ssl_key_pass_phrase: password # Whether to do peer certification validation. (default: true) # ssl_verify: true # The file containing concatenated certificate authority certificates # used to validate certs passed from the other end of the connection. # ssl_ca_cert: /path/to/ca.cert # Whether to truncate long log lines. (default: true) # truncate_logs: true # Configure Mongoid-specific options. (optional) options: # Allow BSON::Decimal128 to be parsed and returned directly in # field values. When BSON 5 is present and the this option is set to false # (the default), BSON::Decimal128 values in the database will be returned # as BigDecimal. # # @note this option only has effect when BSON 5+ is present. Otherwise, # the setting is ignored. # allow_bson5_decimal128: false # Application name that is printed to the MongoDB logs upon establishing # a connection. Note that the name cannot exceed 128 bytes in length. # It is also used as the database name if the database name is not # explicitly defined. (default: nil) # app_name: nil # When this flag is false, callbacks for embedded documents will not be # called. This is the default in 9.0. # # Setting this flag to true restores the pre-9.0 behavior, where callbacks # for embedded documents are called. This may lead to stack overflow errors # if there are more than cicrca 1000 embedded documents in the root # document's dependencies graph. # See https://jira.mongodb.org/browse/MONGOID-5658 for more details. # around_callbacks_for_embeds: false # Sets the async_query_executor for the application. By default the thread pool executor # is set to `:immediate`. Options are: # # - :immediate - Initializes a single +Concurrent::ImmediateExecutor+ # - :global_thread_pool - Initializes a single +Concurrent::ThreadPoolExecutor+ # that uses the +async_query_concurrency+ for the +max_threads+ value. # async_query_executor: :immediate # Mark belongs_to associations as required by default, so that saving a # model with a missing belongs_to association will trigger a validation # error. # belongs_to_required_by_default: true # Set the global discriminator key. # discriminator_key: "_type" # Raise an exception when a field is redefined. # duplicate_fields_exception: false # Defines how many asynchronous queries can be executed concurrently. # This option should be set only if `async_query_executor` is set # to `:global_thread_pool`. # global_executor_concurrency: nil # When this flag is true, any attempt to change the _id of a persisted # document will raise an exception (`Errors::ImmutableAttribute`). # This is the default in 9.0. Setting this flag to false restores the # pre-9.0 behavior, where changing the _id of a persisted # document might be ignored, or it might work, depending on the situation. # immutable_ids: true # Include the root model name in json serialization. # include_root_in_json: false # # Include the _type field in serialization. # include_type_for_serialization: false # Whether to join nested persistence contexts for atomic operations # to parent contexts by default. # join_contexts: false # When this flag is false (the default as of Mongoid 9.0), a document that # is created or loaded will remember the storage options that were active # when it was loaded, and will use those same options by default when # saving or reloading itself. # # When this flag is true you'll get pre-9.0 behavior, where a document will # not remember the storage options from when it was loaded/created, and # subsequent updates will need to explicitly set up those options each time. # # For example: # # record = Model.with(collection: 'other_collection') { Model.first } # # This will try to load the first document from 'other_collection' and # instantiate it as a Model instance. Pre-9.0, the record object would # not remember that it came from 'other_collection', and attempts to # update it or reload it would fail unless you first remembered to # explicitly specify the collection every time. # # As of Mongoid 9.0, the record will remember that it came from # 'other_collection', and updates and reloads will automatically default # to that collection, for that record object. # legacy_persistence_context_behavior: false # When this flag is false, a document will become read-only only once the # #readonly! method is called, and an error will be raised on attempting # to save or update such documents, instead of just on delete. When this # flag is true, a document is only read-only if it has been projected # using #only or #without, and read-only documents will not be # deletable/destroyable, but they will be savable/updatable. # When this feature flag is turned on, the read-only state will be reset on # reload, but when it is turned off, it won't be. # legacy_readonly: false # The log level. # # It must be set prior to referencing clients or Mongo.logger, # changes to this option are not be propagated to any clients and # loggers that already exist. # # Additionally, only when the clients are configured via the # configuration file is the log level given by this option honored. # log_level: :info # Store BigDecimals as Decimal128s instead of strings in the db. # map_big_decimal_to_decimal128: true # Preload all models in development, needed when models use inheritance. # preload_models: false # When this flag is true, callbacks for every embedded document will be # called only once, even if the embedded document is embedded in multiple # documents in the root document's dependencies graph. # This is the default in 9.0. Setting this flag to false restores the # pre-9.0 behavior, where callbacks are called for every occurrence of an # embedded document. The pre-9.0 behavior leads to a problem that for multi # level nested documents callbacks are called multiple times. # See https://jira.mongodb.org/browse/MONGOID-5542 # prevent_multiple_calls_of_embedded_callbacks: true # Raise an error when performing a #find and the document is not found. # raise_not_found_error: true # Raise an error when defining a scope with the same name as an # existing method. # scope_overwrite_exception: false # Return stored times as UTC. # use_utc: false # Configure Driver-specific options. (optional) driver_options: # When this flag is off, an aggregation done on a view will be executed over # the documents included in that view, instead of all documents in the # collection. When this flag is on, the view filter is ignored. # broken_view_aggregate: true # When this flag is set to false, the view options will be correctly # propagated to readable methods. # broken_view_options: true # When this flag is set to true, the update and replace methods will # validate the parameters and raise an error if they are invalid. # validate_update_replace: false
버전 기반 기본값
Mongoid는 특정 버전의 구성 옵션을 기본값으로 설정하는 것을 지원합니다. 이는 새로운 Mongoid 버전으로 업그레이드할 때 유용합니다. Mongoid 버전을 업그레이드할 때 Mongoid::Config
에 다음을 설정해야 합니다.
Mongoid.configure do |config| config.load_defaults <OLD VERSION> end
이렇게 하면 새 버전의 Mongoid로 업그레이드할 때 코드가 이전 버전의 Mongoid의 구성 옵션으로 실행됩니다. 그런 다음 새 버전의 기능 플래그를 하나씩 변경하고 코드가 여전히 예상대로 작동하는지 테스트할 수 있습니다. 새 기능 플래그가 모두 고려되면 load_defaults
에 대한 호출을 새 버전을 사용하도록 변경하고 변경된 모든 기능 플래그를 제거할 수 있습니다.
예를 들어 7.5 에서 8.0 로 업그레이드한다고 가정해 보겠습니다. 이 두 버전 사이에 legacy_attributes
및 map_big_decimal_to_decimal128
라는 두 가지 기능 플래그가 추가되었습니다. Mongoid 8 로 업그레이드하기 전에 Mongoid::Config
에 다음을 추가합니다.
Mongoid.configure do |config| config.load_defaults 7.5 end
Gemfile
에서 Mongoid 8.0 으로 업그레이드한 후에도 모든 기능 플래그는 7.5 로 설정된 상태로 유지됩니다. 기본 동작: legacy_attributes: true,
map_big_decimal_to_decimal128: false
. 그런 다음 이러한 기능 플래그를 하나씩 8.0 동작:
Mongoid.configure do |config| config.load_defaults 7.5 config.legacy_attributes = false # config.map_big_decimal_to_decimal128 = true end
이 작업은 한 번에 하나씩 수행하는 것이 좋으므로 위의 예시 에서는 두 번째 플래그를 주석 처리한 상태로 두었습니다. legacy_attributes
플래그를 끈 상태에서 코드가 예상대로 작동하는지 확인한 후 map_big_decimal_to_decimal128
설정의 주석을 제거할 수 있습니다. 해당 기능이 확인되면 두 줄을 모두 제거하고 load_defaults
를 다음으로 바꿀 수 있습니다.
Mongoid.configure do |config| config.load_defaults 8.0 end
ERb 전처리
구성 파일을 로드할 때 Mongoid는 이를 YAML로 구문 분석하기 전에 ERb로 처리합니다. 예를 들어, 이를 통해 환경 변수를 기반으로 런타임에 구성 파일의 내용을 구성할 수 있습니다.
development: clients: default: uri: "<%= ENV['MONGODB_URI'] %>"
참고
ERb에서 값을 출력할 때는 값이 유효한 YAML인지 확인하고 필요에 따라 이스케이프 처리하세요.
참고
ERb 렌더링은 YAML 구문 분석 전에 수행되므로 YAML 주석에 있는 지시어를 포함하여 구성 파일의 모든 ERb 지시어가 평가됩니다.
로깅
로깅을 구성할 때, Mongoid는 MongoDB Ruby 드라이버 위에 모델 레이어를 제공하고, 드라이버는 CRUD 작업을 MongoDB 배포에 할당한다는 점을 명심해야 합니다. 따라서 Mongoid를 사용하는 애플리케이션의 로깅 출력 중 일부는 Mongoid 자체에서 파생되고 일부는 드라이버에서 파생됩니다.
Mongo 클라이언트는 Ruby 드라이버 클라이언트 인스턴스이므로 Mongo 클라이언트의 로거(logger)는 Mongoid 로거가 아닌 Ruby 드라이버 로거입니다. 이를 다르게 설명하자면 다음과 같습니다:
# Ruby driver logger, not Mongoid logger Mongoid.client(:default).logger
Mongoid가 Ruby on Rails 애플리케이션에서 사용되는지 여부와 Mongoid와 Ruby 드라이버의 구성 방식에 따라 동일한 로거(logger) 인스턴스를 사용할 수도 있고 다른 인스턴스를 사용할 수도 있으며, 구성이 다를 수도 있습니다.
Ruby on Rails 애플리케이션
Ruby on Rails 애플리케이션에서 사용될 때 Mongoid는 기본적으로 Rails에서 로거와 로그 수준을 상속하고 드라이버의 로거를 동일한 로거 인스턴스로 설정합니다.
Rails.logger === Mongoid.logger # => true Mongoid.logger === Mongo::Logger.logger # => true
로그 수준을 변경하려면 표준 Rails 구성 을 사용합니다. . config/environments/production.rb
와 같은 환경 구성 파일 중 하나에 다음을 배치합니다.
Rails.application.configure do config.log_level = :debug end
참고
이 경우 Mongoid는 Rails의 로그 수준을 상속하므로 log_level
Mongoid 구성 옵션은 Mongoid가 Rails 애플리케이션에서 작동할 때는 사용되지 않습니다.
Mongoid 또는 드라이버 로거를 Rails 로거와 다르게 구성하려면 다음과 같이 이니셜라이저(initializer)를 사용합니다.
Rails.application.configure do config.after_initialize do # Change Mongoid log destination and/or level Mongoid.logger = Logger.new(STDERR).tap do |logger| logger.level = Logger::DEBUG end # Change driver log destination and/or level Mongo::Logger.logger = Logger.new(STDERR).tap do |logger| logger.level = Logger::DEBUG end end end
참고
현재 Ruby 표준 라이브러리 Logger
에는 로거가 사용하는 로그 장치(즉, IO
객체)를 반환하는 프로비저닝이 없습니다. 예를 들어, Mongoid 및/또는 Ruby 드라이버가 표준 Rails 로그 파일(예시: log/development.log
)에 로그를 기록하려면 표준 Rails 로거(Rails.logger
)와는 다른 수준으로 파일을 따로 열고 생성된 IO
객체를 Logger
생성자에 전달해야 합니다.
참고
기본적으로 Mongoid는 자체 로거와 드라이버 로거를 Rails 로거와 동일한 인스턴스로 설정하므로 인스턴스를 수정하면 모든 인스턴스에 영향을 미칩니다. 예를 들어 애플리케이션이 위에서 설명한 대로 Mongo::Logger.logger
에 별도의 Logger
인스턴스를 할당하지 않는 한 다음은 세 로거 모두에 대한 로그 수준을 변경합니다:
Mongoid::Logger.logger.level = Logger::DEBUG
독립형
Ruby on Rails 애플리케이션에 로드되지 않은 경우 Mongoid는 log_level
최상위 구성 옵션을 따릅니다. 구성 파일에서 다음과 같이 지정할 수 있습니다.
development: clients: default: # ... options: log_level: :debug
... 또는 Mongoid 인라인을 구성 시:
Mongoid.configure do |config| config.log_level = :debug end
Mongoid 7.1 이상의 기본 로그 대상은 표준 오류입니다. Mongoid 7.0 이하의 기본 로그 대상은 표준 출력입니다. 로그 대상을 변경하려면 다음과 같이 새 로거 인스턴스를 생성하세요.
Mongoid.logger = Logger.new(STDERR).tap do |logger| logger.level = Logger::DEBUG end
Ruby 드라이버 로그 수준 또는 대상을 변경하려면 다음을 수행하세요.
Mongo::Logger.logger = Logger.new(STDERR).tap do |logger| logger.level = Logger::DEBUG end
드라이버 로거를 Mongoid 로거와 동일하게 설정하려면 다음을 따릅니다:
Mongo::Logger.logger = Mongoid.logger
참고
Mongoid는 독립형 모드에서 실행할 때 드라이버의 로거를 변경하지 않습니다.
시간대
Mongoid는 Ruby의 표준 라이브러리보다 훨씬 강력한 ActiveSupport의 시간대 기능을 사용합니다. 중요한 점은 ActiveSupport를 사용하면 날짜 및 시간 값으로 작업하기 위한 컨텍스트를 제공하는 스레드 전역 변수인 Time.zone
을 구성할 수 있다는 점입니다.
Ruby의 시간대와 관련한 상세 내용은 이 튜토리얼의 범위를 벗어나지만 올바른 시간대 처리를 달성하는 가장 쉽고 신뢰할 수 있는 방법은 다음과 같습니다.
운영 체제의 표준 시간대를 UTC로 설정합니다. 예를 들어 Linux의 경우:
cp /usr/share/zoneinfo/UTC /etc/localtime
애플리케이션 기본값 구역 를 UTC로 설정합니다.
# If using Rails, in application.rb: class Application < Rails::Application config.time_zone = 'UTC' end # If not using Rails: Time.zone = 'UTC'
각 컨트롤러 및 작업 클래스에서 가능한 한 이른 단계에
before_filter
(으)로 적절한 시간대를 설정합니다. 예를 들어 애플리케이션의 각 사용자가 자신의 시간대를 설정할 수 있는 경우 다음을 수행할 수 있습니다.
class ApplicationController < ActionController::Base before_filter :fetch_user, :set_time_zone def set_time_zone Time.zone = @user.time_zone end end
여기에서 현지 시간대의 시간을 자연스럽게 사용할 수 있습니다. 예를 들어 다음과 같은 뷰가 있습니다.
Turned into a pumpkin after <%= cinderella.updated_at.seconds_after_midnight %> seconds!
Ruby 표준 라이브러리 대신 ActiveSupport 메서드를 사용합니다.
Time.zone.now
orTime.current` instead of ``Time.now
Date.current
대신Date.today
중요한 점은 후자의 Ruby 표준 라이브러리 메서드는 시스템 구역 를 참조한다는 점입니다(예: UTC)이며
Time.zone
값이 아닙니다. 이름이 비슷한 메서드는 실수하기가 매우 쉽습니다 . CI에 포함됩니다.
MongoDB에서 로드된 데이터의 시간대 설정
MongoDB 는 구역 정보 없이 모든 시간을 UTC로 저장합니다. Mongoid 모델은 시간 값을 ActiveSupport::TimeWithZone
의 인스턴스로 로드하고 반환합니다. use_utc
옵션을 설정하다 하여 데이터베이스 에서 로드할 때 Mongoid가 구역 를 설정하는 방법을 제어할 수 있습니다.
false(기본값)인 경우 Mongoid는
Time.zone
을 사용하여 데이터베이스에서 값이 로드되는 시간의 시간대를 설정합니다.true인 경우, Mongoid는 로드된 시간 값에서 항상 시간대를 UTC로 설정합니다.
use_utc
데이터가 로드되는 방식에만 영향을 미치고 데이터가 유지되는 방식에는 영향을 주지 않습니다. 예를 들어 시간 필드에 Time
또는 ActiveSupport::TimeWithZone
인스턴스를 할당하는 경우 use_utc
설정에 관계없이 항상 할당된 인스턴스의 시간대 정보가 사용됩니다. 또는 시간 필드에 string 값을 할당하면 string 에 시간대 정보가 있는 경우 해당 정보가 사용됩니다. string 에 시간대 정보가 포함되어 있지 않으면 Time.zone
에 따라 구문 분석됩니다. 예를 들어 다음과 같습니다.
Time.use_zone("Asia/Kolkata") do # String does not include time zone, so "Asia/Kolkata" will be used ghandi.born_at = "1869-10-02 7:10 PM" # Time zone in string (-0600) will be used amelia.born_at = "1897-07-24 11:30 -0600" end
구성 SSLContext
예를 들어 특정 암호를 활성화하거나 비활성화하여 애플리케이션에서 TLS 옵션을 추가로 구성하는 것이 바람직할 수 있습니다.
이 작업은 Ruby 드라이버에서 TLS 컨텍스트 후크를 설정하여 수행할 수 있습니다. -- TLS 컨텍스트 후크는 드라이버에서 TLS 소켓 연결 전에 호출되며 기본 Proc
OpenSSL::SSL::SSLContext
소켓에서 사용하는 객체입니다.
TLS 컨텍스트 후크를 설정하려면 Mongo.tls_context_hooks
배열에 Proc
(s)를 추가합니다. 이 작업은 이니셜라이저에서 수행할 수 있습니다. 아래 예에서는 'AES256-SHA' 암호만 활성화하는 훅을 추가합니다.
Mongo.tls_context_hooks.push( Proc.new { |context| context.ciphers = ["AES256-SHA"] } ) # Only the AES256-SHA cipher will be enabled from this point forward
Proc
의 모든 Mongo.tls_context_hooks
은 OpenSSL::SSL::SSLContext
객체를 유일한 인수로 전달합니다. 이러한 프로세스는 소켓을 생성하는 동안 순차적으로 실행됩니다.
경고
TLS 컨텍스트 훅은 전역적이며 애플리케이션의 모든 Mongo::Client
인스턴스에 영향을 미칩니다.
TLS 컨텍스트 훅 할당 및 제거 권장 사항을 포함하여 TLS 컨텍스트 훅에 대한 자세한 내용은 Ruby 드라이버 설명서를 참조하세요.
네트워크 압축
Mongoid는 MongoDB 서버와 주고받는 메시지 압축을 지원합니다. 이 기능은 MongoDB 서버에서 지원하는 세 가지 알고리즘을 구현하는 Ruby 운전자 에 의해 제공됩니다.
Snappy: 압축은
snappy
MongoDB 3(으)로 시작하는 서버에 연결할 때 사용할 수 있습니다.4 릴리스, 그리고 snappy 가 필요합니다. 라이브러리를 설치합니다.zlib: 압축은
zlib
MongoDB 3(으)로 시작하는 서버에 연결할 때 사용할 수 있습니다.6 릴리스.Zstandard:
zstd
압축은 로 시작하는 MongoDB 서버에 연결할 때 사용할 수 4 있습니다.2 릴리스이며,zstd- Ruby 가 필요합니다. 라이브러리를 설치합니다.
유선 프로토콜 압축을 사용하려면 mongoid.yml
내에서 Ruby 드라이버 옵션을 구성합니다.
development: # Configure available database clients. (required) clients: # Define the default client. (required) default: # ... options: # These options are Ruby driver options, documented in # https://mongodb.com/ko-kr/docs/ruby-driver/current/reference/create-client/ # ... # Compressors to use. (default is to not use compression) # Valid values are zstd, zlib or snappy - or any combination of the three compressors: ["zstd", "snappy"]
압축기가 명시적으로 요청되지 않은 경우, 시스템에 하나 이상의 압축기에 필요한 종속성이 있더라도 드라이버는 압축을 사용하지 않습니다.
운전자 는 요청된 압축기 중 서버 에서도 지원하는 첫 번째 압축기를 선택합니다. zstd
압축기는 다른 압축기에 비해 동일한 CPU 소비량으로 가장 높은 압축률을 생성하므로 권장됩니다.
서버 호환성을 극대화하기 위해 세 가지 압축기를 모두 지정할 수 있습니다(예: compressors: ["zstd", "snappy", "zlib"]
.
클라이언트 측 암호화
구성 파일을 로드할 때, Mongoid는 다음 예시와 같이 클라이언트 사이드 암호화를 위한 스키마 맵에서 keyId
를 지정하는 데 사용되는 BSON::Binary
인스턴스를 파일에 포함할 수 있도록 허용합니다:
development: clients: default: database: blog_development hosts: [localhost:27017] options: auto_encryption_options: key_vault_namespace: 'keyvault.datakeys' kms_providers: local: key: "z7iYiYKLuYymEWtk4kfny1ESBwwFdA58qMqff96A8ghiOcIK75lJGPUIocku8LOFjQuEgeIP4xlln3s7r93FV9J5sAE7zg8U" schema_map: blog_development.comments: properties: message: encrypt: keyId: - !ruby/object:BSON::Binary data: !binary |- R/AgNcxASFiiJWKXqWGo5w== type: :uuid bsonType: "string" algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" bsonType: "object"
포크 서버와 함께 사용
Puma와 같은 포크 웹 서버 또는 하위 프로세스를 생성하기 위해 포크하는 애플리케이션 과 함께 Mongoid를 사용할 때는 특별한 고려 사항 적용.
가능하다면 포크와 관련된 위험을 방지하기 위해 포크 전에 상위 프로세스 에서 MongoDB 작업을 수행하지 않는 것이 좋습니다.
mongo Ruby 드라이버가 포크를 처리하는 방법에 대한 자세한 기술 설명은 driver's "Usage with Forking Servers" documentation
<https://www.mongodb.com/ko-kr/docs/ruby-driver/current/reference/create-client/#usage-with-forking-servers>
에 나와 있습니다. 요컨대, Mongo::Error::SocketError
및 Mongo::Error::NoServerAvailable
과 같은 다양한 연결 오류를 방지하려면 다음을 수행해야 합니다.
Mongoid.disconnect_clients
을(를) 사용하여 포크 하기 직전 에 상위 Ruby 프로세스에서 MongoDB 클라이언트의 연결을 해제합니다. 이렇게 하면 상위 프로세스와 하위 프로세스가 실수로 동일한 소켓을 재사용하여 I/O 충돌이 발생하지 않습니다.Mongoid.disconnect_clients
는 진행 중인 MongoDB 작업을 중단하지 않으며, 새 작업을 수행할 때 자동으로 다시 연결합니다.Mongoid.reconnect_clients
을(를) 사용하여 포크 한 직후 하위 Ruby 프로세스의 MongoDB 클라이언트를 다시 연결합니다. 이는 하위 프로세스에서 드라이버의 모니터링 스레드를 다시 생성하는 데 필요합니다.
대부분의 웹 서버는 작업자 프로세스가 포크될 때 애플리케이션에서 작업을 수행하는 데 사용할 수 있는 후크를 제공합니다. 다음은 몇 가지 일반적인 Ruby 웹 서버에 대한 구성 예시입니다.
Puma
훅을 사용하여 on_worker_boot
작업자의 클라이언트를 다시 연결하고 before_fork
및 on_refork
훅을 사용하여 상위 프로세스의 클라이언트를 닫습니다( Puma 문서 ).
# 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
유니콘
after_fork
훅을 사용하여 작업자에서 클라이언트를 다시 연결하고 before_fork
훅을 사용하여 상위 프로세스에서 클라이언트를 닫습니다(Unicorn 문서):
# 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는 작업자가 포크되기 전에 상위 프로세스에서 호출되는 훅을 가지고 있지 않은 듯 보입니다.
if defined?(PhusionPassenger) PhusionPassenger.on_event(:starting_worker_process) do |forked| Mongoid.reconnect_clients if forked end end
쿼리 캐시 미들웨어
랙 웹 요청에 대한 쿼리 캐시 활성화
MongoDB Ruby 드라이버 는 각 웹 요청 기간 동안 쿼리 캐시 를 활성화하는 Rack 미들웨어를 제공합니다. 다음은 Ruby on Rails 애플리케이션 에서 쿼리 캐시 미들웨어를 활성화 하는 방법의 예시 입니다.
# config/application.rb # Add Mongo::QueryCache::Middleware at the bottom of the middleware stack # or before other middleware that queries MongoDB. config.middleware.use Mongo::QueryCache::Middleware
Rails 애플리케이션에서 Rack 미들웨어를 사용하는 방법에 대한 자세한 내용은 Rails on Rack 가이드를 참조하세요.
ActiveJob에 대한 쿼리 캐시 활성화
MongoDB Ruby 드라이버 는 ActiveJob을 위한 쿼리 캐시 미들웨어도 제공합니다. 이니셜라이저의 모든 작업에 대해 활성화 할 수 있습니다.
# config/initializers/active_job.rb # Enable Mongo driver query cache for ActiveJob ActiveSupport.on_load(:active_job) do include Mongo::QueryCache::Middleware::ActiveJob end
또는 특정 작업 클래스의 경우:
class MyJob < ActiveJob::Base include Mongo::QueryCache::Middleware::ActiveJob end
개발 구성
드라이버의 기본 구성은 프로덕션 배포에 적합합니다. 개발 중에는 더 나은 개발자 환경을 제공하기 위해 일부 설정을 조정할 수 있습니다.
:server_selection_timeout
: MongoDB 서버가 로컬에서 실행 중이고 수동으로 시작하는 경우 이 값을 낮게(예:1
) 설정합니다. 서버 선택 시간 초과 값이 낮으면 실행 중인 서버가 없을 때 드라이버가 빠르게 실패하게 됩니다.
샘플 권장 개발 구성:
development: clients: default: database: mongoid hosts: - localhost:27017 options: server_selection_timeout: 1