Class: Thin::Server
- Inherits:
-
Object
- Object
- Thin::Server
- Extended by:
- Forwardable
- Includes:
- Daemonizable, Logging
- Defined in:
- lib/thin/server.rb
Overview
The uterly famous Thin HTTP server. It listen for incoming request through a given backend
and forward all request to app
.
TCP server
Create a new TCP server on bound to host:port
by specifiying host
and port
as the first 2 arguments.
Thin::Server.start('0.0.0.0', 3000, app)
UNIX domain server
Create a new UNIX domain socket bound to socket
file by specifiying a filename as the first argument. Eg.: /tmp/thin.sock. If the first argument contains a /
it will be assumed to be a UNIX socket.
Thin::Server.start('/tmp/thin.sock', app)
Using a custom backend
You can implement your own way to connect the server to its client by creating your own Backend class and pass it as the :backend option.
Thin::Server.start('galaxy://faraway', 1345, app, :backend => Thin::Backends::MyFancyBackend)
Rack application (app
)
All requests will be processed through app
that must be a valid Rack adapter. A valid Rack adapter (application) must respond to call(env#Hash)
and return an array of [status, headers, body]
.
Building an app in place
If a block is passed, a Rack::Builder
instance will be passed to build the app
. So you can do cool stuff like this:
Thin::Server.start('0.0.0.0', 3000) do
use Rack::CommonLogger
use Rack::ShowExceptions
map "/lobster" do
use Rack::Lint
run Rack::Lobster.new
end
end
Controlling with signals
-
QUIT: Gracefull shutdown (see Server#stop)
-
INT and TERM: Force shutdown (see Server#stop!)
Disable signals by passing :signals => false
Constant Summary collapse
- DEFAULT_TIMEOUT =
Default values
30
- DEFAULT_HOST =
sec
'0.0.0.0'
- DEFAULT_PORT =
3000
- DEFAULT_MAXIMUM_CONNECTIONS =
1024
- DEFAULT_MAXIMUM_PERSISTENT_CONNECTIONS =
512
Instance Attribute Summary collapse
-
#app ⇒ Object
Application (Rack adapter) called with the request that produces the response.
-
#backend ⇒ Object
Backend handling the connections to the clients.
Attributes included from Daemonizable
Class Method Summary collapse
-
.start(*args, &block) ⇒ Object
Lil’ shortcut to turn this:.
Instance Method Summary collapse
-
#config ⇒ Object
Configure the server The process might need to have superuser privilege to configure server with optimal options.
-
#initialize(*args, &block) ⇒ Server
constructor
A new instance of Server.
-
#name ⇒ Object
(also: #to_s)
Name of the server and type of backend used.
-
#running? ⇒ Boolean
Return
true
if the server is running and ready to receive requests. -
#start ⇒ Object
(also: #start!)
Start the server and listen for connections.
-
#stop ⇒ Object
Gracefull shutdown Stops the server after processing all current connections.
-
#stop! ⇒ Object
Force shutdown Stops the server closing all current connections right away.
Methods included from Daemonizable
#change_privilege, #daemonize, included, #on_restart, #pid, #restart
Methods included from Logging
debug?, #silent, #silent=, silent?, trace?
Constructor Details
#initialize(*args, &block) ⇒ Server
Returns a new instance of Server.
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/thin/server.rb', line 88 def initialize(*args, &block) host, port, = DEFAULT_HOST, DEFAULT_PORT, {} args.each do |arg| case arg when Fixnum, /^\d+$/ then port = arg.to_i when String then host = arg when Hash then = arg else @app = arg if arg.respond_to?(:call) end end # Try to intelligently select which backend to use. @backend = select_backend(host, port, ) load_cgi_multipart_eof_fix @backend.server = self # Set defaults @backend.maximum_connections = DEFAULT_MAXIMUM_CONNECTIONS @backend.maximum_persistent_connections = DEFAULT_MAXIMUM_PERSISTENT_CONNECTIONS @backend.timeout = DEFAULT_TIMEOUT # Allow using Rack builder as a block @app = Rack::Builder.new(&block).to_app if block # If in debug mode, wrap in logger adapter @app = Rack::CommonLogger.new(@app) if Logging.debug? setup_signals unless [:signals].class == FalseClass end |
Instance Attribute Details
#app ⇒ Object
Application (Rack adapter) called with the request that produces the response.
61 62 63 |
# File 'lib/thin/server.rb', line 61 def app @app end |
#backend ⇒ Object
Backend handling the connections to the clients.
64 65 66 |
# File 'lib/thin/server.rb', line 64 def backend @backend end |
Class Method Details
.start(*args, &block) ⇒ Object
Lil’ shortcut to turn this:
Server.new(...).start
into this:
Server.start(...)
130 131 132 |
# File 'lib/thin/server.rb', line 130 def self.start(*args, &block) new(*args, &block).start! end |
Instance Method Details
#config ⇒ Object
Configure the server
The process might need to have superuser privilege to configure server with optimal options.
180 181 182 |
# File 'lib/thin/server.rb', line 180 def config @backend.config end |
#name ⇒ Object Also known as: to_s
Name of the server and type of backend used. This is also the name of the process in which Thin is running as a daemon.
186 187 188 |
# File 'lib/thin/server.rb', line 186 def name "thin server (#{@backend})" end |
#running? ⇒ Boolean
Return true
if the server is running and ready to receive requests. Note that the server might still be running and return false
when shuting down and waiting for active connections to complete.
194 195 196 |
# File 'lib/thin/server.rb', line 194 def running? @backend.running? end |
#start ⇒ Object Also known as: start!
Start the server and listen for connections.
135 136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/thin/server.rb', line 135 def start raise ArgumentError, 'app required' unless @app log ">> Thin web server (v#{VERSION::STRING} codename #{VERSION::CODENAME})" debug ">> Debugging ON" trace ">> Tracing ON" log ">> Threaded mode #{@backend.threaded? ? 'ON' : 'OFF'}" log ">> Maximum connections set to #{@backend.maximum_connections}" log ">> Listening on #{@backend}, CTRL+C to stop" @backend.start end |
#stop ⇒ Object
Gracefull shutdown
Stops the server after processing all current connections. As soon as this method is called, the server stops accepting new requests and wait for all current connections to finish. Calling twice is the equivalent of calling stop!
.
155 156 157 158 159 160 161 162 163 164 165 |
# File 'lib/thin/server.rb', line 155 def stop if running? @backend.stop unless @backend.empty? log ">> Waiting for #{@backend.size} connection(s) to finish, " + "can take up to #{timeout} sec, CTRL+C to stop now" end else stop! end end |
#stop! ⇒ Object
Force shutdown
Stops the server closing all current connections right away. This doesn’t wait for connection to finish their work and send data. All current requests will be dropped.
171 172 173 174 175 |
# File 'lib/thin/server.rb', line 171 def stop! log ">> Stopping ..." @backend.stop! end |