Support for the Ruby 2.3 series has ended. Seehere for reference.
WEBrick is an HTTP server toolkit that can beconfigured as an HTTPS server, a proxy server, and a virtual-host server.WEBrick features complete logging of both serveroperations and HTTP access.WEBrick supportsboth basic and digest authentication in addition to algorithms not in RFC2617.
AWEBrick server can be composed of multipleWEBrick servers or servlets to provide differingbehavior on a per-host or per-path basis.WEBrick includes servlets for handlingCGI scripts, ERB pages, Ruby blocks anddirectory listings.
WEBrick also includes tools for daemonizing aprocess and starting a process at a higher privilege level and droppingpermissions.
To create a newWEBrick::HTTPServerthat will listen to connections on port 8000 and serve documents from thecurrent user's public_html folder:
require'webrick'root =File.expand_path'~/public_html'server =WEBrick::HTTPServer.new:Port=>8000,:DocumentRoot=>root
To run the server you will need to provide a suitable shutdown hook asstarting the server blocks the current thread:
trap'INT'doserver.shutdownendserver.start
The easiest way to have a server perform custom operations is throughWEBrick::HTTPServer#mount_proc.The block given will be called with aWEBrick::HTTPRequest with request infoand aWEBrick::HTTPResponse whichmust be filled in appropriately:
server.mount_proc'/'do|req,res|res.body ='Hello, world!'end
Remember thatserver.mount_proc
must precedeserver.start
.
Advanced custom behavior can be obtained through mounting a subclass ofWEBrick::HTTPServlet::AbstractServlet.Servlets provide more modularity when writing an HTTP server thanmount_proc allows. Here is a simple servlet:
classSimple<WEBrick::HTTPServlet::AbstractServletdefdo_GETrequest,responsestatus,content_type,body =do_stuff_withrequestresponse.status =200response['Content-Type'] ='text/plain'response.body ='Hello, World!'endend
To initialize the servlet you mount it on the server:
server.mount'/simple',Simple
SeeWEBrick::HTTPServlet::AbstractServletfor more details.
A server can act as a virtual host for multiple host names. After creatingthe listening host, additional hosts that do not listen can be created andattached as virtual hosts:
server = WEBrick::HTTPServer.new # ...vhost = WEBrick::HTTPServer.new :ServerName => 'vhost.example', :DoNotListen => true, # ...vhost.mount '/', ...server.virtual_host vhost
If no:DocumentRoot
is provided and no servlets or procs aremounted on the main server it will return 404 for all URLs.
To create an HTTPS server you only need to enable SSL and provide an SSLcertificate name:
require'webrick'require'webrick/https'cert_name = [%w[CN localhost],]server =WEBrick::HTTPServer.new(:Port=>8000,:SSLEnable=>true,:SSLCertName=>cert_name)
This will start the server with a self-generated self-signed certificate.The certificate will be changed every time the server is restarted.
To create a server with a pre-determined key and certificate you canprovide them:
require'webrick'require'webrick/https'require'openssl'cert =OpenSSL::X509::Certificate.newFile.read'/path/to/cert.pem'pkey =OpenSSL::PKey::RSA.newFile.read'/path/to/pkey.pem'server =WEBrick::HTTPServer.new(:Port=>8000,:SSLEnable=>true,:SSLCertificate=>cert,:SSLPrivateKey=>pkey)
WEBrick can act as a proxy server:
require'webrick'require'webrick/httpproxy'proxy =WEBrick::HTTPProxyServer.new:Port=>8000trap'INT'doproxy.shutdownend
See WEBrick::HTTPProxy for further details including modifying proxiedresponses.
WEBrick provides both Basic and Digestauthentication for regular and proxy servers. SeeWEBrick::HTTPAuth,WEBrick::HTTPAuth::BasicAuth andWEBrick::HTTPAuth::DigestAuth.
WEBrick can be run as a production server forsmall loads.
To start aWEBrick server as a daemon simple runWEBrick::Daemon.startbefore starting the server.
WEBrick can be started as one user to gainpermission to bind to port 80 or 443 for serving HTTP or HTTPS traffic thencan drop these permissions for regular operation. To listen on allinterfaces for HTTP traffic:
sockets =WEBrick::Utils.create_listenersnil,80
Then drop privileges:
WEBrick::Utils.su'www'
Then create a server that does not listen by default:
server = WEBrick::HTTPServer.new :DoNotListen => true, # ...
Then overwrite the listening sockets with the port 80 sockets:
server.listeners.replacesockets
WEBrick can separately log server operations andend-user access. For server operations:
log_file =File.open'/var/log/webrick.log','a+'log =WEBrick::Log.newlog_file
For user access logging:
access_log = [ [log_file,WEBrick::AccessLog::COMBINED_LOG_FORMAT],]server =WEBrick::HTTPServer.new:Logger=>log,:AccessLog=>access_log
SeeWEBrick::AccessLog for further logformats.
To rotate logs inWEBrick on a HUP signal (likesyslogd can send), open the log file in 'a+' mode (as above) andtrap 'HUP' to reopen the log file:
trap 'HUP' do log_file.reopen '/path/to/webrick.log', 'a+'
Author: IPR – Internet Programming with Ruby – writers
Copyright © 2000 TAKAHASHI Masayoshi, GOTOU YUUZOU Copyright © 2002Internet Programming with Ruby writers. All rights reserved.
This page was generated for Ruby 2.3.1
Generated with Ruby-doc Rdoc Generator 0.44.0.