Global app routing

IP addresses

Fly applications have dedicated IP addresses. Each application starts with two addresses — one IPv6 and one IPv4. IPv6 addresses are free, global IPv4 addresses are billed monthly.

TCP services

Global service listeners are defined in the fly.toml config file.

This is the default service configuration:

[[services]]
  handlers = ["HTTP"]
  internal_port = 8080
  port = 80
  protocol = "TCP"

[[services]]
  handlers = ["TLS", "HTTP"]
  internal_port = 8080
  port = 443
  protocol = "TCP"
services.port

Defines which external port you want Fly to accept traffic on. You can configure an application to listen for global traffic on ports 80, 443, 3000, 5000, and any port between 10000 - 10100.

services.internal_port

Specifies which internal application port Fly should forward traffic to.

services.handlers

Applies connection middleware to incoming connections before forwarding to the application.

Connection middleware

The handlers config setting specifies which middleware applies to incoming TCP connections. Use these to convert TCP connections into something your application can handle.

TLS

The TLS middleware terminates TLS using Fly managed application certificates, then forwards a plaintext connection to the application process. This is useful for running TCP services and offloading TLS to the Fly proxy.

For performance purposes, the Fly proxy will terminate TLS on the host a client connects to, and then forward the connection to the nearest available application instance.

Note: the TLS handler includes ALPN negotiation for HTTP/2. When possible, applications will connect to these kinds of Fly services using HTTP/2, and we will forward an unencrypted HTTP/2 connection (h2c) to the application process.

HTTP

Many applications have limited HTTP support, the HTTP middleware normalizes HTTP connections and sends HTTP 1.1 requests to the application process. This is roughly how nginx and other reverse proxies work, and allows your application to globally accept modern HTTP protocols (like HTTP/2) without extra complexity.

If your application stack has good HTTP/2 support (like Go), you will get better performance accepting TCP connections directly, and using the TLS handler to terminate SSL. Your application does need to understand h2c for this to work, however.

TCP pass through

If you don't specify handlers, we just forward TCP to your application as is. This is useful if you want to handle TLS termination yourself, for example.