puma 2.2.0 → 8.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/History.md +3334 -0
- data/LICENSE +23 -20
- data/README.md +387 -100
- data/bin/puma-wild +25 -0
- data/bin/pumactl +1 -1
- data/docs/5.0-Upgrade.md +98 -0
- data/docs/6.0-Upgrade.md +56 -0
- data/docs/7.0-Upgrade.md +52 -0
- data/docs/8.0-Upgrade.md +100 -0
- data/docs/architecture.md +74 -0
- data/docs/compile_options.md +55 -0
- data/docs/deployment.md +137 -0
- data/docs/fork_worker.md +41 -0
- data/docs/grpc.md +62 -0
- data/docs/images/favicon.svg +1 -0
- data/docs/images/puma-connection-flow-no-reactor.png +0 -0
- data/docs/images/puma-connection-flow.png +0 -0
- data/docs/images/puma-general-arch.png +0 -0
- data/docs/images/running-puma.svg +1 -0
- data/docs/images/standard-logo.svg +1 -0
- data/docs/java_options.md +54 -0
- data/docs/jungle/README.md +9 -0
- data/docs/jungle/rc.d/README.md +74 -0
- data/docs/jungle/rc.d/puma +61 -0
- data/docs/jungle/rc.d/puma.conf +10 -0
- data/docs/kubernetes.md +73 -0
- data/docs/nginx.md +5 -5
- data/docs/plugins.md +42 -0
- data/docs/rails_dev_mode.md +28 -0
- data/docs/restart.md +65 -0
- data/docs/signals.md +98 -0
- data/docs/stats.md +148 -0
- data/docs/systemd.md +253 -0
- data/docs/testing_benchmarks_local_files.md +150 -0
- data/docs/testing_test_rackup_ci_files.md +36 -0
- data/ext/puma_http11/PumaHttp11Service.java +2 -2
- data/ext/puma_http11/extconf.rb +59 -2
- data/ext/puma_http11/http11_parser.c +319 -487
- data/ext/puma_http11/http11_parser.h +15 -13
- data/ext/puma_http11/http11_parser.java.rl +64 -94
- data/ext/puma_http11/http11_parser.rl +27 -24
- data/ext/puma_http11/http11_parser_common.rl +8 -8
- data/ext/puma_http11/mini_ssl.c +696 -38
- data/ext/puma_http11/no_ssl/PumaHttp11Service.java +15 -0
- data/ext/puma_http11/org/jruby/puma/EnvKey.java +241 -0
- data/ext/puma_http11/org/jruby/puma/Http11.java +241 -145
- data/ext/puma_http11/org/jruby/puma/Http11Parser.java +174 -221
- data/ext/puma_http11/org/jruby/puma/MiniSSL.java +413 -193
- data/ext/puma_http11/puma_http11.c +183 -175
- data/lib/puma/app/status.rb +77 -29
- data/lib/puma/binder.rb +349 -119
- data/lib/puma/cli.rb +163 -801
- data/lib/puma/client.rb +627 -144
- data/lib/puma/client_env.rb +171 -0
- data/lib/puma/cluster/worker.rb +183 -0
- data/lib/puma/cluster/worker_handle.rb +127 -0
- data/lib/puma/cluster.rb +634 -0
- data/lib/puma/cluster_accept_loop_delay.rb +91 -0
- data/lib/puma/commonlogger.rb +115 -0
- data/lib/puma/configuration.rb +420 -198
- data/lib/puma/const.rb +266 -115
- data/lib/puma/control_cli.rb +219 -120
- data/lib/puma/detect.rb +56 -2
- data/lib/puma/dsl.rb +1562 -0
- data/lib/puma/error_logger.rb +115 -0
- data/lib/puma/events.rb +44 -60
- data/lib/puma/io_buffer.rb +48 -5
- data/lib/puma/jruby_restart.rb +2 -51
- data/lib/puma/json_serialization.rb +96 -0
- data/lib/puma/launcher/bundle_pruner.rb +102 -0
- data/lib/puma/launcher.rb +501 -0
- data/lib/puma/log_writer.rb +153 -0
- data/lib/puma/minissl/context_builder.rb +96 -0
- data/lib/puma/minissl.rb +355 -37
- data/lib/puma/null_io.rb +79 -12
- data/lib/puma/plugin/systemd.rb +90 -0
- data/lib/puma/plugin/tmp_restart.rb +36 -0
- data/lib/puma/plugin.rb +111 -0
- data/lib/puma/rack/builder.rb +297 -0
- data/lib/puma/rack/urlmap.rb +93 -0
- data/lib/puma/rack_default.rb +21 -4
- data/lib/puma/reactor.rb +102 -133
- data/lib/puma/response.rb +532 -0
- data/lib/puma/runner.rb +211 -0
- data/lib/puma/sd_notify.rb +146 -0
- data/lib/puma/server.rb +582 -445
- data/lib/puma/server_plugin_control.rb +32 -0
- data/lib/puma/single.rb +72 -0
- data/lib/puma/state_file.rb +69 -0
- data/lib/puma/thread_pool.rb +389 -57
- data/lib/puma/util.rb +125 -0
- data/lib/puma.rb +80 -6
- data/lib/rack/handler/puma.rb +125 -47
- data/tools/Dockerfile +26 -0
- data/tools/trickletest.rb +44 -0
- metadata +88 -148
- data/COPYING +0 -55
- data/Gemfile +0 -10
- data/History.txt +0 -302
- data/Manifest.txt +0 -60
- data/Rakefile +0 -165
- data/TODO +0 -5
- data/docs/config.md +0 -0
- data/ext/puma_http11/ext_help.h +0 -15
- data/ext/puma_http11/io_buffer.c +0 -154
- data/lib/puma/accept_nonblock.rb +0 -23
- data/lib/puma/capistrano.rb +0 -34
- data/lib/puma/compat.rb +0 -11
- data/lib/puma/daemon_ext.rb +0 -20
- data/lib/puma/delegation.rb +0 -11
- data/lib/puma/java_io_buffer.rb +0 -45
- data/lib/puma/rack_patch.rb +0 -25
- data/puma.gemspec +0 -45
- data/test/test_app_status.rb +0 -88
- data/test/test_cli.rb +0 -171
- data/test/test_config.rb +0 -16
- data/test/test_http10.rb +0 -27
- data/test/test_http11.rb +0 -126
- data/test/test_integration.rb +0 -154
- data/test/test_iobuffer.rb +0 -38
- data/test/test_minissl.rb +0 -25
- data/test/test_null_io.rb +0 -31
- data/test/test_persistent.rb +0 -238
- data/test/test_puma_server.rb +0 -224
- data/test/test_rack_handler.rb +0 -10
- data/test/test_rack_server.rb +0 -141
- data/test/test_thread_pool.rb +0 -146
- data/test/test_unix_socket.rb +0 -39
- data/test/test_ws.rb +0 -89
- data/tools/jungle/init.d/README.md +0 -54
- data/tools/jungle/init.d/puma +0 -332
- data/tools/jungle/init.d/run-puma +0 -3
- data/tools/jungle/upstart/README.md +0 -61
- data/tools/jungle/upstart/puma-manager.conf +0 -31
- data/tools/jungle/upstart/puma.conf +0 -52
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Puma
|
|
2
|
+
# ServerPluginControl provides a control interface for server plugins to
|
|
3
|
+
# interact with and manage server settings dynamically.
|
|
4
|
+
#
|
|
5
|
+
# This class acts as a facade between plugins and the Puma server,
|
|
6
|
+
# allowing plugins to safely modify server configuration and thread pool
|
|
7
|
+
# settings without direct access to the server's internal state.
|
|
8
|
+
#
|
|
9
|
+
class ServerPluginControl
|
|
10
|
+
def initialize(server)
|
|
11
|
+
@server = server
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Returns the maximum number of threads in the thread pool.
|
|
15
|
+
def max_threads
|
|
16
|
+
@server.max_threads
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Returns the minimum number of threads in the thread pool.
|
|
20
|
+
def min_threads
|
|
21
|
+
@server.min_threads
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Updates the minimum and maximum number of threads in the thread pool.
|
|
25
|
+
#
|
|
26
|
+
# @see Puma::Server#update_thread_pool_min_max
|
|
27
|
+
#
|
|
28
|
+
def update_thread_pool_min_max(min: max_threads, max: min_threads)
|
|
29
|
+
@server.update_thread_pool_min_max(min: min, max: max)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
data/lib/puma/single.rb
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'runner'
|
|
4
|
+
require_relative 'detect'
|
|
5
|
+
require_relative 'plugin'
|
|
6
|
+
|
|
7
|
+
module Puma
|
|
8
|
+
# This class is instantiated by the `Puma::Launcher` and used
|
|
9
|
+
# to boot and serve a Ruby application when no puma "workers" are needed
|
|
10
|
+
# i.e. only using "threaded" mode. For example `$ puma -t 1:5`
|
|
11
|
+
#
|
|
12
|
+
# At the core of this class is running an instance of `Puma::Server` which
|
|
13
|
+
# gets created via the `start_server` method from the `Puma::Runner` class
|
|
14
|
+
# that this inherits from.
|
|
15
|
+
class Single < Runner
|
|
16
|
+
# @!attribute [r] stats
|
|
17
|
+
def stats
|
|
18
|
+
{
|
|
19
|
+
started_at: utc_iso8601(@started_at)
|
|
20
|
+
}.merge(@server&.stats || {}).merge(super)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def restart
|
|
24
|
+
@server&.begin_restart
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def stop
|
|
28
|
+
@server&.stop false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def halt
|
|
32
|
+
@server&.halt
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def stop_blocked
|
|
36
|
+
log "- Gracefully stopping, waiting for requests to finish"
|
|
37
|
+
@control&.stop true
|
|
38
|
+
@server&.stop true
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def run
|
|
42
|
+
output_header "single"
|
|
43
|
+
|
|
44
|
+
load_and_bind
|
|
45
|
+
|
|
46
|
+
Plugins.fire_background
|
|
47
|
+
|
|
48
|
+
@launcher.write_state
|
|
49
|
+
|
|
50
|
+
start_control
|
|
51
|
+
|
|
52
|
+
@server = start_server
|
|
53
|
+
server_thread = @server.run
|
|
54
|
+
|
|
55
|
+
log "Use Ctrl-C to stop"
|
|
56
|
+
|
|
57
|
+
warn_ruby_mn_threads
|
|
58
|
+
|
|
59
|
+
redirect_io
|
|
60
|
+
|
|
61
|
+
@events.fire_after_booted!
|
|
62
|
+
|
|
63
|
+
debug_loaded_extensions("Loaded Extensions:") if @log_writer.debug?
|
|
64
|
+
|
|
65
|
+
begin
|
|
66
|
+
server_thread.join
|
|
67
|
+
rescue Interrupt
|
|
68
|
+
# Swallow it
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Puma
|
|
4
|
+
|
|
5
|
+
# Puma::Launcher uses StateFile to write a yaml file for use with Puma::ControlCLI.
|
|
6
|
+
#
|
|
7
|
+
# In previous versions of Puma, YAML was used to read/write the state file.
|
|
8
|
+
# Since Puma is similar to Bundler/RubyGems in that it may load before one's app
|
|
9
|
+
# does, minimizing the dependencies that may be shared with the app is desired.
|
|
10
|
+
#
|
|
11
|
+
# At present, it only works with numeric and string values. It is still a valid
|
|
12
|
+
# yaml file, and the CI tests parse it with Psych.
|
|
13
|
+
#
|
|
14
|
+
class StateFile
|
|
15
|
+
|
|
16
|
+
ALLOWED_FIELDS = %w!control_url control_auth_token pid running_from!
|
|
17
|
+
|
|
18
|
+
def initialize
|
|
19
|
+
@options = {}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def save(path, permission = nil)
|
|
23
|
+
contents = +"---\n"
|
|
24
|
+
@options.each do |k,v|
|
|
25
|
+
next unless ALLOWED_FIELDS.include? k
|
|
26
|
+
case v
|
|
27
|
+
when Numeric
|
|
28
|
+
contents << "#{k}: #{v}\n"
|
|
29
|
+
when String
|
|
30
|
+
next if v.strip.empty?
|
|
31
|
+
contents << (k == 'running_from' || v.to_s.include?(' ') ?
|
|
32
|
+
"#{k}: \"#{v}\"\n" : "#{k}: #{v}\n")
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
if permission
|
|
37
|
+
File.write path, contents, mode: 'wb:UTF-8', perm: permission
|
|
38
|
+
else
|
|
39
|
+
File.write path, contents, mode: 'wb:UTF-8'
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def load(path)
|
|
44
|
+
File.read(path).lines.each do |line|
|
|
45
|
+
next if line.start_with? '#'
|
|
46
|
+
k,v = line.split ':', 2
|
|
47
|
+
next unless v && ALLOWED_FIELDS.include?(k)
|
|
48
|
+
v = v.strip
|
|
49
|
+
@options[k] =
|
|
50
|
+
case v
|
|
51
|
+
when '' then nil
|
|
52
|
+
when /\A\d+\z/ then v.to_i
|
|
53
|
+
when /\A\d+\.\d+\z/ then v.to_f
|
|
54
|
+
else v.gsub(/\A"|"\z/, '')
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
ALLOWED_FIELDS.each do |f|
|
|
60
|
+
define_method f.to_sym do
|
|
61
|
+
@options[f]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
define_method :"#{f}=" do |v|
|
|
65
|
+
@options[f] = v
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|