puma 6.4.3 → 6.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +96 -1
- data/README.md +74 -22
- data/docs/fork_worker.md +5 -1
- data/docs/java_options.md +48 -0
- data/docs/signals.md +2 -2
- data/docs/stats.md +2 -1
- data/docs/systemd.md +10 -1
- data/ext/puma_http11/extconf.rb +19 -16
- data/ext/puma_http11/mini_ssl.c +11 -1
- data/ext/puma_http11/org/jruby/puma/Http11.java +27 -6
- data/ext/puma_http11/puma_http11.c +3 -0
- data/lib/puma/binder.rb +5 -4
- data/lib/puma/cli.rb +9 -5
- data/lib/puma/client.rb +35 -12
- data/lib/puma/cluster/worker.rb +5 -5
- data/lib/puma/cluster/worker_handle.rb +4 -5
- data/lib/puma/cluster.rb +26 -18
- data/lib/puma/configuration.rb +34 -18
- data/lib/puma/const.rb +13 -3
- data/lib/puma/control_cli.rb +4 -4
- data/lib/puma/dsl.rb +252 -33
- data/lib/puma/error_logger.rb +4 -4
- data/lib/puma/jruby_restart.rb +0 -16
- data/lib/puma/launcher.rb +7 -3
- data/lib/puma/log_writer.rb +9 -9
- data/lib/puma/minissl/context_builder.rb +1 -0
- data/lib/puma/minissl.rb +1 -0
- data/lib/puma/null_io.rb +26 -0
- data/lib/puma/request.rb +7 -3
- data/lib/puma/runner.rb +6 -2
- data/lib/puma/server.rb +27 -20
- data/lib/puma/thread_pool.rb +11 -0
- data/lib/puma/util.rb +1 -1
- data/lib/rack/handler/puma.rb +8 -5
- metadata +10 -9
data/lib/puma/dsl.rb
CHANGED
@@ -51,7 +51,8 @@ module Puma
|
|
51
51
|
class DSL
|
52
52
|
ON_WORKER_KEY = [String, Symbol].freeze
|
53
53
|
|
54
|
-
#
|
54
|
+
# Convenience method so logic can be used in CI.
|
55
|
+
#
|
55
56
|
# @see ssl_bind
|
56
57
|
#
|
57
58
|
def self.ssl_bind_str(host, port, opts)
|
@@ -85,6 +86,7 @@ module Puma
|
|
85
86
|
"&verify_mode=#{verify}#{tls_str}#{ca_additions}#{backlog_str}"
|
86
87
|
else
|
87
88
|
ssl_cipher_filter = opts[:ssl_cipher_filter] ? "&ssl_cipher_filter=#{opts[:ssl_cipher_filter]}" : nil
|
89
|
+
ssl_ciphersuites = opts[:ssl_ciphersuites] ? "&ssl_ciphersuites=#{opts[:ssl_ciphersuites]}" : nil
|
88
90
|
v_flags = (ary = opts[:verification_flags]) ? "&verification_flags=#{Array(ary).join ','}" : nil
|
89
91
|
|
90
92
|
cert_flags = (cert = opts[:cert]) ? "cert=#{Puma::Util.escape(cert)}" : nil
|
@@ -115,7 +117,7 @@ module Puma
|
|
115
117
|
nil
|
116
118
|
end
|
117
119
|
|
118
|
-
"ssl://#{host}:#{port}?#{cert_flags}#{key_flags}#{password_flags}#{ssl_cipher_filter}" \
|
120
|
+
"ssl://#{host}:#{port}?#{cert_flags}#{key_flags}#{password_flags}#{ssl_cipher_filter}#{ssl_ciphersuites}" \
|
119
121
|
"#{reuse_flag}&verify_mode=#{verify}#{tls_str}#{ca_additions}#{v_flags}#{backlog_str}#{low_latency_str}"
|
120
122
|
end
|
121
123
|
end
|
@@ -163,7 +165,10 @@ module Puma
|
|
163
165
|
@options[key.to_sym] || default
|
164
166
|
end
|
165
167
|
|
166
|
-
# Load the named plugin for use by this configuration
|
168
|
+
# Load the named plugin for use by this configuration.
|
169
|
+
#
|
170
|
+
# @example
|
171
|
+
# plugin :tmp_restart
|
167
172
|
#
|
168
173
|
def plugin(name)
|
169
174
|
@plugins << @config.load_plugin(name)
|
@@ -210,6 +215,7 @@ module Puma
|
|
210
215
|
# activate_control_app 'unix:///var/run/pumactl.sock', { auth_token: '12345' }
|
211
216
|
# @example
|
212
217
|
# activate_control_app 'unix:///var/run/pumactl.sock', { no_token: true }
|
218
|
+
#
|
213
219
|
def activate_control_app(url="auto", opts={})
|
214
220
|
if url == "auto"
|
215
221
|
path = Configuration.temp_path
|
@@ -235,8 +241,12 @@ module Puma
|
|
235
241
|
@options[:control_url_umask] = opts[:umask] if opts[:umask]
|
236
242
|
end
|
237
243
|
|
238
|
-
# Load additional configuration from a file
|
239
|
-
# Files get loaded later via Configuration#load
|
244
|
+
# Load additional configuration from a file.
|
245
|
+
# Files get loaded later via Configuration#load.
|
246
|
+
#
|
247
|
+
# @example
|
248
|
+
# load 'config/puma/production.rb'
|
249
|
+
#
|
240
250
|
def load(file)
|
241
251
|
@options[:config_files] ||= []
|
242
252
|
@options[:config_files] << file
|
@@ -268,6 +278,7 @@ module Puma
|
|
268
278
|
# bind 'tcp://0.0.0.0:9292?low_latency=false'
|
269
279
|
# @example Socket permissions
|
270
280
|
# bind 'unix:///var/run/puma.sock?umask=0111'
|
281
|
+
#
|
271
282
|
# @see Puma::Runner#load_and_bind
|
272
283
|
# @see Puma::Cluster#run
|
273
284
|
#
|
@@ -302,39 +313,70 @@ module Puma
|
|
302
313
|
#
|
303
314
|
# @example Only bind to systemd activated sockets, ignoring other binds
|
304
315
|
# bind_to_activated_sockets 'only'
|
316
|
+
#
|
305
317
|
def bind_to_activated_sockets(bind=true)
|
306
318
|
@options[:bind_to_activated_sockets] = bind
|
307
319
|
end
|
308
320
|
|
309
|
-
# Define the TCP port to bind to. Use
|
321
|
+
# Define the TCP port to bind to. Use `bind` for more advanced options.
|
322
|
+
#
|
323
|
+
# The default is +9292+.
|
310
324
|
#
|
311
325
|
# @example
|
312
|
-
# port
|
326
|
+
# port 3000
|
327
|
+
#
|
313
328
|
def port(port, host=nil)
|
314
329
|
host ||= default_host
|
315
330
|
bind URI::Generic.build(scheme: 'tcp', host: host, port: Integer(port)).to_s
|
316
331
|
end
|
317
332
|
|
318
333
|
# Define how long the tcp socket stays open, if no data has been received.
|
334
|
+
#
|
335
|
+
# The default is 30 seconds.
|
336
|
+
#
|
337
|
+
# @example
|
338
|
+
# first_data_timeout 40
|
339
|
+
#
|
319
340
|
# @see Puma::Server.new
|
341
|
+
#
|
320
342
|
def first_data_timeout(seconds)
|
321
343
|
@options[:first_data_timeout] = Integer(seconds)
|
322
344
|
end
|
323
345
|
|
324
346
|
# Define how long persistent connections can be idle before Puma closes them.
|
347
|
+
#
|
348
|
+
# The default is 20 seconds.
|
349
|
+
#
|
350
|
+
# @example
|
351
|
+
# persistent_timeout 30
|
352
|
+
#
|
325
353
|
# @see Puma::Server.new
|
354
|
+
#
|
326
355
|
def persistent_timeout(seconds)
|
327
356
|
@options[:persistent_timeout] = Integer(seconds)
|
328
357
|
end
|
329
358
|
|
330
359
|
# If a new request is not received within this number of seconds, begin shutting down.
|
360
|
+
#
|
361
|
+
# The default is +nil+.
|
362
|
+
#
|
363
|
+
# @example
|
364
|
+
# idle_timeout 60
|
365
|
+
#
|
331
366
|
# @see Puma::Server.new
|
367
|
+
#
|
332
368
|
def idle_timeout(seconds)
|
333
369
|
@options[:idle_timeout] = Integer(seconds)
|
334
370
|
end
|
335
371
|
|
336
372
|
# Work around leaky apps that leave garbage in Thread locals
|
337
373
|
# across requests.
|
374
|
+
#
|
375
|
+
# The default is +false+.
|
376
|
+
#
|
377
|
+
# @example
|
378
|
+
# clean_thread_locals
|
379
|
+
#
|
338
380
|
def clean_thread_locals(which=true)
|
339
381
|
@options[:clean_thread_locals] = which
|
340
382
|
end
|
@@ -342,6 +384,7 @@ module Puma
|
|
342
384
|
# When shutting down, drain the accept socket of pending connections and
|
343
385
|
# process them. This loops over the accept socket until there are no more
|
344
386
|
# read events and then stops looking and waits for the requests to finish.
|
387
|
+
#
|
345
388
|
# @see Puma::Server#graceful_shutdown
|
346
389
|
#
|
347
390
|
def drain_on_shutdown(which=true)
|
@@ -355,18 +398,22 @@ module Puma
|
|
355
398
|
#
|
356
399
|
# @example
|
357
400
|
# environment 'production'
|
401
|
+
#
|
358
402
|
def environment(environment)
|
359
403
|
@options[:environment] = environment
|
360
404
|
end
|
361
405
|
|
362
|
-
# How long to wait for threads to stop when shutting them
|
363
|
-
#
|
364
|
-
#
|
365
|
-
# is the number of seconds to wait.
|
406
|
+
# How long to wait for threads to stop when shutting them down.
|
407
|
+
# Specifying :immediately will cause Puma to kill the threads immediately.
|
408
|
+
# Otherwise the value is the number of seconds to wait.
|
366
409
|
#
|
367
410
|
# Puma always waits a few seconds after killing a thread for it to try
|
368
411
|
# to finish up it's work, even in :immediately mode.
|
412
|
+
#
|
413
|
+
# The default is +:forever+.
|
414
|
+
#
|
369
415
|
# @see Puma::Server#graceful_shutdown
|
416
|
+
#
|
370
417
|
def force_shutdown_after(val=:forever)
|
371
418
|
i = case val
|
372
419
|
when :forever
|
@@ -389,6 +436,7 @@ module Puma
|
|
389
436
|
# on_restart do
|
390
437
|
# puts 'On restart...'
|
391
438
|
# end
|
439
|
+
#
|
392
440
|
def on_restart(&block)
|
393
441
|
@options[:on_restart] ||= []
|
394
442
|
@options[:on_restart] << block
|
@@ -400,6 +448,7 @@ module Puma
|
|
400
448
|
#
|
401
449
|
# @example
|
402
450
|
# restart_command '/u/app/lolcat/bin/restart_puma'
|
451
|
+
#
|
403
452
|
def restart_command(cmd)
|
404
453
|
@options[:restart_cmd] = cmd.to_s
|
405
454
|
end
|
@@ -408,31 +457,49 @@ module Puma
|
|
408
457
|
#
|
409
458
|
# @example
|
410
459
|
# pidfile '/u/apps/lolcat/tmp/pids/puma.pid'
|
460
|
+
#
|
411
461
|
def pidfile(path)
|
412
462
|
@options[:pidfile] = path.to_s
|
413
463
|
end
|
414
464
|
|
415
|
-
# Disable request logging,
|
465
|
+
# Disable request logging, the inverse of `log_requests`.
|
466
|
+
#
|
467
|
+
# The default is +true+.
|
416
468
|
#
|
417
469
|
# @example
|
418
470
|
# quiet
|
471
|
+
#
|
419
472
|
def quiet(which=true)
|
420
473
|
@options[:log_requests] = !which
|
421
474
|
end
|
422
475
|
|
423
|
-
# Enable request logging
|
476
|
+
# Enable request logging, the inverse of `quiet`.
|
477
|
+
#
|
478
|
+
# The default is +false+.
|
479
|
+
#
|
480
|
+
# @example
|
481
|
+
# log_requests
|
424
482
|
#
|
425
483
|
def log_requests(which=true)
|
426
484
|
@options[:log_requests] = which
|
427
485
|
end
|
428
486
|
|
429
487
|
# Pass in a custom logging class instance
|
488
|
+
#
|
489
|
+
# @example
|
490
|
+
# custom_logger Logger.new('t.log')
|
491
|
+
#
|
430
492
|
def custom_logger(custom_logger)
|
431
493
|
@options[:custom_logger] = custom_logger
|
432
494
|
end
|
433
495
|
|
434
496
|
# Show debugging info
|
435
497
|
#
|
498
|
+
# The default is +false+.
|
499
|
+
#
|
500
|
+
# @example
|
501
|
+
# debug
|
502
|
+
#
|
436
503
|
def debug
|
437
504
|
@options[:debug] = true
|
438
505
|
end
|
@@ -443,6 +510,7 @@ module Puma
|
|
443
510
|
#
|
444
511
|
# @example
|
445
512
|
# rackup '/u/apps/lolcat/config.ru'
|
513
|
+
#
|
446
514
|
def rackup(path)
|
447
515
|
@options[:rackup] ||= path.to_s
|
448
516
|
end
|
@@ -450,21 +518,32 @@ module Puma
|
|
450
518
|
# Allows setting `env['rack.url_scheme']`.
|
451
519
|
# Only necessary if X-Forwarded-Proto is not being set by your proxy
|
452
520
|
# Normal values are 'http' or 'https'.
|
521
|
+
#
|
453
522
|
def rack_url_scheme(scheme=nil)
|
454
523
|
@options[:rack_url_scheme] = scheme
|
455
524
|
end
|
456
525
|
|
526
|
+
# Enable HTTP 103 Early Hints responses.
|
527
|
+
#
|
528
|
+
# The default is +nil+.
|
529
|
+
#
|
530
|
+
# @example
|
531
|
+
# early_hints
|
532
|
+
#
|
457
533
|
def early_hints(answer=true)
|
458
534
|
@options[:early_hints] = answer
|
459
535
|
end
|
460
536
|
|
461
537
|
# Redirect +STDOUT+ and +STDERR+ to files specified. The +append+ parameter
|
462
|
-
# specifies whether the output is appended
|
538
|
+
# specifies whether the output is appended.
|
539
|
+
#
|
540
|
+
# The default is +false+.
|
463
541
|
#
|
464
542
|
# @example
|
465
543
|
# stdout_redirect '/app/lolcat/log/stdout', '/app/lolcat/log/stderr'
|
466
544
|
# @example
|
467
545
|
# stdout_redirect '/app/lolcat/log/stdout', '/app/lolcat/log/stderr', true
|
546
|
+
#
|
468
547
|
def stdout_redirect(stdout=nil, stderr=nil, append=false)
|
469
548
|
@options[:redirect_stdout] = stdout
|
470
549
|
@options[:redirect_stderr] = stderr
|
@@ -475,8 +554,9 @@ module Puma
|
|
475
554
|
@options[:log_formatter] = block
|
476
555
|
end
|
477
556
|
|
478
|
-
# Configure
|
479
|
-
#
|
557
|
+
# Configure the number of threads to use to answer requests.
|
558
|
+
#
|
559
|
+
# It can be a single fixed number, or a +min+ and a +max+.
|
480
560
|
#
|
481
561
|
# The default is the environment variables +PUMA_MIN_THREADS+ / +PUMA_MAX_THREADS+
|
482
562
|
# (or +MIN_THREADS+ / +MAX_THREADS+ if the +PUMA_+ variables aren't set).
|
@@ -484,10 +564,13 @@ module Puma
|
|
484
564
|
# If these environment variables aren't set, the default is "0, 5" in MRI or "0, 16" for other interpreters.
|
485
565
|
#
|
486
566
|
# @example
|
567
|
+
# threads 5
|
568
|
+
# @example
|
487
569
|
# threads 0, 16
|
488
570
|
# @example
|
489
571
|
# threads 5, 5
|
490
|
-
|
572
|
+
#
|
573
|
+
def threads(min, max = min)
|
491
574
|
min = Integer(min)
|
492
575
|
max = Integer(max)
|
493
576
|
if min > max
|
@@ -527,6 +610,7 @@ module Puma
|
|
527
610
|
# cert: path_to_cert,
|
528
611
|
# key: path_to_key,
|
529
612
|
# ssl_cipher_filter: cipher_filter, # optional
|
613
|
+
# ssl_ciphersuites: ciphersuites, # optional
|
530
614
|
# verify_mode: verify_mode, # default 'none'
|
531
615
|
# verification_flags: flags, # optional, not supported by JRuby
|
532
616
|
# reuse: true # optional
|
@@ -549,6 +633,7 @@ module Puma
|
|
549
633
|
# ssl_cipher_list: cipher_list, # optional
|
550
634
|
# verify_mode: verify_mode # default 'none'
|
551
635
|
# }
|
636
|
+
#
|
552
637
|
def ssl_bind(host, port, opts = {})
|
553
638
|
add_pem_values_to_options_store(opts)
|
554
639
|
bind self.class.ssl_bind_str(host, port, opts)
|
@@ -559,6 +644,7 @@ module Puma
|
|
559
644
|
#
|
560
645
|
# @example
|
561
646
|
# state_path '/u/apps/lolcat/tmp/pids/puma.state'
|
647
|
+
#
|
562
648
|
def state_path(path)
|
563
649
|
@options[:state] = path.to_s
|
564
650
|
end
|
@@ -567,6 +653,7 @@ module Puma
|
|
567
653
|
#
|
568
654
|
# @example
|
569
655
|
# state_permission 0600
|
656
|
+
#
|
570
657
|
# @version 5.0.0
|
571
658
|
#
|
572
659
|
def state_permission(permission)
|
@@ -580,7 +667,12 @@ module Puma
|
|
580
667
|
# set, otherwise 0.
|
581
668
|
#
|
582
669
|
# @note Cluster mode only.
|
670
|
+
#
|
671
|
+
# @example
|
672
|
+
# workers 2
|
673
|
+
#
|
583
674
|
# @see Puma::Cluster
|
675
|
+
#
|
584
676
|
def workers(count)
|
585
677
|
@options[:workers] = count.to_i
|
586
678
|
end
|
@@ -598,12 +690,24 @@ module Puma
|
|
598
690
|
#
|
599
691
|
# Moving from workers = 1 to workers = 0 will save 10-30% of memory use.
|
600
692
|
#
|
693
|
+
# The default is +false+.
|
694
|
+
#
|
601
695
|
# @note Cluster mode only.
|
696
|
+
#
|
697
|
+
# @example
|
698
|
+
# silence_single_worker_warning
|
699
|
+
#
|
602
700
|
def silence_single_worker_warning
|
603
701
|
@options[:silence_single_worker_warning] = true
|
604
702
|
end
|
605
703
|
|
606
704
|
# Disable warning message when running single mode with callback hook defined.
|
705
|
+
#
|
706
|
+
# The default is +false+.
|
707
|
+
#
|
708
|
+
# @example
|
709
|
+
# silence_fork_callback_warning
|
710
|
+
#
|
607
711
|
def silence_fork_callback_warning
|
608
712
|
@options[:silence_fork_callback_warning] = true
|
609
713
|
end
|
@@ -618,10 +722,12 @@ module Puma
|
|
618
722
|
# This can be called multiple times to add several hooks.
|
619
723
|
#
|
620
724
|
# @note Cluster mode only.
|
725
|
+
#
|
621
726
|
# @example
|
622
727
|
# before_fork do
|
623
728
|
# puts "Starting workers..."
|
624
729
|
# end
|
730
|
+
#
|
625
731
|
def before_fork(&block)
|
626
732
|
warn_if_in_single_mode('before_fork')
|
627
733
|
|
@@ -635,10 +741,12 @@ module Puma
|
|
635
741
|
# This can be called multiple times to add several hooks.
|
636
742
|
#
|
637
743
|
# @note Cluster mode only.
|
744
|
+
#
|
638
745
|
# @example
|
639
746
|
# on_worker_boot do
|
640
747
|
# puts 'Before worker boot...'
|
641
748
|
# end
|
749
|
+
#
|
642
750
|
def on_worker_boot(key = nil, &block)
|
643
751
|
warn_if_in_single_mode('on_worker_boot')
|
644
752
|
|
@@ -646,17 +754,20 @@ module Puma
|
|
646
754
|
end
|
647
755
|
|
648
756
|
# Code to run immediately before a worker shuts
|
649
|
-
# down (after it has finished processing HTTP requests).
|
757
|
+
# down (after it has finished processing HTTP requests). The worker's
|
758
|
+
# index is passed as an argument. These hooks
|
650
759
|
# can block if necessary to wait for background operations unknown
|
651
760
|
# to Puma to finish before the process terminates.
|
652
761
|
#
|
653
762
|
# This can be called multiple times to add several hooks.
|
654
763
|
#
|
655
764
|
# @note Cluster mode only.
|
765
|
+
#
|
656
766
|
# @example
|
657
767
|
# on_worker_shutdown do
|
658
768
|
# puts 'On worker shutdown...'
|
659
769
|
# end
|
770
|
+
#
|
660
771
|
def on_worker_shutdown(key = nil, &block)
|
661
772
|
warn_if_in_single_mode('on_worker_shutdown')
|
662
773
|
|
@@ -669,10 +780,12 @@ module Puma
|
|
669
780
|
# This can be called multiple times to add several hooks.
|
670
781
|
#
|
671
782
|
# @note Cluster mode only.
|
783
|
+
#
|
672
784
|
# @example
|
673
785
|
# on_worker_fork do
|
674
786
|
# puts 'Before worker fork...'
|
675
787
|
# end
|
788
|
+
#
|
676
789
|
def on_worker_fork(&block)
|
677
790
|
warn_if_in_single_mode('on_worker_fork')
|
678
791
|
|
@@ -685,10 +798,12 @@ module Puma
|
|
685
798
|
# This is called everytime a worker is to be started.
|
686
799
|
#
|
687
800
|
# @note Cluster mode only.
|
801
|
+
#
|
688
802
|
# @example
|
689
803
|
# after_worker_fork do
|
690
804
|
# puts 'After worker fork...'
|
691
805
|
# end
|
806
|
+
#
|
692
807
|
def after_worker_fork(&block)
|
693
808
|
warn_if_in_single_mode('after_worker_fork')
|
694
809
|
|
@@ -703,10 +818,22 @@ module Puma
|
|
703
818
|
# on_booted do
|
704
819
|
# puts 'After booting...'
|
705
820
|
# end
|
821
|
+
#
|
706
822
|
def on_booted(&block)
|
707
823
|
@config.options[:events].on_booted(&block)
|
708
824
|
end
|
709
825
|
|
826
|
+
# Code to run after puma is stopped (works for both: single and clustered)
|
827
|
+
#
|
828
|
+
# @example
|
829
|
+
# on_stopped do
|
830
|
+
# puts 'After stopping...'
|
831
|
+
# end
|
832
|
+
#
|
833
|
+
def on_stopped(&block)
|
834
|
+
@config.options[:events].on_stopped(&block)
|
835
|
+
end
|
836
|
+
|
710
837
|
# When `fork_worker` is enabled, code to run in Worker 0
|
711
838
|
# before all other workers are re-forked from this process,
|
712
839
|
# after the server has temporarily stopped serving requests
|
@@ -719,10 +846,12 @@ module Puma
|
|
719
846
|
# This can be called multiple times to add several hooks.
|
720
847
|
#
|
721
848
|
# @note Cluster mode with `fork_worker` enabled only.
|
849
|
+
#
|
722
850
|
# @example
|
723
851
|
# on_refork do
|
724
852
|
# 3.times {GC.start}
|
725
853
|
# end
|
854
|
+
#
|
726
855
|
# @version 5.0.0
|
727
856
|
#
|
728
857
|
def on_refork(key = nil, &block)
|
@@ -745,6 +874,7 @@ module Puma
|
|
745
874
|
# on_thread_start do
|
746
875
|
# puts 'On thread start...'
|
747
876
|
# end
|
877
|
+
#
|
748
878
|
def on_thread_start(&block)
|
749
879
|
@options[:before_thread_start] ||= []
|
750
880
|
@options[:before_thread_start] << block
|
@@ -769,6 +899,7 @@ module Puma
|
|
769
899
|
# on_thread_exit do
|
770
900
|
# puts 'On thread exit...'
|
771
901
|
# end
|
902
|
+
#
|
772
903
|
def on_thread_exit(&block)
|
773
904
|
@options[:before_thread_exit] ||= []
|
774
905
|
@options[:before_thread_exit] << block
|
@@ -783,6 +914,7 @@ module Puma
|
|
783
914
|
# or scheduling asynchronous tasks to execute after a response.
|
784
915
|
#
|
785
916
|
# This can be called multiple times to add several hooks.
|
917
|
+
#
|
786
918
|
def out_of_band(&block)
|
787
919
|
process_hook :out_of_band, nil, block, 'out_of_band'
|
788
920
|
end
|
@@ -793,16 +925,21 @@ module Puma
|
|
793
925
|
#
|
794
926
|
# @example
|
795
927
|
# directory '/u/apps/lolcat'
|
928
|
+
#
|
796
929
|
def directory(dir)
|
797
930
|
@options[:directory] = dir.to_s
|
798
931
|
end
|
799
932
|
|
800
933
|
# Preload the application before starting the workers; this conflicts with
|
801
|
-
# phased restart feature.
|
934
|
+
# phased restart feature.
|
935
|
+
#
|
936
|
+
# The default is +true+ if your app uses more than 1 worker.
|
802
937
|
#
|
803
938
|
# @note Cluster mode only.
|
939
|
+
#
|
804
940
|
# @example
|
805
941
|
# preload_app!
|
942
|
+
#
|
806
943
|
def preload_app!(answer=true)
|
807
944
|
@options[:preload_app] = answer
|
808
945
|
end
|
@@ -814,6 +951,7 @@ module Puma
|
|
814
951
|
# lowlevel_error_handler do |err|
|
815
952
|
# [200, {}, ["error page"]]
|
816
953
|
# end
|
954
|
+
#
|
817
955
|
def lowlevel_error_handler(obj=nil, &block)
|
818
956
|
obj ||= block
|
819
957
|
raise "Provide either a #call'able or a block" unless obj
|
@@ -833,23 +971,26 @@ module Puma
|
|
833
971
|
# new Bundler context and thus can float around as the release
|
834
972
|
# dictates.
|
835
973
|
#
|
836
|
-
# @see extra_runtime_dependencies
|
837
|
-
#
|
838
974
|
# @note This is incompatible with +preload_app!+.
|
839
975
|
# @note This is only supported for RubyGems 2.2+
|
976
|
+
#
|
977
|
+
# @see extra_runtime_dependencies
|
978
|
+
#
|
840
979
|
def prune_bundler(answer=true)
|
841
980
|
@options[:prune_bundler] = answer
|
842
981
|
end
|
843
982
|
|
844
|
-
#
|
845
|
-
#
|
846
|
-
# with this option.
|
983
|
+
# Raises a SignalException when SIGTERM is received. In environments where
|
984
|
+
# SIGTERM is something expected, you can suppress these with this option.
|
847
985
|
#
|
848
986
|
# This can be useful for example in Kubernetes, where rolling restart is
|
849
|
-
# guaranteed usually on infrastructure level.
|
987
|
+
# guaranteed usually on the infrastructure level.
|
988
|
+
#
|
989
|
+
# The default is +true+.
|
850
990
|
#
|
851
991
|
# @example
|
852
992
|
# raise_exception_on_sigterm false
|
993
|
+
#
|
853
994
|
# @see Puma::Launcher#setup_signals
|
854
995
|
# @see Puma::Cluster#setup_signals
|
855
996
|
#
|
@@ -868,6 +1009,7 @@ module Puma
|
|
868
1009
|
# extra_runtime_dependencies ['gem_name_1', 'gem_name_2']
|
869
1010
|
# @example
|
870
1011
|
# extra_runtime_dependencies ['puma_worker_killer', 'puma-heroku']
|
1012
|
+
#
|
871
1013
|
# @see Puma::Launcher#extra_runtime_deps_directories
|
872
1014
|
#
|
873
1015
|
def extra_runtime_dependencies(answer = [])
|
@@ -879,21 +1021,26 @@ module Puma
|
|
879
1021
|
# If you do not specify a tag, Puma will infer it. If you do not want Puma
|
880
1022
|
# to add a tag, use an empty string.
|
881
1023
|
#
|
1024
|
+
# The default is the current file or directory base name.
|
1025
|
+
#
|
882
1026
|
# @example
|
883
1027
|
# tag 'app name'
|
884
1028
|
# @example
|
885
1029
|
# tag ''
|
1030
|
+
#
|
886
1031
|
def tag(string)
|
887
1032
|
@options[:tag] = string.to_s
|
888
1033
|
end
|
889
1034
|
|
890
1035
|
# Change the default interval for checking workers.
|
891
1036
|
#
|
892
|
-
# The default
|
1037
|
+
# The default is 5 seconds.
|
893
1038
|
#
|
894
1039
|
# @note Cluster mode only.
|
1040
|
+
#
|
895
1041
|
# @example
|
896
|
-
# worker_check_interval
|
1042
|
+
# worker_check_interval 10
|
1043
|
+
#
|
897
1044
|
# @see Puma::Cluster#check_workers
|
898
1045
|
#
|
899
1046
|
def worker_check_interval(interval)
|
@@ -906,11 +1053,14 @@ module Puma
|
|
906
1053
|
# Setting this value will not protect against slow requests.
|
907
1054
|
#
|
908
1055
|
# This value must be greater than worker_check_interval.
|
909
|
-
#
|
1056
|
+
#
|
1057
|
+
# The default is 60 seconds.
|
910
1058
|
#
|
911
1059
|
# @note Cluster mode only.
|
1060
|
+
#
|
912
1061
|
# @example
|
913
1062
|
# worker_timeout 60
|
1063
|
+
#
|
914
1064
|
# @see Puma::Cluster::Worker#ping_timeout
|
915
1065
|
#
|
916
1066
|
def worker_timeout(timeout)
|
@@ -926,12 +1076,13 @@ module Puma
|
|
926
1076
|
|
927
1077
|
# Change the default worker timeout for booting.
|
928
1078
|
#
|
929
|
-
#
|
1079
|
+
# The default is the value of `worker_timeout`.
|
930
1080
|
#
|
931
1081
|
# @note Cluster mode only.
|
932
1082
|
#
|
933
1083
|
# @example
|
934
1084
|
# worker_boot_timeout 60
|
1085
|
+
#
|
935
1086
|
# @see Puma::Cluster::Worker#ping_timeout
|
936
1087
|
#
|
937
1088
|
def worker_boot_timeout(timeout)
|
@@ -940,7 +1091,13 @@ module Puma
|
|
940
1091
|
|
941
1092
|
# Set the timeout for worker shutdown.
|
942
1093
|
#
|
1094
|
+
# The default is 60 seconds.
|
1095
|
+
#
|
943
1096
|
# @note Cluster mode only.
|
1097
|
+
#
|
1098
|
+
# @example
|
1099
|
+
# worker_shutdown_timeout 90
|
1100
|
+
#
|
944
1101
|
# @see Puma::Cluster::Worker#term
|
945
1102
|
#
|
946
1103
|
def worker_shutdown_timeout(timeout)
|
@@ -956,9 +1113,13 @@ module Puma
|
|
956
1113
|
# 2. **:oldest** - the oldest workers (i.e. the workers that were started
|
957
1114
|
# the longest time ago) will be culled.
|
958
1115
|
#
|
1116
|
+
# The default is +:youngest+.
|
1117
|
+
#
|
959
1118
|
# @note Cluster mode only.
|
1119
|
+
#
|
960
1120
|
# @example
|
961
1121
|
# worker_culling_strategy :oldest
|
1122
|
+
#
|
962
1123
|
# @see Puma::Cluster#cull_workers
|
963
1124
|
#
|
964
1125
|
def worker_culling_strategy(strategy)
|
@@ -971,7 +1132,7 @@ module Puma
|
|
971
1132
|
@options[:worker_culling_strategy] = strategy
|
972
1133
|
end
|
973
1134
|
|
974
|
-
# When set to true
|
1135
|
+
# When set to true, workers accept all requests
|
975
1136
|
# and queue them before passing them to the handlers.
|
976
1137
|
# When set to false, each worker process accepts exactly as
|
977
1138
|
# many requests as it is configured to simultaneously handle.
|
@@ -984,7 +1145,11 @@ module Puma
|
|
984
1145
|
# slow clients will occupy a handler thread while the request
|
985
1146
|
# is being sent. A reverse proxy, such as nginx, can handle
|
986
1147
|
# slow clients and queue requests before they reach Puma.
|
1148
|
+
#
|
1149
|
+
# The default is +true+.
|
1150
|
+
#
|
987
1151
|
# @see Puma::Server
|
1152
|
+
#
|
988
1153
|
def queue_requests(answer=true)
|
989
1154
|
@options[:queue_requests] = answer
|
990
1155
|
end
|
@@ -1002,9 +1167,13 @@ module Puma
|
|
1002
1167
|
# listening on the socket, allowing workers which are not processing any
|
1003
1168
|
# requests to pick up new requests first.
|
1004
1169
|
#
|
1170
|
+
# The default is 0.005 seconds.
|
1171
|
+
#
|
1005
1172
|
# Only works on MRI. For all other interpreters, this setting does nothing.
|
1173
|
+
#
|
1006
1174
|
# @see Puma::Server#handle_servers
|
1007
1175
|
# @see Puma::ThreadPool#wait_for_less_busy_worker
|
1176
|
+
#
|
1008
1177
|
# @version 5.0.0
|
1009
1178
|
#
|
1010
1179
|
def wait_for_less_busy_worker(val=0.005)
|
@@ -1018,7 +1187,7 @@ module Puma
|
|
1018
1187
|
#
|
1019
1188
|
# There are 5 possible values:
|
1020
1189
|
#
|
1021
|
-
# 1. **:socket**
|
1190
|
+
# 1. **:socket** - read the peername from the socket using the
|
1022
1191
|
# syscall. This is the normal behavior. If this fails for any reason (e.g.,
|
1023
1192
|
# if the peer disconnects between the connection being accepted and the getpeername
|
1024
1193
|
# system call), Puma will return "0.0.0.0"
|
@@ -1036,6 +1205,11 @@ module Puma
|
|
1036
1205
|
# you wish. Because Puma never uses this field anyway, it's format is
|
1037
1206
|
# entirely in your hands.
|
1038
1207
|
#
|
1208
|
+
# The default is +:socket+.
|
1209
|
+
#
|
1210
|
+
# @example
|
1211
|
+
# set_remote_address :localhost
|
1212
|
+
#
|
1039
1213
|
def set_remote_address(val=:socket)
|
1040
1214
|
case val
|
1041
1215
|
when :socket
|
@@ -1076,6 +1250,7 @@ module Puma
|
|
1076
1250
|
# (default 1000), or pass 0 to disable auto refork.
|
1077
1251
|
#
|
1078
1252
|
# @note Cluster mode only.
|
1253
|
+
#
|
1079
1254
|
# @version 5.0.0
|
1080
1255
|
#
|
1081
1256
|
def fork_worker(after_requests=1000)
|
@@ -1085,10 +1260,41 @@ module Puma
|
|
1085
1260
|
# The number of requests to attempt inline before sending a client back to
|
1086
1261
|
# the reactor to be subject to normal ordering.
|
1087
1262
|
#
|
1263
|
+
# The default is 10.
|
1264
|
+
#
|
1265
|
+
# @example
|
1266
|
+
# max_fast_inline 20
|
1267
|
+
#
|
1088
1268
|
def max_fast_inline(num_of_requests)
|
1089
1269
|
@options[:max_fast_inline] = Float(num_of_requests)
|
1090
1270
|
end
|
1091
1271
|
|
1272
|
+
# When `true`, keep-alive connections are maintained on inbound requests.
|
1273
|
+
# Enabling this setting reduces the number of TCP operations, reducing response
|
1274
|
+
# times for connections that can send multiple requests in a single connection.
|
1275
|
+
#
|
1276
|
+
# When Puma receives more incoming connections than available Puma threads,
|
1277
|
+
# enabling the keep-alive behavior may result in processing requests out-of-order,
|
1278
|
+
# increasing overall response time variance. Increased response time variance
|
1279
|
+
# means that the overall average of response times might not change, but more
|
1280
|
+
# outliers will exist. Those long-tail outliers may significantly affect response
|
1281
|
+
# times for some processed requests.
|
1282
|
+
#
|
1283
|
+
# When `false`, Puma closes the connection after each request, requiring the
|
1284
|
+
# client to open a new request. Disabling this setting guarantees that requests
|
1285
|
+
# will be processed in the order they are fully received, decreasing response
|
1286
|
+
# variance and eliminating long-tail outliers caused by keep-alive behavior.
|
1287
|
+
# The trade-off is that the number of TCP operations required will increase.
|
1288
|
+
#
|
1289
|
+
# The default is +true+.
|
1290
|
+
#
|
1291
|
+
# @example
|
1292
|
+
# enable_keep_alives false
|
1293
|
+
#
|
1294
|
+
def enable_keep_alives(enabled=true)
|
1295
|
+
@options[:enable_keep_alives] = enabled
|
1296
|
+
end
|
1297
|
+
|
1092
1298
|
# Specify the backend for the IO selector.
|
1093
1299
|
#
|
1094
1300
|
# Provided values will be passed directly to +NIO::Selector.new+, with the
|
@@ -1108,6 +1314,14 @@ module Puma
|
|
1108
1314
|
@options[:io_selector_backend] = backend.to_sym
|
1109
1315
|
end
|
1110
1316
|
|
1317
|
+
# Ensures +STDOUT+ and +STDERR+ is immediately flushed to the underlying
|
1318
|
+
# operating system and is not buffered internally
|
1319
|
+
#
|
1320
|
+
# The default is +true+.
|
1321
|
+
#
|
1322
|
+
# @example
|
1323
|
+
# mutate_stdout_and_stderr_to_sync_on_write false
|
1324
|
+
#
|
1111
1325
|
def mutate_stdout_and_stderr_to_sync_on_write(enabled=true)
|
1112
1326
|
@options[:mutate_stdout_and_stderr_to_sync_on_write] = enabled
|
1113
1327
|
end
|
@@ -1119,8 +1333,12 @@ module Puma
|
|
1119
1333
|
#
|
1120
1334
|
# When no Content-Length http header is present, it is compared against the
|
1121
1335
|
# size of the body of the request.
|
1122
|
-
|
1123
|
-
# The default
|
1336
|
+
#
|
1337
|
+
# The default is +nil+.
|
1338
|
+
#
|
1339
|
+
# @example
|
1340
|
+
# http_content_length_limit 2_000_000_000
|
1341
|
+
#
|
1124
1342
|
def http_content_length_limit(limit)
|
1125
1343
|
@options[:http_content_length_limit] = limit
|
1126
1344
|
end
|
@@ -1161,6 +1379,7 @@ module Puma
|
|
1161
1379
|
|
1162
1380
|
# To avoid adding cert_pem and key_pem as URI params, we store them on the
|
1163
1381
|
# options[:store] from where Puma binder knows how to find and extract them.
|
1382
|
+
#
|
1164
1383
|
def add_pem_values_to_options_store(opts)
|
1165
1384
|
return if defined?(JRUBY_VERSION)
|
1166
1385
|
|