Configuration d'un Serveur Web DigitalOcean et Hébergement de Plusieurs Sites Web

Comment Héberger Plusieurs Sites Web HTTPS sur Un Seul Serveur

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.

Plusieurs sites web, un seul serveur



Sommaire:

Prérequis

Outils nécessaires et création de noms de domaine

É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
  1. 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.
  2. Ports:
    • le port exposé (ici 80) doit être le même que le PORT_VIRTUEL ci-dessus.
  3. Network:
    • le conteneur de votre site web doit être relié au réseau externe de dockers nommé nginx-proxy

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



Version: English

Comment Créer un Répertoire de Sites Web avec les Autorisations Appropriées (Prev Lesson)
Back to Configuration d’un Serveur Web DigitalOcean et Hébergement de Plusieurs Sites Web

Comment ( 1 )

  • Jules

    Salut ! Comment faire pour mettre une image wordpress par exemple et pas un pointage vers un fichier html ?

Give a comment

Want to post an issue with R? If yes, please make sure you have read this: How to Include Reproducible R Script Examples in Datanovia Comments