Find file
Fetching contributors…
Cannot retrieve contributors at this time
67 lines (48 sloc) 2 KB


EventMachine Proxy DSL for writing high-performance transparent / intercepting proxies in Ruby.

Getting started

$> gem install em-proxy
$> em-proxy
Usage: em-proxy [options]
  -l, --listen [PORT]              Port to listen on
  -d, --duplex [host:port, ...]    List of backends to duplex data to
  -r, --relay [hostname:port]      Relay endpoint: hostname:port
  -v, --verbose                    Run in debug mode

$> em-proxy -l 8080 -r localhost:8081 -d localhost:8082,localhost:8083 -v

The above will start em-proxy on port 8080, relay and respond with data from port 8081, and also (optional) duplicate all traffic to ports 8082 and 8083 (and discard their responses).

EngineYard has shared a great hands-on tutorial for deploying em-proxy: Load Testing your AppCloud Environment using em-proxy

Simple port forwarding proxy

Proxy.start(:host => "", :port => 80, :debug => true) do |conn|
  conn.server :srv, :host => "", :port => 81

  # modify / process request stream
  conn.on_data do |data|
    p [:on_data, data]

  # modify / process response stream
  conn.on_response do |backend, resp|
    p [:on_response, backend, resp]

  # termination logic
  conn.on_finish do |backend, name|
    p [:on_finish, name]

    # terminate connection (in duplex mode, you can terminate when prod is done)
    unbind if backend == :srv

For more examples see the /examples directory.

  • SMTP Spam Filtering
  • Duplicating traffic
  • Selective forwarding
  • Beanstalkd interceptor
  • etc.

A schema-free MySQL proof of concept, via an EM-Proxy server:


The MIT License - Copyright (c) 2010 Ilya Grigorik