Créer un proxy inverse nginx avec Docker

大家讲道理
Libérer: 2023-03-07 22:20:02
original
2356 Les gens l'ont consulté

Un serveur proxy inverse est un serveur qui est généralement situé devant le serveur Web et peut fournir des fonctions de pièce jointe que le serveur Web lui-même ne possède pas.

Par exemple, un proxy inverse peut fournir la terminaison SSL, l'équilibrage de charge, le routage des requêtes, la mise en cache, la compression et même l'A/B. essai.

Lors de l'exécution de services Web avec des conteneurs Docker, l'exécution d'un proxy inverse peut simplifier le déploiement.

**

Pourquoi utiliser le proxy inverse pour Docker ?

**
Les conteneurs Docker se voient attribuer des adresses IP et des ports aléatoires, ce qui rend la localisation de ces conteneurs difficile du point de vue du client. Par défaut, ces adresses IP et ports sont privés et ne sont accessibles de l'extérieur que s'ils sont liés à l'hôte.

Lier le conteneur à l'hôte empêchera les conteneurs de s'exécuter sur le même port. Par exemple, un seul docker peut être lié au port 80 à la fois. De plus, cela complique le déploiement de nouvelles versions de conteneurs. Parce que la nouvelle version ne peut démarrer le service qu'après que l'ancienne version a arrêté le service.

Le proxy inverse peut résoudre les problèmes ci-dessus tout en améliorant la fiabilité en fournissant 0 temps d'arrêt.

**

Générer la configuration du proxy inverse

**

Définir le proxy inverse lorsque le conteneur est démarré et arrêté Configuration est une affaire de responsabilité. Souvent, les configurations doivent être mises à jour manuellement, ce qui prend beaucoup de temps et est sujet aux erreurs.

Heureusement, docker fournit un appel à distance API qui peut être observé facilement et accéder à l'IP et au port du conteneur, aux métadonnées déjà configurées. De plus, docker fournit également une API événementen temps réel, qui peut être utilisée pour envoyer des notifications lorsque le conteneur démarre et s'arrête. Ces API peuvent être utilisées pour générer automatiquement des configurations de proxy inverse.

docker-gen est une petite application. Il utilise l'API de Docker pour importer les métadonnées du conteneur dans le modèle. Après avoir généré le modèle, vous pouvez l'utiliser pour redémarrer le service.

En utilisant docker-gen, vous pouvez générer automatiquement la configuration nginx et recharger nginx lorsque la configuration change. La même méthode peut être utilisée pour la gestion des journaux Docker.

**

Proxy inverse nginx pour Docker

**
L'exemple de modèle nginx suivant peut être utilisé pour générer des conteneurs Docker Proxy inverse configuration. Ce modèle utilise golang. La fonction groupby template est utilisée pour regrouper le conteneur en cours d'exécution en groupes Le regroupement est basé sur l'environnement VIRTUAL_HOST variable . Cette méthode simplifie la traversée des conteneurs pour générer un backend à charge équilibrée et prend également en charge le déploiement sans temps d'arrêt.

{{ plage

conteneurs := groupBy « Env.VIRTUAL_HOST » }} 
en amont {{

hôte }} {

{{ plage

valeur := conteneurs }}
{{ avec

adresse := index valeur.Adresses 0 }}
serveur {{

adresse.IP }} :{{ $adresse.Port }}
{{ fin }}
{{ fin }}

}

serveur {
#ssl_certificate /etc/nginx/certs/demo.pem
#ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name {{ $host }};

location / {
    proxy_pass http://{{ $host }};
    include /etc/nginx/proxy_params;
}
Copier après la connexion
Copier après la connexion

}
{{ end }}

Ce modèle utilise la commande suivante Exécutez :
docker-gen -only-exposed -watch -notify « /etc/init.d/nginx reload » templates/nginx.tmpl /etc/nginx/sites-enabled/default

-only-exposed - 仅使用暴露出端口的容器.
-watch - 运行后,观察容器的事件,并重新生成模板.
-notify "/etc/init.d/nginx reload" - 重新加载nginx.
templates/nginx.tmpl - nginx模板.
/etc/nginx/sites-enabled/default - 目标文件.
Copier après la connexion
Copier après la connexion

Ce qui suit est un modèle configuré avec deux conteneurs demo1 et demo2

upstream demo1.localhost {
Serveur 172.17.0.4:5000
serveur 172.17.0.3:5000;
}

serveur {
#ssl_certificate /etc/nginx/certs/demo.pem
#ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo1.localhost;

location / {
    proxy_pass http://demo.localhost;
    include /etc/nginx/proxy_params;
}
Copier après la connexion
Copier après la connexion

}

upstream demo2.localhost {
serveur 172.17.0.5:5000;
}

serveur {
#ssl_certificate /etc/nginx/certs/demo.pem
#ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo2.localhost;

location / {
    proxy_pass http://demo2.localhost;
    include /etc/nginx/proxy_params;
}
Copier après la connexion
Copier après la connexion

}

**

Essayez-le

**

Vous pouvez essayer le build que j'ai réalisé. https://index.docker.io/u/jwilder/nginx-proxy/
Exécutez le conteneur proxy nginx :

docker run -e VIRTUAL_HOST=foo.bar.com -t …

Si vous utilisez HTTPS et souhaitez exécuter d'autres conteneurs, vous pouvez jeter un œil à git sur le hub pour plus d'informations.

**

Conclusion

**
La génération de la configuration du proxy inverse nginx pour le conteneur Docker peut être effectuée automatiquement à l'aide de l'API Docker. Cette approche simplifie le déploiement et améliore la disponibilité.

Cette solution est très pratique pour les conteneurs fonctionnant sur un seul hôte. Fournit la découverte du service de dépendance de configuration pour les hôtes distribués. Vous pouvez jeter un œil à ce que le service Docker a découvert et trouver une solution.

Traduction. Voir le texte original : http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/

Un serveur proxy inverse est généralement situé devant le serveur Web Serveur, qui peut fournir des fonctions de pièce jointe que le serveur Web lui-même ne possède pas.

Par exemple, un proxy inverse peut fournir la terminaison SSL, l'équilibrage de charge, le routage des requêtes, la mise en cache, la compression et même les tests A/B.

Lors de l'exécution de services Web avec des conteneurs Docker, l'exécution d'un proxy inverse peut simplifier le déploiement.

**

Pourquoi utiliser le proxy inverse pour Docker ?

**
Les conteneurs Docker se voient attribuer des adresses IP et des ports aléatoires, ce qui rend la localisation de ces conteneurs difficile du point de vue du client. Par défaut, ces adresses IP et ports sont privés et ne sont accessibles de l'extérieur que s'ils sont liés à l'hôte.

Lier le conteneur à l'hôte empêchera les conteneurs de s'exécuter sur le même port. Par exemple, un seul docker peut être lié au port 80 à la fois. De plus, cela complique le déploiement de nouvelles versions de conteneurs. Parce que la nouvelle version ne peut démarrer le service qu'après que l'ancienne version a arrêté le service.

Le proxy inverse peut résoudre les problèmes ci-dessus tout en améliorant la fiabilité en fournissant 0 temps d'arrêt.

**

Générer la configuration du proxy inverse

**

Définir le proxy inverse lorsque le conteneur est démarré et arrêté Configuration est une affaire de responsabilité. Les configurations doivent souvent être mises à jour manuellement, ce qui prend beaucoup de temps et est sujet aux erreurs.

Heureusement, docker fournit une API d'appel à distance qui peut facilement observer et accéder à l'adresse IP et au port du conteneur, aux métadonnées déjà configurées. De plus, Docker fournit également une API d'événements en temps réel qui peut être utilisée pour envoyer des notifications lorsque le conteneur démarre et s'arrête. Ces API peuvent être utilisées pour générer automatiquement des configurations de proxy inverse.

docker-gen est une petite application. Il utilise l'API de Docker pour importer les métadonnées du conteneur dans le modèle. Après avoir généré le modèle, vous pouvez l'utiliser pour redémarrer le service.

En utilisant docker-gen, vous pouvez générer automatiquement la configuration nginx et recharger nginx lorsque la configuration change. La même méthode peut être utilisée pour la gestion des journaux Docker.

**

Proxy inverse nginx pour Docker

**
L'exemple de modèle nginx suivant peut être utilisé pour générer des conteneurs Docker Proxy inverse configuration. Ce modèle utilise Golang. La fonction de modèle groupby est utilisée pour regrouper les conteneurs en cours d'exécution. Le regroupement est basé sur la variable d'environnement VIRTUAL_HOST. Cette méthode simplifie la traversée des conteneurs pour générer un backend à charge équilibrée et prend également en charge le déploiement sans temps d'arrêt.

{{ range

conteneurs := groupBy «Env.VIRTUAL_HOST» }} 
en amont {{

hôte }} {

{{ plage

valeur := conteneurs }} 
 {{ avec

adresse := index valeur.Adresses 0 }}
serveur {{

adresse.IP }} :{{ $adresse .Port }}
{{ end }}
{{ end }}

}

serveur {
#ssl_certificate /etc/nginx/certs/demo.pem
#ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name {{ $host }};

location / {
    proxy_pass http://{{ $host }};
    include /etc/nginx/proxy_params;
}
Copier après la connexion
Copier après la connexion

}
{{ end }}

Ce modèle est exécuté à l'aide de la commande suivante :
docker - gen -only-exposed -watch -notify « /etc/init.d/nginx reload » templates/nginx.tmpl /etc/nginx/sites-enabled/default

-only-exposed - 仅使用暴露出端口的容器.
-watch - 运行后,观察容器的事件,并重新生成模板.
-notify "/etc/init.d/nginx reload" - 重新加载nginx.
templates/nginx.tmpl - nginx模板.
/etc/nginx/sites-enabled/default - 目标文件.
Copier après la connexion
Copier après la connexion

Voici deux configurations Modèles pour les conteneurs demo1 et demo2

upstream demo1.localhost {
Serveur 172.17.0.4:5000
serveur 172.17.0.3:5000;
}

serveur {
#ssl_certificate /etc/nginx/certs/demo.pem
#ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo1.localhost;

location / {
    proxy_pass http://demo.localhost;
    include /etc/nginx/proxy_params;
}
Copier après la connexion
Copier après la connexion

}

upstream demo2.localhost {
serveur 172.17.0.5:5000;
}

serveur {
#ssl_certificate /etc/nginx/certs/demo.pem
#ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo2.localhost;

location / {
    proxy_pass http://demo2.localhost;
    include /etc/nginx/proxy_params;
}
Copier après la connexion
Copier après la connexion

}

**

Essayez-le

**

Vous pouvez essayer le build que j'ai réalisé. https://index.docker.io/u/jwilder/nginx-proxy/
Exécutez le conteneur proxy nginx :

docker run -e VIRTUAL_HOST=foo.bar.com -t …

Si vous utilisez HTTPS et souhaitez exécuter d'autres conteneurs, vous pouvez consulter le projet sur github pour plus d'informations.

**

Conclusion

**
La génération de la configuration du proxy inverse nginx pour le conteneur Docker peut être effectuée automatiquement à l'aide de l'API Docker. Cette approche simplifie le déploiement et améliore la disponibilité.

Cette solution est très pratique pour les conteneurs fonctionnant sur un seul hôte. Fournit la découverte du service de dépendance de configuration pour les hôtes distribués. Vous pouvez jeter un œil à ce que le service Docker a découvert et trouver une solution.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!