- Prérequis
- Étape 1 : Créer des répertoires de sites web
- Étape 2 : Télécharger un modèle
- Étape 3 : Inspecter la structure du projet et les fichiers de configuration
- Étape 4 : Exécution du reverse proxy nginx
- Étape 5 : Établir un lien entre un site web et le proxy nginx en cours
- Questions fréquemment posées
- Références
Cet article fournit un modèle permettant de configurer facilement le déploiement de plusieurs sites web sur un seul serveur ou sur une Droplet de digitalocean. Le reverse-proxy, les fichiers de configuration nginx et le certificat SSL sont créés automatiquement pour chaque site web fonctionnant dans un conteneur Docker.
Sommaire:
- Prérequis
- Étape 1 : Créer des répertoires de sites web
- Étape 2 : Télécharger un modèle
- Étape 3 : Inspecter la structure du projet et les fichiers de configuration
- Étape 4 : Exécution du reverse proxy nginx
- Étape 5 : Établir un lien entre un site web et le proxy nginx en cours
- Questions fréquemment posées
- Références
Prérequis
Outils nécessaires et création de noms de domaine
- Git, docker et docker-compose sont installés sur votre serveur
- Plusieurs sites web fonctionnent à l’intérieur des conteneurs Docker sur un seul serveur. (Chacun peut être soit un serveur de fichiers statiques, soit WordPress fonctionnant sur Apache, etc.
- Le nom de domaine de chaque site web est configuré pour pointer vers l’IP du serveur. Votre hôte doit être accessible au public sur les deux ports
80
and443
. Vérifiez les règles de votre pare-feu pour vous assurer que ces ports sont ouverts. - [Créer un répertoire de sites web et définir les autorisations appropriées] (https://www.datanovia.com/en/fr/lessons/comment-creer-un-repertoire-de-sites-web-avec-les-autorisations-appropriees/). Dans ce tutoriel, nous supposerons que le répertoire Web se trouve à
/srv/www
Étape 1 : Créer des répertoires de sites web
En savoir plus : Créer un répertoire de sites web et définir les autorisations appropriées
# 0. paramètres
web_dir=/srv/www
myusername=kassambara
# 1. Créer le répertoire des sites web
sudo mkdir -p $web_dir
# 2. définir votre utilisateur comme propriétaire
sudo chown -R $myusername $web_dir
# 3. définir le serveur web comme propriétaire du groupe
sudo chgrp -R www-data $web_dir
# 4. Autorisations 755 pour tout
sudo chmod -R 755 $web_dir
# 5. Les nouveaux fichiers et dossiers héritent
# propriété du groupe à partir du dossier parent
chmod g+s $web_dir
Étape 2 : Télécharger un modèle
Téléchargez un modèle dans les répertoires de votre site web www
web_dir=/srv/www
git clone https://github.com/kassambara/nginx-multiple-https-websites-on-one-server $web_dir
Étape 3 : Inspecter la structure du projet et les fichiers de configuration
Structure du projet
www
├── README.Rmd
├── README.md
├── nginx-proxy
│ ├── certs
│ ├── conf.d
│ ├── docker-compose.yml
│ ├── html
│ ├── nginx.tmpl
│ └── vhost.d
├── your-website-one.com
│ ├── docker-compose.yml
│ └── index.html
└── your-website-two.com
├── docker-compose.yml
└── index.html
A l’intérieur /nginx-proxy
, there are four empty directories: conf.d
, vhost.d
, html
and certs
. Ils sont utilisés pour stocker les fichiers de configuration nginx et Let’s Encrypt.
Inspectez le fichier de configuration docker-compose.yml
Dans /nginx-proxy/
, il y a un fichier docker-compose.yml avec ce contenu:
version: '3.6'
services:
nginx:
image: nginx
labels:
com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
container_name: nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./vhost.d:/etc/nginx/vhost.d
- ./html:/usr/share/nginx/html
- ./certs:/etc/nginx/certs:ro
nginx-gen:
image: jwilder/docker-gen
command: -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
container_name: nginx-gen
restart: unless-stopped
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./vhost.d:/etc/nginx/vhost.d
- ./html:/usr/share/nginx/html
- ./certs:/etc/nginx/certs:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro
nginx-letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: nginx-letsencrypt
restart: unless-stopped
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./vhost.d:/etc/nginx/vhost.d
- ./html:/usr/share/nginx/html
- ./certs:/etc/nginx/certs:rw
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
NGINX_DOCKER_GEN_CONTAINER: "nginx-gen"
NGINX_PROXY_CONTAINER: "nginx"
networks:
default:
external:
name: nginx-proxy
Trois services seront ainsi lancés:
nginx
: le proxy nginx-reverse, utilise l’image nginx par défaut. Le label est nécessaire pour que le conteneur letencrypt sache quel conteneur proxy nginx utiliser.nginx-gen
: utilise l’image jwilder/docker-gen. Son instruction de commande rendra une configuration nginx (basée sur nginx.tmpl) pour chaque site web / conteneur ajouté au réseau.nginx-letsencrypt
: génère et renouvelle les certificats HTTPS.
Tous ces services sont liés au réseau nginx-proxy
.
Mise à jour de nginx.tmpl : modèle de fichier de configuration Nginx
Dans /nginx-proxy/
, il y a un fichier nginx.tmpl. C’est celui utilisé par le conteneur nginx-gen
pour créer le fichier de configuration nginx pour chaque site web / conteneur ajouté au réseau.
Téléchargez la dernière version mise à jour sur [Github ici] (https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl):
# Supprimer l'ancienne version
rm -rf $web_dir/nginx-proxy/nginx.tmpl
# Télécharger la nouvelle version
curl -s https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl> $web_dir/nginx-proxy/nginx.tmpl
Étape 4 : Exécution du reverse proxy nginx
# 1. Créer le network docker
docker network create nginx-proxy
# 2. Créez le reverse-proxy avec le
# conteneurs nginx, nginx-gen et nginx-letsencrypt
cd /srv/www/nginx-proxy/
docker-compose up -d
Étape 5 : Établir un lien entre un site web et le proxy nginx en cours
Le fichier docker-compose.yml
du site web que vous souhaitez lier doit comprendre les instructions suivantes fournies dans le modèle disponible dans le dossier votre-site-un.com
(pas celui de nginx-proxy ci-dessus). Le contenu du modèle se présente comme suit:
version: '3.6'
services:
my-app:
image: nginx
restart: always
environment:
# VARIABLES D'ENVIRONNEMENT NGINX-PROXY : ME METTRE À JOUR
- VIRTUAL_HOST=your-website-one.com
- VIRTUAL_PORT=80
- LETSENCRYPT_HOST=your-website-one.com
- LETSENCRYPT_EMAIL=your.email@domain.com
# VARIABLES D'ENVIRONNEMENT END NGINX-PROXY
expose:
- 80
networks:
default:
external:
name: nginx-proxy
- Variables d’environnement:
VIRTUAL_HOST
: votre nom de domaine, utilisé dans la configuration nginx.VIRTUAL_PORT
: (facultatif) le port que votre site web écoute (par défaut 80).LETSENCRYPT_HOST
: votre nom de domaine, utilisé dans la configuration Let’s Encrypt.LETSENCRYPT_EMAIL
: votre adresse électronique, utilisée dans la configuration Let’s Encrypt.
- Ports:
- le port exposé (ici 80) doit être le même que le
PORT_VIRTUEL
ci-dessus.
- le port exposé (ici 80) doit être le même que le
- Network:
- le conteneur de votre site web doit être relié au réseau externe de dockers nommé
nginx-proxy
- le conteneur de votre site web doit être relié au réseau externe de dockers nommé
Une fois la mise à jour du fichier “docker-compose.yml” effectuée, vous pouvez démarrer le site web avec:
cd /srv/www/your-website-one.com
docker-compose up -d
Le site web est automatiquement détecté par le reverse proxy, dispose d’un certificat HTTPS et est visible à l’adresse https://your-website-one.com.
Vous pouvez répéter cette dernière étape pour tout autre conteneur que vous souhaitez relier
Questions fréquemment posées
Comment rediriger du http non-www vers le https www ?
Si vous avez le contrôle de l’enregistrement DNS, la meilleure pratique est de le prendre en charge avec un ALIAS ( ou CNAME). Voir la discussion.
Solution 1. Utiliser un conteneur de redirection. Capture toutes les redirections http, utile pour les redirections http -> https. Une vitesse folle et une petite taille ! Basé sur alpine et nginx. Source : cusspvz/redirect.docker
version: '3.6'
services:
www.example.com:
image: nginx
restart: always
volumes:
- "./:/usr/share/nginx/html"
environment:
- VIRTUAL_HOST=www.example.com
- VIRTUAL_PORT=80
- LETSENCRYPT_HOST=www.example.com
- LETSENCRYPT_EMAIL=alboukadel.kassambara@gmail.com
# rediriger le site example.com vers www.example.com
example.com:
image: cusspvz/redirect
restart: always
environment:
- VIRTUAL_HOST=example.com
- VIRTUAL_PORT=80
- HTTPS_METHOD=noredirect
- LETSENCRYPT_HOST=example.com
- REDIRECT=https://www.example.com
# Voir les paramètres de redirection disponibles : https://github.com/cusspvz/redirect.docker
- WORKER_CONNECTIONS=1024
networks:
default:
external:
name: nginx-proxy
Solution 2. voir cette demande de merge request : Ajout de l’option VIRTUAL_HOST_ALIAS
Références
Version: English
Salut ! Comment faire pour mettre une image wordpress par exemple et pas un pointage vers un fichier html ?