Back to articles
Technology Insight

Architecting an Edge Gateway with Envoy Proxy: Implementing HTTP/3 and gRPC-Web on Ubuntu VPS for Microservices

May 29, 2026

Introduction to Modern Edge Gateways

In contemporary microservices architectures, the Edge Gateway serves as the critical single point of entry, orchestrating traffic, enforcing security, and optimizing protocol translations before requests reach internal services. As web applications demand increasingly lower latencies and higher throughput, traditional reverse proxies face performance bottlenecks. Enter Envoy Proxy, an open-source, high-performance edge and service proxy designed cloud-native applications.

This technical guide provides a comprehensive walkthrough for establishing Envoy Proxy as an enterprise-grade Edge Gateway deployed on an Ubuntu Virtual Private Server (VPS). We will deep dive into configuring two revolutionary protocols: HTTP/3 (powered by QUIC) for rapid, loss-resilient web connectivity, and gRPC-Web, bridges the gap between browser-based frontends and high-performance backend gRPC microservices.

Why Envoy Proxy, HTTP/3, and gRPC-Web?

Before diving into the implementation phase, it is vital to understand the architectural advantages of this modern technological stack:

  • Envoy Proxy: Engineered with a low memory footprint and non-blocking asynchronous architecture, Envoy excels at advanced load balancing, dynamic configuration via discovery services (xDS), and deep observability.
  • HTTP/3 (QUIC): Operating over UDP instead of TCP, HTTP/3 eliminates Head-of-Line (HoL) blocking at the transport layer. It drastically improves performance across unstable mobile networks via rapid connection establishment (0-RTT) and connection migration capabilities.
  • gRPC-Web: While native gRPC requires HTTP/2 end-to-end and access to raw TCP sockets—which modern browsers do not expose—gRPC-Web acts as a translation layer. It allows browser applications to benefit from strongly typed, contract-first APIs utilizing Protocol Buffers (protobuf) via standard browser transport mechanisms.

Prerequisites and Environment Setup

To successfully execute this implementation, ensure you have the following prerequisites prepared:

  1. A Virtual Private Server (VPS) running Ubuntu 22.04 LTS or Ubuntu 24.04 LTS.
  2. A fully qualified domain name (FQDN) pointed to your VPS public IP address (e.g., gateway.example.com).
  3. Root or sudo administrative privileges on the target server.
  4. Essential ports open on your firewall: 80/TCP (HTTP challenges), 443/TCP (HTTP/2, gRPC-Web), and 443/UDP (HTTP/3 QUIC).
Note: Because HTTP/3 relies strictly on TLS encryption over UDP, obtaining valid SSL/TLS certificates is mandatory prior to initiating traffic routing. We will utilize Let's Encrypt for automated certificate provisioning.

Step 1: Installing Envoy Proxy on Ubuntu

Envoy Proxy is not distributed within standard Ubuntu upstream repositories. Therefore, we must add the official Envoy upstream repository signed by the project maintainers. Execute the following sequential commands to install Envoy:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release

# Add Envoy gpg key
curl -sL 'https://deb.envoyproxy.io/public/gpg.811579DFC3115034.key' | sudo gpg --dearmor -o /usr/share/keyrings/envoy-keyring.gpg

# Add the repository channel
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/envoy-keyring.gpg] https://deb.envoyproxy.io/public/deb/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.p/envoy.list

# Update package lists and install
sudo apt-get update
sudo apt-get install -y envoy

Verify the successful deployment by invoking the version inquiry command: envoy --version. You should see output indicating a modern, stable build of Envoy.

Step 2: Acquiring SSL/TLS Certificates via Certbot

To establish secure TLS layers for HTTP/3 and gRPC-Web, we use Certbot to fetch Let's Encrypt certificates. Install the Certbot utility and provision the certificates using the standalone authenticator method:

sudo apt-get install -y certbot
sudo certbot certonly --standalone -d gateway.example.com

Once completed, your cryptographic keys and certificates will reside within the secure path: /etc/letsencrypt/live/gateway.example.com/. Ensure Envoy has appropriate read access permissions over these specific directories.

Step 3: Designing the Comprehensive Envoy Configuration

Envoy's structural architecture relies heavily on Listeners (which receive inbound traffic), Filters (which manipulate and process requests), and Clusters (upstream groups of destination microservices). We will construct a configuration file located at /etc/envoy/envoy.yaml that integrates standard TCP traffic, HTTP/3 UDP traffic, and the specialized gRPC-Web filter network.

