roxy

command module
v0.0.0-...-1cb8439 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 17, 2024 License: MIT Imports: 22 Imported by: 0

README

Go Workflow Go Reference Go Report Card

roxy

roxy is a minimalistic reverse proxy server for forwarding requests based on the requested (sub) domain.

It is for servicing external requests, supporting both http (:80) and https (:443). For HTTPS, roxy utilizes automatic certificate generation using Golang's autocert package for non-localhost domains..

Eg:

$ go install github.com/clagraff/roxy
$ roxy -p blog.mydomain.com=127.0.0.1:9010 -p wiki.mydomain.com=127.0.0.1:9020 -p http://old.mydomain.com=127.0.0.1:8001

or using docker:

$ docker pull clagraff/roxy
$ docker run -d -p 80:80 -p 443:443 clagraff/roxy -p blog.mydomain.com=blog:80 -p wiki.mydomain.com=wiki:80 -p http://old.mydomain.com=https://new.domain
$ roxy -h
Usage of roxy:    
  -c string
        Path to store auto-generated certs for non-localhost hosts (default "./certs")
  -h    show help & usage
  -p value
        proxy definition describing an origin and upstream url to proxy, eg: origin=upstream
  -r    turn off automatic HTTP redirects (on by default)

Proxy pattern
  origin, upstream:     [scheme://]hostname[:port]

  [scheme://]
        Optional; origin defaults to https; upstream defaults to http.
  [:port]
        Optional; defaults to :80 and :443 for HTTP and HTTPS if not specified.

  examples:
        Bare minimum:           origin=upstream
        With schemes:           https://origin=http://upstream
        With ports:             origin:443=upstream:9090
        With subdomains:        https://sub.origin=upstream:8001

Self-signed localhost cert(s)
  When a localhost domain is specified as an origin, a self-signed,
  untrusted certificate will be created for it.
  Depending on your HTTP client, you may need to install/trust the certificate
  for requests to be successful, or use a non-https version of the domain.
    	
    	
$ roxy -p api.localhost=localhost:9090

Example

Example Setup

We are going to setup roxy to serve requests between two different servers (we will run using python). One server will be for http://server1.localhost and is listening on :9001. The second server will be for http://server2.localhost and listen on :9002.

$ # This is an HTTP-only example for simplicity...
$ mkdir /tmp/server{1,2}
$ echo "Server 1" > /tmp/server1/index.html
$ echo "Server 2" > /tmp/server2/index.html
$ # To test the reverse proxy functionality, 
$ # we will setup some "fake" local subdomains.
$ echo "127.0.0.1    server1.localhost" | sudo tee -a /etc/hosts
127.0.0.1    server1.local
$ echo "127.0.0.1    server2.localhost" | sudo tee -a /etc/hosts
127.0.0.1    server2.local
$ # Spin up some servers to proxy to...
$ python3 -m http.server 9001 --directory /tmp/server1 &
$ python3 -m http.server 9002 --directory /tmp/server2 &

Run the server

Download and install roxy, then run it in HTTP-only mode.

$ # Let's go!!
$ go install github.com/clagraff/roxy
$ roxy -p server1.localhost=127.0.0.1:9001 -p server2.localhost=127.0.0.1:9002

Try it out

Try out the reverse proxy by making some requests.

$ curl http://server1.localhost
Server 1
$ curl http://server2.localhost
Server 2

Usage

Automatic Certificate Generation

roxy will use HTTPS (:443) by default, and generate certificates automatically based on the host(s) specified using -p flag. For origins with an explicit http scheme, cert generation does not occur.

Take the following command as an example:

$ roxy -p dev.local=127.0.0.1:9000 -p docs.local=127.0.0.1:9010 -p ci.local=127.0.0.1:9020

In the above example, roxy will listen for HTTPS requests, and will generate certificates on-the-fly for the domains dev.local, docs.local, and ci.local.

These domains must 1.) be correctly setup to point to the server roxy is running on (via A-records), and 2.) roxy must be allowed to communicate to Let's Encrypt to perform the certificate generation (firewall rules may block it).

Note: cert generation does not happen at startup; rather, it happens upon the first request when a certificate has not been generated or is expired.

Please be aware of Let's Encrypt's rate limiting, which at the time of writing is 50 per week.

Help

You can use -h / --help at any time to view available options.

Documentation

The Go Gopher

There is no documentation for this package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL