Source: Wikipedia, the free encyclopedia.
Original author(s)Masayoshi Takahashi and Yuuzou Gotou and et al.[1][2]
Developer(s)Ruby Community
Stable release
1.8.1[3] / 27 January 2023; 9 months ago (27 January 2023)
Written in
Web Server
License2-Clause BSD License

WEBrick is a

production mode for small loads. It is now a part of Ruby standard library.[1]

WEBrick follows

open-source distribution model


WEBrick has originated from an idea in an article named "Internet Programming with Ruby" in Open Design, a Japanese Engineering magazine. It was initially developed as a toolkit for the development of HTTP servers using Ruby. Due to the nature of open source model and contributions from several Ruby developers across the world, WEBrick was greatly augmented and was eventually bundled as a standard library from Ruby 1.8.0.[2] The WEBrick ERB Handler and WEBrick Proxy Server were first introduced in Ruby 1.9.3, while the WEBrick Virtual Host was included from Ruby 2.0.0.


A WEBrick server understands only the language of servlets. It uses multiple independent servlets, joined together by the programmer, for handling

are the examples of the standard servlets that WEBrick comes with.

WEBrick is included in Ruby and hence is available to the user at no additional cost. WEBrick has been written completely in Ruby and supports several standards such as HTTP,

RHTML. During the development stage, there is no necessity for the installation of a discrete web server since WEBrick is already built into the Rails framework. It is the default web server when the Ruby application is deployed without any procfile
on Rails. Furthermore, since being implemented entirely in Ruby, direct calls can be made from WEBrick to the Rails application. On the whole, it provides a reliable, low configuration option for testing in development.

Instantiating servers

Instantiating an HTTP server

The following commands are used to start an HTTP Server at the required port.[1]

# Include WEBrick class with require
require 'webrick'

# FileHandler servlet provides the option to choose which files from user to serve
# The following code shows how to serve them from the folder 'myapp'
root = File.expand_path '/var/myapp/'

# Instantiating a new server with HTTPServer.new on port 1234 serving the documents from root folder
server = WEBrick::HTTPServer.new :Port => 1234, :DocumentRoot => root

# The following proc is used to customize the server operations
server.mount_proc '/' do |request, response|
  response.body = 'Hello, world!'

# The following command will provide a hook to shut down the server (often done with Ctrl+C)
trap('INT') {server.shutdown}

# Start the server

Servlets can be mounted to provide advanced custom behavior as compared to a proc,[5] to increase the modularity.

Starting a virtual host

WEBrick creates a listening port. Various other ports as ‘virtual hosts’ can also be created at the same time which do not listen as shown below:[1]

#Creating a virtual host that doesn't listen
vhost = WEBrick::HTTPServer.new :ServerName => 'vhost.example',
                                :DoNotListen => true, # ...

# Mounting the virtual host created above similar to the way HTTP server was mounted
vhost.mount '/', ...

# This host, when mounted to the listening server host, will now act as a virtual host
server.virtual_host vhost

:DocumentRoot should be provided or an instance of a servlet should be set up to service a request

404 error
will be returned.

Instantiating an HTTPS server

By just enabling

SSL and providing an SSL certificate name, an HTTPS server can be initiated with a self-signed certificate that changes with every restart of the server.[1]

# In addition to webrick, we will require webrick/https too for SSL functionalities
require 'webrick'
require 'webrick/https'

# Providing certificate name. This, however, will be a self-generated self-signed certificate
cert_name = [%w[CN localhost],]

# Enabling SSL and providing the certificate name will instantiate HTTPS server
server = WEBrick::HTTPServer.new(:Port => 1234,
                                 :SSLEnable => true,
                                 :SSLCertName => cert_name)

However, a pre-determined key and certificate can also be provided for instantiating HTTPS Server as shown below:

# In addition to the above two, we'll need openssl to read SSL certificates and keys
require 'openssl'

# Read the saved certificate and its signature key from the local directory
cert = OpenSSL::X509::Certificate.new File.read '/var/myapp/cert.pem'
pkey = OpenSSL::PKey::RSA.new File.read '/var/myapp/pkey.pem'

# Pass the certificate and the key as separate parameters while instantiating with HTTPServer.new
server = WEBrick::HTTPServer.new(:Port => 1234,
                                 :SSLEnable => true,
                                 :SSLCertificate => cert,
                                 :SSLPrivateKey => pkey)

Starting a proxy server

WEBrick can also proxy GET, HEAD and POST

# Instantiating a proxy server is similar, except that it is handled by HTTPProxyServer servlet
require 'webrick/httpproxy'
proxy = WEBrick::HTTPProxyServer.new :Port => 1234

# Providing the hook out from the current thread
trap 'INT' do proxy.shutdown end


Unlike most of the servers that are used in production, WEBrick is not scalable since it is a single threaded web server by default.

multi-threaded full-fledged web servers like Lighttpd and Mongrel for deploying their Rails applications.[7]

See also


  1. ^ a b c d e f "Module: WEBrick (Ruby 2.3.1)". ruby-doc.org. Retrieved 2016-09-22.
  2. ^ a b c d e f Gnome's guide to WEBrick
  3. ^ "Release 1.8.1". 27 January 2023. Retrieved 8 February 2023.
  4. ^ Investigating the impacts of web servers on web application energy usage - IEEE
  5. ^ proc
  6. ^ Heroku Ruby default web server
  7. ^ NetBeans Ruby and Rails IDE with JRuby (FirstPress) By Chris Kutler, Brian Leonard

External links