Class: Puma::Configuration
- Inherits:
-
Object
- Object
- Puma::Configuration
- Defined in:
- lib/puma/configuration.rb
Overview
The main configuration class of Puma.
It can be initialized with a set of “user” options and “default” options. Defaults will be merged with ‘Configuration.puma_default_options`.
This class works together with 2 main other classes the ‘UserFileDefaultOptions` which stores configuration options in order so the precedence is that user set configuration wins over “file” based configuration wins over “default” configuration. These configurations are set via the `DSL` class. This class powers the Puma config file syntax and does double duty as a configuration DSL used by the `Puma::CLI` and Puma rack handler.
It also handles loading plugins.
- Note:
-
‘:port` and `:host` are not valid keys. By the time they make it to the configuration options they are expected to be incorporated into a `:binds` key. Under the hood the DSL maps `port` and `host` calls to `:binds`
config = Configuration.new({}) do |user_config, file_config, default_config| user_config.port 3003 end config.load puts config.[:port] # => 3003
It is expected that ‘load` is called on the configuration instance after setting config. This method expands any values in `config_file` and puts them into the correct configuration option hash.
Once all configuration is complete it is expected that ‘clamp` will be called on the instance. This will expand any procs stored under “default” values. This is done because an environment variable may have been modified while loading configuration files.
Defined Under Namespace
Classes: ConfigMiddleware
Constant Summary collapse
- DEFAULTS =
{ auto_trim_time: 30, binds: ['tcp://0.0.0.0:9292'.freeze], clean_thread_locals: false, debug: false, early_hints: nil, environment: 'development'.freeze, # Number of seconds to wait until we get the first data for the request. first_data_timeout: 30, # Number of seconds to wait until the next request before shutting down. idle_timeout: nil, io_selector_backend: :auto, log_requests: false, logger: STDOUT, # How many requests to attempt inline before sending a client back to # the reactor to be subject to normal ordering. The idea here is that # we amortize the cost of going back to the reactor for a well behaved # but very "greedy" client across 10 requests. This prevents a not # well behaved client from monopolizing the thread forever. max_fast_inline: 10, max_threads: Puma.mri? ? 5 : 16, min_threads: 0, mode: :http, mutate_stdout_and_stderr_to_sync_on_write: true, out_of_band: [], # Number of seconds for another request within a persistent session. persistent_timeout: 20, queue_requests: true, rackup: 'config.ru'.freeze, raise_exception_on_sigterm: true, reaping_time: 1, remote_address: :socket, silence_single_worker_warning: false, silence_fork_callback_warning: false, tag: File.basename(Dir.getwd), tcp_host: '0.0.0.0'.freeze, tcp_port: 9292, wait_for_less_busy_worker: 0.005, worker_boot_timeout: 60, worker_check_interval: 5, worker_culling_strategy: :youngest, worker_shutdown_timeout: 30, worker_timeout: 60, workers: 0, http_content_length_limit: nil }
Instance Attribute Summary collapse
-
#options ⇒ Object
readonly
Returns the value of attribute options.
-
#plugins ⇒ Object
readonly
Returns the value of attribute plugins.
Class Method Summary collapse
Instance Method Summary collapse
-
#app ⇒ Object
Load the specified rackup file, pull options from the rackup file, and set @app.
-
#app_configured? ⇒ Boolean
Indicate if there is a properly configured app.
-
#clamp ⇒ Object
Call once all configuration (included from rackup files) is loaded to flesh out any defaults.
- #config_files ⇒ Object
- #configure ⇒ Object
-
#environment ⇒ Object
Return which environment we’re running in.
- #final_options ⇒ Object
- #flatten ⇒ Object
- #flatten! ⇒ Object
-
#initialize(user_options = {}, default_options = {}, &block) ⇒ Configuration
constructor
A new instance of Configuration.
- #initialize_copy(other) ⇒ Object
- #load ⇒ Object
- #load_plugin(name) ⇒ Object
- #puma_default_options ⇒ Object
- #puma_options_from_env ⇒ Object
- #rackup ⇒ Object
- #run_hooks(key, arg, log_writer, hook_data = nil) ⇒ Object
Constructor Details
#initialize(user_options = {}, default_options = {}, &block) ⇒ Configuration
Returns a new instance of Configuration.
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'lib/puma/configuration.rb', line 176 def initialize(={}, = {}, &block) = self..merge() @options = UserFileDefaultOptions.new(, ) @plugins = PluginLoader.new @user_dsl = DSL.new(@options., self) @file_dsl = DSL.new(@options., self) @default_dsl = DSL.new(@options., self) if !@options[:prune_bundler] [:preload_app] = (@options[:workers] > 1) && Puma.forkable? end if block configure(&block) end end |
Instance Attribute Details
#options ⇒ Object (readonly)
Returns the value of attribute options.
194 195 196 |
# File 'lib/puma/configuration.rb', line 194 def @options end |
#plugins ⇒ Object (readonly)
Returns the value of attribute plugins.
194 195 196 |
# File 'lib/puma/configuration.rb', line 194 def plugins @plugins end |
Class Method Details
.temp_path ⇒ Object
333 334 335 336 337 338 |
# File 'lib/puma/configuration.rb', line 333 def self.temp_path require 'tmpdir' t = (Time.now.to_f * 1000).to_i "#{Dir.tmpdir}/puma-status-#{t}-#{$$}" end |
Instance Method Details
#app ⇒ Object
Load the specified rackup file, pull options from the rackup file, and set @app.
289 290 291 292 293 294 295 296 297 298 299 |
# File 'lib/puma/configuration.rb', line 289 def app found = [:app] || load_rackup if @options[:log_requests] require_relative 'commonlogger' logger = @options[:logger] found = CommonLogger.new(found, logger) end ConfigMiddleware.new(self, found) end |
#app_configured? ⇒ Boolean
Indicate if there is a properly configured app
278 279 280 |
# File 'lib/puma/configuration.rb', line 278 def app_configured? @options[:app] || File.exist?(rackup) end |
#clamp ⇒ Object
Call once all configuration (included from rackup files) is loaded to flesh out any defaults
259 260 261 |
# File 'lib/puma/configuration.rb', line 259 def clamp @options.finalize_values end |
#config_files ⇒ Object
244 245 246 247 248 249 250 251 252 253 254 255 |
# File 'lib/puma/configuration.rb', line 244 def config_files files = @options.all_of(:config_files) return [] if files == ['-'] return files if files.any? first_default_file = %W(config/puma/#{@options[:environment]}.rb config/puma.rb).find do |f| File.exist?(f) end [first_default_file] end |
#configure ⇒ Object
196 197 198 199 200 201 202 |
# File 'lib/puma/configuration.rb', line 196 def configure yield @user_dsl, @file_dsl, @default_dsl ensure @user_dsl._offer_plugins @file_dsl._offer_plugins @default_dsl._offer_plugins end |
#environment ⇒ Object
Return which environment we’re running in
302 303 304 |
# File 'lib/puma/configuration.rb', line 302 def environment @options[:environment] end |
#final_options ⇒ Object
329 330 331 |
# File 'lib/puma/configuration.rb', line 329 def @options. end |
#flatten ⇒ Object
210 211 212 |
# File 'lib/puma/configuration.rb', line 210 def flatten dup.flatten! end |
#flatten! ⇒ Object
214 215 216 217 |
# File 'lib/puma/configuration.rb', line 214 def flatten! @options = @options.flatten self end |
#initialize_copy(other) ⇒ Object
204 205 206 207 208 |
# File 'lib/puma/configuration.rb', line 204 def initialize_copy(other) @conf = nil @cli_options = nil @options = @options.dup end |
#load ⇒ Object
238 239 240 241 242 |
# File 'lib/puma/configuration.rb', line 238 def load config_files.each { |config_file| @file_dsl._load_from(config_file) } @options end |
#load_plugin(name) ⇒ Object
306 307 308 |
# File 'lib/puma/configuration.rb', line 306 def load_plugin(name) @plugins.create name end |
#puma_default_options ⇒ Object
219 220 221 222 223 |
# File 'lib/puma/configuration.rb', line 219 def defaults = DEFAULTS.dup .each { |k,v| defaults[k] = v if v } defaults end |
#puma_options_from_env ⇒ Object
225 226 227 228 229 230 231 232 233 234 235 236 |
# File 'lib/puma/configuration.rb', line 225 def min = ENV['PUMA_MIN_THREADS'] || ENV['MIN_THREADS'] max = ENV['PUMA_MAX_THREADS'] || ENV['MAX_THREADS'] workers = ENV['WEB_CONCURRENCY'] { min_threads: min && Integer(min), max_threads: max && Integer(max), workers: workers && Integer(workers), environment: ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'], } end |
#rackup ⇒ Object
282 283 284 |
# File 'lib/puma/configuration.rb', line 282 def rackup @options[:rackup] end |
#run_hooks(key, arg, log_writer, hook_data = nil) ⇒ Object
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 |
# File 'lib/puma/configuration.rb', line 313 def run_hooks(key, arg, log_writer, hook_data = nil) @options.all_of(key).each do |b| begin if Array === b hook_data[b[1]] ||= Hash.new b[0].call arg, hook_data[b[1]] else b.call arg end rescue => e log_writer.log "WARNING hook #{key} failed with exception (#{e.class}) #{e.}" log_writer.debug e.backtrace.join("\n") end end end |