Puma is a web server that helps your Rails app handle many users at the same time. Configuring Puma lets you control how your app runs smoothly and fast.
Puma server configuration in Ruby on Rails
# config/puma.rb threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i threads threads_count, threads_count port ENV.fetch("PORT") { 3000 } environment ENV.fetch("RAILS_ENV") { "development" } workers ENV.fetch("WEB_CONCURRENCY") { 2 } preload_app! on_worker_boot do ActiveRecord::Base.establish_connection if defined?(ActiveRecord::Base) end
The threads line sets minimum and maximum threads Puma uses.
The workers line sets how many separate processes Puma runs for better performance.
threads 1, 5 port 3000 environment 'development'
workers 3
preload_app!
on_worker_boot do
ActiveRecord::Base.establish_connection
endport ENV.fetch("PORT") { 8080 } environment ENV.fetch("RAILS_ENV") { "production" }
This is a complete Puma configuration file for a Rails app. It sets threads, port, environment, and workers using environment variables with defaults. It preloads the app and reconnects the database on worker boot.
# config/puma.rb threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i threads threads_count, threads_count port ENV.fetch("PORT") { 3000 } environment ENV.fetch("RAILS_ENV") { "development" } workers ENV.fetch("WEB_CONCURRENCY") { 2 } preload_app! on_worker_boot do ActiveRecord::Base.establish_connection if defined?(ActiveRecord::Base) end
Use environment variables to easily change settings without editing the file.
Preloading the app helps workers start faster but needs proper database reconnect.
Adjust threads and workers based on your server's CPU and memory for best performance.
Puma configuration controls how your Rails app handles requests.
Set threads, workers, port, and environment to match your needs.
Use preload_app! and on_worker_boot for better worker management.
Practice
threads setting in a Puma server for a Rails app?Solution
Step 1: Understand the role of threads in Puma
Threads allow Puma to handle multiple requests at the same time inside one worker process.Step 2: Differentiate threads from workers and ports
Workers are separate processes, ports define network access, threads are about concurrency inside a worker.Final Answer:
To control how many requests Puma can handle concurrently within a single worker -> Option AQuick Check:
Threads = concurrent requests per worker [OK]
- Confusing threads with workers
- Thinking threads set the port
- Mixing threads with environment settings
Solution
Step 1: Recall Puma configuration syntax for port
Puma uses the simple directiveportfollowed by the port number.Step 2: Check other options for correctness
set_portandlistenare not valid Puma config commands;bindrequires a full URL, not just a port number.Final Answer:
port 3000 -> Option DQuick Check:
Useportto set listening port [OK]
- Using 'listen' instead of 'port'
- Omitting quotes in 'bind' URL
- Using non-existent 'set_port' command
threads 5, 5 workers 2 port 4000
How many total threads can Puma handle at once across all workers?
Solution
Step 1: Understand threads and workers relationship
Each worker runs with 5 threads, and there are 2 workers.Step 2: Calculate total threads
Total threads = threads per worker * number of workers = 5 * 2 = 10. But note the config uses 'threads 5, 5' which means min and max threads are 5, so max threads per worker is 5.Step 3: Re-examine the question carefully
Actually, the question asks total threads Puma can handle at once across all workers. Since each worker has 5 threads, and there are 2 workers, total is 5 * 2 = 10.Final Answer:
10 -> Option BQuick Check:
Threads per worker * workers = 10 [OK]
- Confusing min and max threads
- Ignoring number of workers
- Assuming threads is total, not per worker
preload_app! in your Puma config but your Rails app crashes on worker boot with a database connection error. What is the most likely fix?Solution
Step 1: Understand what
It loads the app before workers fork, so connections like database must be re-established in each worker.preload_app!doesStep 2: Fix database connection error on worker boot
Useon_worker_bootblock to reconnect ActiveRecord to the database after forking.Final Answer:
Add aon_worker_bootblock to reconnect ActiveRecord -> Option CQuick Check:
Useon_worker_bootto fix DB connections [OK]
- Removing preload_app! instead of fixing connections
- Changing unrelated settings like port
- Increasing workers without fixing connections
Solution
Step 1: Set threads and workers correctly
Threads should be set asthreads 2, 6for min and max, and workers as 3.Step 2: Use
preload_app!and reconnect DB properlypreload_app!must be present, andon_worker_bootshould callActiveRecord::Base.establish_connectionto reconnect DB.Step 3: Check each option for correctness
threads 2, 6\nworkers 3\npreload_app!\non_worker_boot do\n ActiveRecord::Base.establish_connection\nend matches all requirements. workers 3\nthreads 6, 2\npreload_app!\non_worker_boot do\n ActiveRecord::Base.connection.disconnect!\nend reverses thread min/max and disconnects DB incorrectly. threads 2, 6\nworkers 3\nport 3000\non_worker_boot do\n ActiveRecord::Base.establish_connection\nend missespreload_app!. workers 3\nthreads 2, 6\npreload_app!\non_worker_boot do\n ActiveRecord::Base.connection.reconnect!\nend uses a non-existentreconnect!method.Final Answer:
threads 2, 6 workers 3 preload_app! on_worker_boot do ActiveRecord::Base.establish_connection end -> Option AQuick Check:
Correct threads, workers, preload_app!, and DB reconnect [OK]
- Swapping min and max threads
- Omitting preload_app!
- Using wrong DB reconnect method
Ready to prove it?
Pass the test and this pattern moves unknown
