diff options
author | Dennis Schubert <mail@dennis-schubert.de> | 2022-09-09 05:33:37 +0300 |
---|---|---|
committer | Dennis Schubert <mail@dennis-schubert.de> | 2022-09-09 05:33:37 +0300 |
commit | 97cfc80a1fe6b712d15c13081cc938d3650fbdb1 (patch) | |
tree | 7a391584558791deb499babe54d9bd5a5e54c756 /config | |
parent | bb80ca33948a7b728cb9083d090c4f8fddbbaec2 (diff) |
Replace Unicorn with Puma
… and drop the single_process_mode. See the included Changelog entry
for full details on what this change means.
Diffstat (limited to 'config')
-rw-r--r-- | config/defaults.yml | 13 | ||||
-rw-r--r-- | config/diaspora.toml.example | 34 | ||||
-rw-r--r-- | config/eye.rb | 37 | ||||
-rw-r--r-- | config/initializers/sidekiq.rb | 10 | ||||
-rw-r--r-- | config/puma.rb | 47 | ||||
-rw-r--r-- | config/unicorn.rb | 48 |
6 files changed, 73 insertions, 116 deletions
diff --git a/config/defaults.yml b/config/defaults.yml index 49e2d3ccf..9680f358c 100644 --- a/config/defaults.yml +++ b/config/defaults.yml @@ -11,7 +11,6 @@ defaults: certificate_authorities: redis: require_ssl: true - single_process_mode: false sidekiq: concurrency: 5 retry: 10 @@ -40,14 +39,12 @@ defaults: sql: false federation: false server: - listen: '0.0.0.0:3000' + listen: "tcp://127.0.0.1:3000" rails_environment: 'development' pid: "tmp/pids/web.pid" stderr_log: stdout_log: - unicorn_worker: 2 - unicorn_timeout: 90 - embed_sidekiq_worker: false + web_timeout: 90 sidekiq_workers: 1 map: mapbox: @@ -179,23 +176,19 @@ development: environment: assets: serve: true - single_process_mode: true require_ssl: false logging: debug: sql: true - server: - unicorn_worker: 1 settings: autofollow_on_join: false autofollow_on_join_user: '' production: server: - listen: 'unix:tmp/diaspora.sock' + listen: 'unix://tmp/diaspora.sock' test: environment: url: 'http://localhost:9887/' - single_process_mode: true require_ssl: false assets: serve: true diff --git a/config/diaspora.toml.example b/config/diaspora.toml.example index 6304fb3fe..6401fc043 100644 --- a/config/diaspora.toml.example +++ b/config/diaspora.toml.example @@ -54,14 +54,6 @@ ## Do not change this default unless you are sure! #require_ssl = true -## Single-process mode (default=false). -## If set to true, Diaspora will work with just the appserver (Unicorn by -## default) running. However, this makes it quite slow as intensive jobs -## must be run all the time inside the request cycle. We strongly -## recommended you leave this disabled for production setups. -## Set to true to enable. -#single_process_mode = false - ## Set redirect URL for an external image host (Amazon S3 or other). ## If hosting images for your pod on an external server (even your own), ## add its URL here. All requests made to images under /uploads/images @@ -162,12 +154,12 @@ ## Settings affecting how ./script/server behaves. [configuration.server] -## Where the appserver should listen to (default="unix:tmp/diaspora.sock") -#listen = "unix:tmp/diaspora.sock" -#listen = "unix:/run/diaspora/diaspora.sock" -#listen = "127.0.0.1:3000" +## Where the appserver should listen to (default="unix://tmp/diaspora.sock") +#listen = "unix://tmp/diaspora.sock" +#listen = "unix:///run/diaspora/diaspora.sock" +#listen = "tcp://127.0.0.1:3000" -## Set the path for the PID file of the unicorn master process (default=tmp/pids/web.pid) +## Set the path for the PID file of the web master process (default=tmp/pids/web.pid) #pid = "tmp/pids/web.pid" ## Rails environment (default="development"). @@ -175,23 +167,15 @@ ## Change this to "production" if you wish to run a production environment. #rails_environment = "production" -## Write unicorn stderr and stdout log. -#stderr_log = "log/unicorn-stderr.log" -#stdout_log = "log/unicorn-stdout.log" - -## Number of Unicorn worker processes (default=2). -## Increase this if you have many users. -#unicorn_worker = 2 +## Write web stderr and stdout log. +#stderr_log = "log/web-stderr.log" +#stdout_log = "log/web-stdout.log" ## Number of seconds before a request is aborted (default=90). ## Increase if you get empty responses, or if large image uploads fail. ## Decrease if you're under heavy load and don't care if some ## requests fail. -#unicorn_timeout = 90 - -## Embed a Sidekiq worker inside the unicorn process (default=false). -## Useful for minimal Heroku setups. -#embed_sidekiq_worker = false +#web_timeout = 90 ## Number of Sidekiq worker processes (default=1). ## In most cases it is better to diff --git a/config/eye.rb b/config/eye.rb index 20dfe9c86..94ded11c5 100644 --- a/config/eye.rb +++ b/config/eye.rb @@ -14,39 +14,30 @@ Eye.application("diaspora") do stderr "log/eye_processes_stderr.log" process :web do - unicorn_command = "bin/bundle exec unicorn -c config/unicorn.rb" - - if rails_env == "production" - start_command "#{unicorn_command} -D" - daemonize false - restart_command "kill -USR2 {PID}" - restart_grace 10.seconds - else - start_command unicorn_command - daemonize true - end + web_command = "bin/puma -C config/puma.rb" + + start_command web_command + daemonize true + restart_command "kill -USR2 {PID}" + restart_grace 10.seconds pid_file AppConfig.server.pid.get stop_signals [:TERM, 10.seconds] - env "PORT" => ENV["PORT"] - monitor_children do stop_command "kill -QUIT {PID}" end end group :sidekiq do - with_condition(!AppConfig.environment.single_process_mode?) do - AppConfig.server.sidekiq_workers.to_i.times do |i| - i += 1 - - process "sidekiq#{i}" do - start_command "bin/bundle exec sidekiq" - daemonize true - pid_file "tmp/pids/sidekiq#{i}.pid" - stop_signals [:USR1, 0, :TERM, 10.seconds, :KILL] - end + AppConfig.server.sidekiq_workers.to_i.times do |i| + i += 1 + + process "sidekiq#{i}" do + start_command "bin/bundle exec sidekiq" + daemonize true + pid_file "tmp/pids/sidekiq#{i}.pid" + stop_signals [:USR1, 0, :TERM, 10.seconds, :KILL] end end end diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index 104e94a82..9770db3ee 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -3,16 +3,6 @@ require "sidekiq_middlewares" require "sidekiq/middleware/i18n" -# Single process-mode -if AppConfig.environment.single_process_mode? && !Rails.env.test? - if Rails.env.production? - warn "WARNING: You are running Diaspora in production without Sidekiq" - warn " workers turned on. Please set single_process_mode to false in" - warn " config/diaspora.toml." - end - require "sidekiq/testing/inline" -end - Sidekiq.configure_server do |config| config.redis = AppConfig.get_redis_options diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 000000000..a11c0c0f1 --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require_relative "load_config" + +pidfile AppConfig.server.pid.get +bind AppConfig.server.listen.get + +worker_timeout AppConfig.server.web_timeout.to_i + +if AppConfig.server.stdout_log? || AppConfig.server.stderr_log? + stdout_redirect AppConfig.server.stdout_log? ? AppConfig.server.stdout_log.get : "/dev/null", + AppConfig.server.stderr_log? ? AppConfig.server.stderr_log.get : "/dev/null" +end + +# In general, running Puma in cluster-mode is one of those very rare setups +# that's only relevant in *huge* scale. However, starting 1 worker runs Puma in +# cluster mode, with a single worker. This means you get to pay all the memory +# overhead of spawning in "cluster mode", but you don't get any performance +# benefits. This makes no sense. Setting "workers = 0" explicitly turns off +# cluster mode. +# +# For more details and further references, see +# https://github.com/puma/puma/commit/81d26e91b777ab120e8f52d45385f0e018438ba4 +workers 0 + +preload_app! + +before_fork do + # we're preloading app in production, so force-reconenct the DB + ActiveRecord::Base.connection_pool.disconnect! + + # drop the Redis connection + Sidekiq.redis {|redis| redis.client.disconnect } +end + +on_worker_boot do + # reopen logfiles to obtain a new file descriptor + Logging.reopen + + ActiveSupport.on_load(:active_record) do + # we're preloading app in production, so reconnect to DB + ActiveRecord::Base.establish_connection + end + + # We don't generate uuids in the frontend, but let's be on the safe side + UUID.generator.next_sequence +end diff --git a/config/unicorn.rb b/config/unicorn.rb deleted file mode 100644 index ac2120b65..000000000 --- a/config/unicorn.rb +++ /dev/null @@ -1,48 +0,0 @@ -# frozen_string_literal: true - -require_relative "load_config" - -port = ENV["PORT"] -port = port && !port.empty? ? port.to_i : nil - -listen port || AppConfig.server.listen.get unless RACKUP[:set_listener] -pid AppConfig.server.pid.get -worker_processes AppConfig.server.unicorn_worker.to_i -timeout AppConfig.server.unicorn_timeout.to_i -stderr_path AppConfig.server.stderr_log.get if AppConfig.server.stderr_log? -stdout_path AppConfig.server.stdout_log.get if AppConfig.server.stdout_log? - -preload_app true -@sidekiq_pid = nil - -before_fork do |_server, _worker| - ActiveRecord::Base.connection.disconnect! # preloading app in master, so reconnect to DB - - # disconnect redis if in use - Sidekiq.redis(&:close) unless AppConfig.environment.single_process_mode? - - @sidekiq_pid ||= spawn("bin/bundle exec sidekiq") if AppConfig.server.embed_sidekiq_worker? -end - -after_fork do |server, worker| - Logging.reopen # reopen logfiles to obtain a new file descriptor - - ActiveRecord::Base.establish_connection # preloading app in master, so reconnect to DB - - # We don't generate uuids in the frontend, but let's be on the safe side - UUID.generator.next_sequence - - # Check for an old master process from a graceful restart - old_pid = "#{AppConfig.server.pid.get}.oldbin" - - if File.exist?(old_pid) && server.pid != old_pid - begin - # Remove a worker from the old master when we fork a new one (TTOU) - # Except for the last worker forked by this server, which kills the old master (QUIT) - signal = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU - Process.kill(signal, File.read(old_pid).to_i) - rescue Errno::ENOENT, Errno::ESRCH - # someone else did our job for us - end - end -end |