Un ami m’a demandé un exemple de comment mettre en ligne une API en utilisant un proxy inverse avec le langage Go. Ci-dessous, j’expose un petit guide.
Tout d’abord, démarrez un serveur et enregistrez votre IP auprès du fournisseur de DNS. Associez l’IP à un nom afin de créer un certificat HTTPS pour la machine.
Configurez le pare-feu de la machine et n’ouvrez que les ports 22 (SSH), 80 (HTTP) et 443 (HTTPS).
Caddy
J’utilise le serveur HTTP Caddy. Il est pratique et génère automatiquement des certificats HTTPS. Par défaut, il redirige les requêtes HTTP vers HTTPS.
Pour installer Caddy sur votre système d’exploitation, suivez les instructions sur https://caddyserver.com/docs/install.
Après l’installation, éditez le fichier /etc/caddy/Caddyfile et ajoutez la configuration suivante :
example.com {
# Define um arquivo para registrar o log do servidor
log {
output file /var/log/caddy/example.com.log
}
# Configura o servidor para servir páginas estáticas
root * /var/www/html
file_server
# Redireciona chamadas iniciadas com o endpoint /api
route /api* {
reverse_proxy 127.0.0.1:8080
}
}
Le Caddy prendra le domaine configuré à la place de example.com, interrogera le serveur DNS pour vérifier s’il correspond à l’IP du serveur et créera les certificats TLS pour vous.
Cette configuration suppose que vous souhaitez servir des fichiers statiques. Si vous préférez que le code Go fournisse la base du serveur, retirez les configurations du chemin root et modifiez la route comme dans l’exemple suivant :
route /* {
reverse_proxy 127.0.0.1:8080
}
API
Pour cet exemple, nous créerons un serveur HTML simple. Il écoutera sur le port 8080 et répondra « Hello, world ! » aux requêtes.
package main
import (
"io"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello, world!")
}
func main() {
http.HandleFunc("https://imasters.com.br/", handler)
err := http.ListenAndServe(":8080", nil)
if err != nil {
panic(err)
}
}
Ce code sert uniquement à démontrer que le redirection de port via le proxy inverse avec Caddy fonctionne.
tmux
Le tmux est présent dans toutes les distributions Linux. Comme GNU Screen, on peut l’utiliser pour maintenir un serveur en fonctionnement pendant les tests, même si la connexion se coupe. Ce n’est pas une bonne pratique d’employer tmux pour des services en production. Néanmoins, lors du débogage, examiner les sorties affichées à l’écran aide énormément. Si vous ne connaissez pas tmux, cela vaut la peine d’apprendre cet outil.
Supervisor
Pour l’environnement de production, une excellente manière de gérer votre service est d’utiliser le supervisor.
Pour l’installation sur Debian ou Ubuntu, utilisez la commande :
apt-get install supervisor
Ensuite, créez un fichier api.conf dans le répertoire /etc/supervisor/conf.d/. (Le chemin peut varier selon la distribution Linux)
Voici un exemple simple de fichier de configuration pour lancer notre service :
[program:api]
command=/path/api
directory=/path
autostart=true
Le supervisor utilisera l’exécutable /path/api pour démarrer le service. Vous pouvez ajouter d’autres réglages, comme un redémarrage automatique en cas d’erreur ou la redirection des journaux.
Après avoir créé le fichier de configuration, rechargez le supervisor avec la commande :
supervisorctl reread # recarrega a configuração
supervisorctl update # executa as mudanças
Vous pouvez voir l’état de votre service avec la commande suivante :
supervisorctl status api
Pour démarrer le service, utilisez :
supervisorctl start api
Et pour arrêter le service, utilisez :
supervisorctl stop api
Il existe de très nombreuses autres commandes. Utilisez man supervisorctl pour en apprendre davantage à leur sujet.
Conclusion
Voici un aperçu simplifié de la manière de mettre en ligne une application écrite en Go de façon maîtrisée, avec des certificats TLS et une capacité d’évolution sans compromettre la simplicité. À mesure que votre système se développe, vous ajouterez probablement davantage de services et de routes dans Caddy, mais cela ne deviendra pas plus compliqué.
Cette méthode permet de déployer une application Go en tant qu’utilisateur ordinaire sur un port élevé. Le Caddy s’occupera du proxy inverse et des certificats TLS. Le supervisor veillera sur le service en production.
Éventuellement, vous pourriez avoir besoin de workers pour des tâches asynchrones. Pour cela, utilisez le crontab et de petits exécutables. Cela restera facile à maintenir.




