← Back to home page

Implémenter un reverse proxy en Go

October 4, 2025

💬

Join our Discord!

Join our Discord server to discuss Go, DevOps and connect with the community!

Introduction

Dans ce tutoriel, nous allons créer un reverse proxy en Go en utilisant le package httputil.

Un reverse proxy est particulièrement utile pour gérer le load balancing, le caching, ou encore pour ajouter une couche de sécurité devant vos services backend.

Le code complet est disponible sur Hypercommit.

Qu'est-ce qu'un reverse proxy ?

Un reverse proxy est un serveur qui se place devant vos serveurs backend et achemine les requêtes des clients vers les serveurs appropriés.

Il permet de gérer le load balancing, le caching, et la sécurité.

Étape 1 : Initialiser le projet

Commencez par créer un nouveau dossier et initialiser un module Go :

mkdir reverse-proxy
cd reverse-proxy
go mod init hypercommit.com/votre-username/reverse-proxy

Étape 2 : Créer le fichier main.go

Créez un fichier main.go et ajoutez le code de base :

package main

import (
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func main() {
    // URL du serveur backend
    target, err := url.Parse("http://localhost:8080")
    if err != nil {
        log.Fatal(err)
    }

    // Créer le reverse proxy
    proxy := httputil.NewSingleHostReverseProxy(target)

    // Démarrer le serveur sur le port 3000
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        proxy.ServeHTTP(w, r)
    })

    log.Println("Reverse proxy démarré sur :3000")
    log.Fatal(http.ListenAndServe(":3000", nil))
}

Vous pouvez maintenant tester avec go run main.go.

Étape 3 : Customiser les requêtes

Ajoutez un Director personnalisé pour modifier les headers des requêtes. Modifiez votre main.go après la création du proxy :

// Créer le reverse proxy
proxy := httputil.NewSingleHostReverseProxy(target)

// Customiser les requêtes
proxy.Director = func(req *http.Request) {
    req.URL.Scheme = target.Scheme
    req.URL.Host = target.Host
    req.Host = target.Host
    req.Header.Set("X-Forwarded-Host", req.Header.Get("Host"))
    req.Header.Set("X-Origin-Host", target.Host)
}

Étape 4 : Gérer les erreurs

Il est essentiel de gérer les erreurs de connexion au backend. Ajoutez un ErrorHandler juste après le Director :

// Gérer les erreurs
proxy.ErrorHandler = func(w http.ResponseWriter, r *http.Request, err error) {
    log.Printf("Erreur proxy: %v", err)
    w.WriteHeader(http.StatusBadGateway)
    w.Write([]byte("Service indisponible"))
}

Tester votre reverse proxy

Pour tester, lancez d'abord un serveur backend sur le port 8080, puis démarrez votre proxy :

go run main.go

Votre reverse proxy est maintenant opérationnel sur le port 3000 !

Conclusion

httputil.ReverseProxy offre une solution élégante et performante pour créer un reverse proxy en Go.

En quelques étapes simples, vous obtenez un proxy fonctionnel que vous pouvez ensuite customiser selon vos besoins.

Pour aller plus loin, consultez la documentation officielle et rejoins notre Discord !

Implémenter un reverse proxy en Go | Hypercommit Blog