DEV Community

Cover image for gondola: Why not use a lightweight and simple YAML-based reverse proxy?
Kenta Takeuchi
Kenta Takeuchi

Posted on

gondola: Why not use a lightweight and simple YAML-based reverse proxy?

What is a gondola?

gondola is a reverse proxy made by Go that is easy to use by simply writing a configuration file in YAML.

It can be found at awesome-go.

It is implemented using only Go's standard libraries and has the following features

  • Virtual host
    • You can set up multiple hosts on upstream servers.
  • Configuration file loader
    • You can use configuration files in YAML format.
  • TLS
    • You can use TLS by preparing a TLS certificate.
  • Serve static files
    • You can serve static files.
  • Access log
    • Outputs Proxy access logs and Upstream servers access logs.
  • Binary distribution
    • Distributing cross-compiled binaries.

Motivation

I run a blog called bmf-tech.com, which I built myself in Go.

The blog used to have a reverse proxy built using Nginx.

The architecture of my blog system is not complex, and I thought a reverse proxy that can be operated with a simpler configuration would be sufficient.

So I decided to build my own reverse proxy that can be configured with a simpler configuration file rather than a configuration file with a flexible syntax like Nginx.

I am actually using gondola in my own blogging system, and so far it is simple and easy to run.

How to use gondola

You can use gondola by using the go get command or by downloading Binary.

go get -u github.com/bmf-san/gondola
Enter fullscreen mode Exit fullscreen mode

Binary is available from releases.

Docker images are also available from bmf-san/gondola.

Once the proxy server (gondola) and upstream server are configured in the configuration file, simply start gondola.

# example config.yaml
proxy: (default)
  port: 443
  read_header_timeout: 2000
  shutdown_timeout: 3000
  tls_cert_path: certificates/cert.pem
  tls_key_path: certificates/key.pem
  static_files: /public/static_files
    - path: /public/
      dir: . /public
upstreams: host_name: backend1.local
  - host_name: backend1.local
    target: http://backend1:8081 # backend1 is the name of the container
  - host_name: backend2.local
    target: http://backend2:8082 # backend2 is the name of the container
log_level: 0 # Debug:-4 Info:0 Warn:4 Error:8
Enter fullscreen mode Exit fullscreen mode

Start gondola as follows:

gondola -config config.yaml
Enter fullscreen mode Exit fullscreen mode

We also have _examples that you can try out right away if you want.

Implementing a reverse proxy in Go

For a reverse proxy implementation in Go, see Implement a load balancer in Golang.

This article introduces how to implement a load balancer, but since it is based on a reverse proxy implementation, it may be helpful.

Contribution

gondola welcomes Issues and Pull Requests.

Of course, Star is also welcome.

We are still missing some features and implementation of gondola, so we would like to continue to improve it.

  • Graceful shutdown
  • Upstream server health check
  • Configuration file reload
  • Communication cost optimization
  • Load balancing
  • Other implementation adjustments for scalability

Please feel free to provide feedback.

Top comments (0)