Below is the complete, enterprise-grade configuration blueprint required for this setup:

static_resources:
  listeners:
  # --- TCP LISTENER FOR HTTP/2 AND GRPC-WEB ---
  - name: listener_tcp
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 443
    filter_chains:
    - transport_socket:
        name: envoy.transport_sockets.tls
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
          common_tls_context:
            tls_certificates:
            - certificate_chain: { filename: "/etc/letsencrypt/live/gateway.example.com/fullchain.pem" }
              private_key: { filename: "/etc/letsencrypt/live/gateway.example.com/privkey.pem" }
            alpn_protocols: ["h2", "http/1.1"]
      filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_tcp
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: api_vhost
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: microservice_backend, timeout: 0s }
              # Advertise HTTP/3 availability via Alt-Svc header
              response_headers_to_add:
              - header: { key: "alt-svc", value: 'h3=":443"; ma=86400' }
          http_filters:
          - name: envoy.filters.http.grpc_web
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb
          - name: envoy.filters.http.cors
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

  # --- UDP LISTENER FOR HTTP/3 (QUIC) ---
  - name: listener_udp
    address:
      socket_address:
        protocol: UDP
        address: 0.0.0.0
        port_value: 443
    udp_listener_config:
      downstream_capture_and_hash_options:
        max_drivers: 16
    filter_chains:
    - transport_socket:
        name: envoy.transport_sockets.quic
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.transport_sockets.quic.v3.QuicDownstreamTransport
          downstream_tls_context:
            common_tls_context:
              tls_certificates:
              - certificate_chain: { filename: "/etc/letsencrypt/live/gateway.example.com/fullchain.pem" }
                private_key: { filename: "/etc/letsencrypt/live/gateway.example.com/privkey.pem" }
      filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_udp
          codec_type: HTTP3
          route_config:
            name: local_route_udp
            virtual_hosts:
            - name: api_vhost_udp
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: microservice_backend, timeout: 0s }
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

  clusters:
  - name: microservice_backend
    connect_timeout: 0.25s
    type: LOGICAL_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    load_assignment:
      cluster_name: microservice_backend
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 50051

Deep Dive into the Configuration Mechanics

Let us analytically dissect the crucial structural layers of this layout:

The Multi-Protocol Handshake & Alt-Svc Headers

Web browsers initiate connections using standard TCP over port 443. To transition these modern clients to the faster HTTP/3 transport layer, Envoy returns the alt-svc: h3=":443"; ma=86400 header block inside the TCP response pipeline. This explicitly informs compliant browsers that an equivalent HTTP/3 capability is operational on UDP port 443. Subsequent transactional payloads seamlessly seamlessly migrate to the highly efficient UDP listener chain.

The gRPC-Web Filter Layer

The insertion of envoy.filters.http.grpc_web captures inbound base64-encoded requests generated by frontend application web clients. It translates them into standard, application/grpc specifications before routing them into the internal backend system cluster (configured dynamically at port 50051). It simultaneously maps standard backend gRPC status headers back into browser-readable frames.

Step 4: Verification, Validation, and Optimization

To initialize your proxy gateway framework, ensure your internal application microservices are live on port 50051. Validate your Envoy yaml configuration correctness using the built-in validation CLI flag:

envoy --mode validate -c /etc/envoy/envoy.yaml

If the syntactic model passes validation parameters successfully, restart the service wrapper infrastructure using systemd utilities:

sudo systemctl restart envoy
sudo systemctl enable envoy

You can execute testing operations natively by targeting your endpoints via developer platforms or automated network command-line utilities. To ensure HTTP/3 transmission protocols are functioning appropriately, run:

curl --http3 -I https://gateway.example.com

Reviewing output logs will confirm traffic routing across the system topology, ensuring peak efficiency and highly resilient communication layers for your distributed microservices array.

Conclusion

Deploying Envoy Proxy as an edge gateway on an Ubuntu VPS bridges the gap between next-generation network protocols and internal microservices. By enabling unified support for both HTTP/3 and gRPC-Web within a single configuration architecture, you reduce network overhead, lower serialization latencies, and optimize client-to-server operations. This layout ensures your backend applications remain highly scalable, reliable, and future-proof.

Architecting an Edge Gateway with Envoy Proxy: Implementing HTTP/3 and gRPC-Web on Ubuntu VPS for Microservices | DPTCloud