Automisons l'installation de WordPress avec NGINX Unit et Ubuntu

Automisons l'installation de WordPress avec NGINX Unit et Ubuntu

Il existe de nombreux matériaux sur l'installation de WordPress, une recherche sur Google avec les mots-clés "installation WordPress" donnera environ un demi-million de résultats. Cependant, parmi eux, il y a trÚs peu de guides valables qui permettent d'installer et de configurer WordPress et le systÚme d'exploitation sous-jacent de maniÚre à ce qu'ils soient capables de soutenir un fonctionnement à long terme. Il est possible que les bonnes configurations dépendent fortement des besoins spécifiques, ou que cela soit lié au fait qu'une explication détaillée rend l'article difficile à lire.

Dans cet article, nous essaierons de rassembler le meilleur des deux approches, en fournissant un script Bash pour l'installation automatique de WordPress sur Ubuntu, tout en l'expliquant, en prĂ©cisant ce que fait chaque morceau et quels compromis nous avons faits dans son dĂ©veloppement. Si vous ĂȘtes un utilisateur expĂ©rimentĂ©, vous pouvez passer le texte de l'article et simplement prendre le script Ă  modifier et Ă  utiliser dans vos environnements. Le script produit une installation personnalisable de WordPress avec un support Lets Encrypt, fonctionnant sur NGINX Unit et adaptĂ©e Ă  un usage industriel.

L'architecture développée pour déployer WordPress avec NGINX Unit est décrite dans un ancien article, nous allons également configurer des éléments supplémentaires qui n'ont pas été couverts (comme dans de nombreux autres guides) :

  • WordPress CLI
  • Let’s Encrypt et certificats TLS
  • Mise Ă  jour automatique des certificats
  • Mise en cache NGINX
  • Compression NGINX
  • Support HTTPS et HTTP/2
  • Automatisation du processus

L'article dĂ©crira une installation sur un seul serveur, oĂč seront hĂ©bergĂ©s simultanĂ©ment le serveur de traitement statique, le serveur PHP et la base de donnĂ©es. L'installation avec support de plusieurs hĂŽtes virtuels et services est un sujet potentiel pour l'avenir. Si vous souhaitez que nous Ă©crivions sur autre chose qui n'est pas abordĂ© dans ces articles, n'hĂ©sitez pas Ă  nous le faire savoir dans les commentaires.

Exigences

  • Conteneur de serveur (LXC ou LXD), machine virtuelle, ou serveur physique ordinaire, avec au moins 512 Mo de RAM et une Ubuntu 18.04 ou plus rĂ©cente installĂ©e.
  • Ports 80 et 443 accessibles depuis Internet
  • Nom de domaine associĂ© Ă  l'adresse IP publique de ce serveur
  • AccĂšs avec des droits root (sudo).

Vue d'ensemble de l'architecture

L'architecture est la mĂȘme que celle dĂ©crite prĂ©cĂ©demment, une application web Ă  trois niveaux. Elle se compose de scripts PHP exĂ©cutĂ©s sur le gestionnaire PHP et de fichiers statiques traitĂ©s par le serveur web.

Automisons l'installation de WordPress avec NGINX Unit et Ubuntu

Principes généraux

  • De nombreuses commandes de configuration dans le script sont encapsulĂ©es dans des conditions (if) pour assurer l'idempotence : le script peut ĂȘtre exĂ©cutĂ© plusieurs fois sans risque de modifier des paramĂštres dĂ©jĂ  configurĂ©s.
  • Le script tend Ă  installer des logiciels Ă  partir des dĂ©pĂŽts, ce qui vous permet d'appliquer les mises Ă  jour systĂšme en une seule commande (apt upgrade pour Ubuntu).
  • Les commandes essaient de dĂ©terminer si elles sont exĂ©cutĂ©es dans un conteneur afin d'ajuster leurs paramĂštres en consĂ©quence.
  • Pour dĂ©finir le nombre de processus/threads lancĂ©s dans la configuration, le script essaie de deviner les paramĂštres d'automatisation appropriĂ©s pour fonctionner dans des conteneurs, des machines virtuelles ou des serveurs physiques.
  • Lors de la description des paramĂštres, nous pensons tout d'abord Ă  l'automatisation, qui, nous l'espĂ©rons, formera la base de votre propre infrastructure en tant que code.
  • Toutes les commandes sont exĂ©cutĂ©es par l'utilisateur root, car elles modifient les paramĂštres systĂšme fondamentaux, mais WordPress fonctionne en tant qu'utilisateur standard.

Configuration des variables d'environnement

Définissez les variables d'environnement suivantes avant d'exécuter le script :

  • WORDPRESS_DB_PASSWORD — mot de passe de la base de donnĂ©es WordPress
  • WORDPRESS_ADMIN_USER — nom de l'administrateur WordPress
  • WORDPRESS_ADMIN_PASSWORD — mot de passe de l'administrateur WordPress
  • WORDPRESS_ADMIN_EMAIL — e-mail de l'administrateur WordPress
  • WORDPRESS_URL — URL complĂšte du site WordPress, commençant par https://.
  • LETS_ENCRYPT_STAGING — par dĂ©faut vide, mais en dĂ©finissant la valeur sur 1, vous utiliserez les serveurs de staging de Let’s Encrypt, nĂ©cessaires pour les demandes frĂ©quentes de certificats lors de la vĂ©rification de vos paramĂštres, sinon Let’s Encrypt peut temporairement bloquer votre adresse IP en raison d'un trop grand nombre de demandes.

Le script vérifie que ces variables liées à WordPress sont définies et se termine si elles ne le sont pas.
Les lignes 572-576 du script vérifient la valeur LETS_ENCRYPT_STAGING.

Configuration des variables d'environnement dérivées

Le script aux lignes 55-61 définit les variables d'environnement suivantes, soit à une valeur fixe, soit en utilisant une valeur obtenue des variables définies dans la section précédente :

  • DEBIAN_FRONTEND="noninteractive" — informe les applications qu'elles sont lancĂ©es dans un script et qu'il n'est pas possible d'interagir avec l'utilisateur.
  • WORDPRESS_CLI_VERSION="2.4.0" — version de l'application WordPress CLI.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" — somme de contrĂŽle du fichier exĂ©cutable WordPress CLI 2.4.0 (la version est indiquĂ©e dans la variable WORDPRESS_CLI_VERSION). Le script Ă  la ligne 162 utilise cette valeur pour vĂ©rifier que le fichier WordPress CLI correct a Ă©tĂ© tĂ©lĂ©chargĂ©.
  • UPLOAD_MAX_FILESIZE="16M" — taille maximale des fichiers pouvant ĂȘtre tĂ©lĂ©chargĂ©s dans WordPress. Ce paramĂštre est utilisĂ© Ă  plusieurs endroits, il est donc plus simple de le dĂ©finir Ă  un seul endroit.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'\/ ' -f3)" — nom d'hĂŽte du systĂšme, extrait de la variable WORDPRESS_URL. UtilisĂ© pour obtenir les certificats TLS/SSL correspondants de Let’s Encrypt, ainsi que pour la vĂ©rification interne de WordPress.
  • NGINX_CONF_DIR="\/etc\/nginx" — chemin vers le rĂ©pertoire des paramĂštres NGINX, y compris le fichier principal nginx.conf.
  • CERT_DIR="\/etc\/letsencrypt\/live\/${TLS_HOSTNAME}" — chemin vers les certificats Let’s Encrypt pour le site WordPress, obtenu Ă  partir de la variable TLS_HOSTNAME.

Affectation du nom d'hĂŽte au serveur WordPress

Le script définit le nom d'hÎte du serveur afin que la valeur corresponde au nom de domaine du site. Ce n'est pas obligatoire, mais cela facilite l'envoi d'e-mails sortants via SMTP lors de la configuration d'un serveur unique, comme cela est configuré par le script.

code du script

# Change the hostname to be the same as the WordPress hostname
if [ ! "$(hostname)" == "${TLS_HOSTNAME}" ]; then
  echo " Changing hostname to ${TLS_HOSTNAME}"
  hostnamectl set-hostname "${TLS_HOSTNAME}"
fi

Ajout du nom d'hĂŽte dans \/etc\/hosts

Module complĂ©mentaire WP‑Cron est utilisĂ© pour exĂ©cuter des tĂąches pĂ©riodiques, nĂ©cessitant que WordPress puisse accĂ©der Ă  lui-mĂȘme via HTTP. Pour s'assurer que WP-Cron fonctionne correctement dans tous les environnements, le script ajoute une ligne au fichier /etc/hosts, afin que WordPress puisse s'accĂ©der lui-mĂȘme via l'interface loopback :

code du script

# Add the hostname to /etc/hosts
if [ "$(grep -m1 "${TLS_HOSTNAME}" /etc/hosts)" = "" ]; then
  echo " Adding hostname ${TLS_HOSTNAME} to /etc/hosts so that WordPress can ping itself"
  printf "::1 %sn127.0.0.1 %sn" "${TLS_HOSTNAME}" "${TLS_HOSTNAME}" >> /etc/hosts
fi

Installation des outils nécessaires pour les étapes suivantes

Le reste du script nécessite certains programmes et suppose que les dépÎts sont à jour. Nous mettons à jour la liste des dépÎts, puis installons les outils nécessaires :

code du script

# Make sure tools needed for install are present
echo " Installing prerequisite tools"
apt-get -qq update
apt-get -qq install -y 
  bc 
  ca-certificates 
  coreutils 
  curl 
  gnupg2 
  lsb-release

Ajout des dépÎts NGINX Unit et NGINX

Le script installe NGINX Unit et NGINX à code source ouvert à partir des dépÎts officiels de NGINX, afin de s'assurer que les versions avec les derniÚres mises à jour de sécurité et correctifs de bugs sont utilisées.

Le script ajoute le dépÎt NGINX Unit, puis le dépÎt NGINX, ajoutant la clé des dépÎts et les fichiers de configuration apt, définissant l'accÚs aux dépÎts via Internet.

L'installation réelle de NGINX Unit et de NGINX se déroule dans la section suivante. Nous ajoutons au préalable des dépÎts afin de ne pas mettre à jour les métadonnées plusieurs fois, ce qui rend l'installation plus rapide.

code du script

# Install the NGINX Unit repository
if [ ! -f /etc/apt/sources.list.d/unit.list ]; then
  echo " Installing NGINX Unit repository"
  curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -
  echo "deb https://packages.nginx.org/unit/ubuntu/ $(lsb_release -cs) unit" > /etc/apt/sources.list.d/unit.list
fi

# Install the NGINX repository
if [ ! -f /etc/apt/sources.list.d/nginx.list ]; then
  echo " Installing NGINX repository"
  curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -
  echo "deb https://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" > /etc/apt/sources.list.d/nginx.list
fi

Installation de NGINX, NGINX Unit, PHP MariaDB, Certbot (Let’s Encrypt) et de leurs dĂ©pendances

Une fois tous les dépÎts ajoutés, nous mettons à jour les métadonnées et installons les applications. Les paquets installés par le script comprennent également les extensions PHP recommandées lors du démarrage de WordPress.org.

code du script

echo " Mise à jour des métadonnées du dépÎt"
apt-get -qq update

# Installer PHP avec les dépendances et NGINX Unit
echo " Installation de PHP, NGINX Unit, NGINX, Certbot et MariaDB"
apt-get -qq install -y --no-install-recommends 
  certbot 
  python3-certbot-nginx 
  php-cli 
  php-common 
  php-bcmath 
  php-curl 
  php-gd 
  php-imagick 
  php-mbstring 
  php-mysql 
  php-opcache 
  php-xml 
  php-zip 
  ghostscript 
  nginx 
  unit 
  unit-php 
  mariadb-server

Configuration de PHP pour utilisation avec NGINX Unit et WordPress

Le script crée un fichier de configuration dans le répertoire conf.d. Ici, la taille maximale des fichiers téléchargés pour PHP est définie, l'affichage des erreurs PHP dans STDERR est activé, afin qu'elles soient enregistrées dans le journal de NGINX Unit, et NGINX Unit est également redémarré.

code du script

# Find the major and minor PHP version so that we can write to its conf.d directory
PHP_MAJOR_MINOR_VERSION="$(php -v | head -n1 | cut -d' ' -f2 | cut -d'.' -f1,2)"

if [ ! -f "/etc/php/${PHP_MAJOR_MINOR_VERSION}/embed/conf.d/30-wordpress-overrides.ini" ]; then
  echo " Configuring PHP for use with NGINX Unit and WordPress"
  # Add PHP configuration overrides
  cat > "/etc/php/${PHP_MAJOR_MINOR_VERSION}/embed/conf.d/30-wordpress-overrides.ini" << EOM
; Set a larger maximum upload size so that WordPress can handle
; bigger media files.
upload_max_filesize=${UPLOAD_MAX_FILESIZE}
post_max_size=${UPLOAD_MAX_FILESIZE}
; Write error log to STDERR so that error messages show up in the NGINX Unit log
error_log=/dev/stderr
EOM
fi

# Restart NGINX Unit because we have reconfigured PHP
echo " Restarting NGINX Unit"
service unit restart

Configuration des paramÚtres de la base de données MariaDB pour WordPress

Nous avons choisi MariaDB au lieu de MySQL, car elle a une communauté plus active, et de plus, elle peut offrir de meilleures performances par défaut. (Probablement, c'est plus simple ici : pour installer MySQL, il faut ajouter un autre dépÎt, note du traducteur).

Le script crée une nouvelle base de données et génÚre des identifiants d'accÚs pour WordPress via l'interface loopback :

code du script

# Set up the WordPress database
echo " Configuring MariaDB for WordPress"
mysqladmin create wordpress || echo "Ignoring above error because database may already exist"
mysql -e "GRANT ALL PRIVILEGES ON wordpress.* TO "wordpress"@"localhost" IDENTIFIED BY "$WORDPRESS_DB_PASSWORD"; FLUSH PRIVILEGES;"

Installation du programme WordPress CLI

À cette Ă©tape, le script installe le programme WP-CLI. GrĂące Ă  lui, il est possible d'installer et de gĂ©rer les rĂ©glages de WordPress sans avoir Ă  modifier manuellement des fichiers, mettre Ă  jour la base ou se connecter au panneau de contrĂŽle. Il permet Ă©galement d'installer des thĂšmes et des extensions et de mettre Ă  jour WordPress.

code du script

if [ ! -f /usr/local/bin/wp ]; then
  # Installer l'outil WordPress CLI
  echo " Installation de l'outil WordPress CLI"
  curl --retry 6 -Ls "https://github.com/wp-cli/wp-cli/releases/download/v${WORDPRESS_CLI_VERSION}/wp-cli-${WORDPRESS_CLI_VERSION}.phar" > /usr/local/bin/wp
  echo "$WORDPRESS_CLI_MD5 /usr/local/bin/wp" | md5sum -c -
  chmod +x /usr/local/bin/wp
fi

Installation et configuration de WordPress

Le script installe la derniÚre version de WordPress dans le répertoire /var/www/wordpress, et modifie également les réglages :

  • La connexion Ă  la base de donnĂ©es fonctionne via le socket de domaine unix au lieu de TCP sur loopback pour rĂ©duire le trafic TCP.
  • WordPress ajoute un prĂ©fixe. https:// Ă  l'URL, si les clients se connectent Ă  NGINX via le protocole HTTPS, et envoie l'hĂŽte distant (comme le fournit NGINX) Ă  PHP. Nous appliquons un petit bout de code pour le configurer.
  • WordPress a besoin de HTTPS pour se connecter.
  • La structure d'URL par dĂ©faut est basĂ©e sur les ressources.
  • Les bons droits sont appliquĂ©s au systĂšme de fichiers pour le rĂ©pertoire WordPress.

code du script

if [ ! -d /var/www/wordpress ]; then
  # Créer les répertoires WordPress
  mkdir -p /var/www/wordpress
  chown -R www-data:www-data /var/www

  # Télécharger WordPress en utilisant la CLI WordPress
  echo " Installation de WordPress"
  su -s /bin/sh -c 'wp --path=/var/www/wordpress core download' www-data

  WP_CONFIG_CREATE_CMD="wp --path=/var/www/wordpress config create --extra-php --dbname=wordpress --dbuser=wordpress --dbhost="localhost:/var/run/mysqld/mysqld.sock" --dbpass="${WORDPRESS_DB_PASSWORD}""

  # Cet extrait est injecté dans le fichier wp-config.php lorsqu'il est créé ;
  # il informe WordPress que nous sommes derriĂšre un proxy inverse et, en tant que tel,
  # lui permet de générer des liens en utilisant HTTPS
  cat > /tmp/wp_forwarded_for.php << 'EOM'
/* Activer HTTPS 'si' HTTP_X_FORWARDED_PROTO correspond Ă  'https' */
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
    $_SERVER['HTTPS'] = 'on';
}
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}
EOM

  # Créer la configuration WordPress
  su -s /bin/sh -p -c "cat /tmp/wp_forwarded_for.php | ${WP_CONFIG_CREATE_CMD}" www-data
  rm /tmp/wp_forwarded_for.php
  su -s /bin/sh -p -c "wp --path=/var/www/wordpress config set 'FORCE_SSL_ADMIN' 'true'" www-data

  # Installer WordPress
  WP_SITE_INSTALL_CMD="wp --path=/var/www/wordpress core install --url="${WORDPRESS_URL}" --title="${WORDPRESS_SITE_TITLE}" --admin_user="${WORDPRESS_ADMIN_USER}" --admin_password="${WORDPRESS_ADMIN_PASSWORD}" --admin_email="${WORDPRESS_ADMIN_EMAIL}" --skip-email"
  su -s /bin/sh -p -c "${WP_SITE_INSTALL_CMD}" www-data

  # Définir la structure de permalien à une valeur par défaut sensée qui n'est pas dans l'UI
  su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data

  # Supprimer le fichier d'exemple parce que c'est un ordure et pourrait poser un problÚme de sécurité
  rm /var/www/wordpress/wp-config-sample.php

  # S'assurer que les permissions WordPress sont correctes
  find /var/www/wordpress -type d -exec chmod g+s {} ;
  chmod g+w /var/www/wordpress/wp-content
  chmod -R g+w /var/www/wordpress/wp-content/themes
  chmod -R g+w /var/www/wordpress/wp-content/plugins
fi

Configuration de NGINX Unit

Le script configure NGINX Unit pour exécuter PHP et traiter les chemins WordPress, en isolant l'espace de noms des processus PHP et en optimisant les réglages de performance. Voici trois fonctions à noter :

  • Le support des espaces de noms est dĂ©fini par une condition, basĂ© sur la vĂ©rification du lancement du script dans le conteneur. Cela est nĂ©cessaire car la plupart des rĂ©glages de conteneur ne supportent pas le lancement imbriquĂ© de conteneurs.
  • Si le support des espaces de noms est prĂ©sent, l'espace de noms est dĂ©sactivĂ©. rĂ©seau. Cela est nĂ©cessaire pour permettre Ă  WordPress de se connecter simultanĂ©ment aux endpoints et d'ĂȘtre accessible sur Internet.
  • Le nombre maximum de processus est dĂ©terminĂ© comme suit : (MĂ©moire disponible pour les instances MariaDB et NGINX Uniy) / (limite de mĂ©moire allouĂ©e en PHP + 5)
    Cette valeur est configurée dans les paramÚtres de NGINX Unit.

Cette valeur suppose Ă©galement qu’il y a toujours au moins deux processus PHP en cours d'exĂ©cution, ce qui est important car WordPress effectue de nombreuses requĂȘtes asynchrones sur lui-mĂȘme. Sans processus supplĂ©mentaires, le lancement, par exemple, de WP-Cron Ă©chouera. Vous voudrez peut-ĂȘtre ajuster ces limites en fonction de vos paramĂštres locaux, car les configurations créées ici sont conservatrices. La plupart des systĂšmes de production se situent entre 10 et 100.

code du script

if [ "${container:-unknown}" != "lxc" ] && [ "$(grep -m1 -a container=lxc /proc/1/environ | tr -d ' ')" == "" ]; then
  NAMESPACES='"namespaces": {
        "cgroup": true,
        "credential": true,
        "mount": true,
        "network": false,
        "pid": true,
        "uname": true
    }'
else
  NAMESPACES='"namespaces": {}'
fi

PHP_MEM_LIMIT="$(grep 'memory_limit' /etc/php/7.4/embed/php.ini | tr -d ' ' | cut -f2 -d= | numfmt --from=iec)"
AVAIL_MEM="$(grep MemAvailable /proc/meminfo | tr -d ' kB' | cut -f2 -d: | numfmt --from-unit=K)"
MAX_PHP_PROCESSES="$(echo "${AVAIL_MEM}/${PHP_MEM_LIMIT}+5" | bc)"
echo " Nombre maximum de processus PHP calculĂ© comme ${MAX_PHP_PROCESSES}. Vous voudrez peut-ĂȘtre ajuster cette valeur en raison des variations dans votre configuration. Il n'est pas rare de voir des valeurs comprises entre 10 et 100 dans les configurations de production."

echo " Configuration de NGINX Unit pour utiliser PHP et WordPress"
cat > /tmp/wordpress.json << EOM
{
  "settings": {
    "http": {
      "header_read_timeout": 30,
      "body_read_timeout": 30,
      "send_timeout": 30,
      "idle_timeout": 180,
      "max_body_size": $(numfmt --from=iec ${UPLOAD_MAX_FILESIZE})
    }
  },
  "listeners": {
    "127.0.0.1:8080": {
      "pass": "routes/wordpress"
    }
  },
  "routes": {
    "wordpress": [
      {
        "match": {
          "uri": [
            "*.php",
            "*.php/*",
            "/wp-admin/"
          ]
        },
        "action": {
          "pass": "applications/wordpress/direct"
        }
      },
      {
        "action": {
          "share": "/var/www/wordpress",
          "fallback": {
            "pass": "applications/wordpress/index"
          }
        }
      }
    ]
  },
  "applications": {
    "wordpress": {
      "type": "php",
      "user": "www-data",
      "group": "www-data",
      "processes": {
        "max": ${MAX_PHP_PROCESSES},
        "spare": 1
      },
      "isolation": {
        ${NAMESPACES}
      },
      "targets": {
        "direct": {
          "root": "/var/www/wordpress/"
        },
        "index": {
          "root": "/var/www/wordpress/",
          "script": "index.php"
        }
      }
    }
  }
}
EOM

curl -X PUT --data-binary @/tmp/wordpress.json --unix-socket /run/control.unit.sock http://localhost/config

Configuration de NGINX

Configuration des paramĂštres principaux de NGINX

Le script crĂ©e un rĂ©pertoire pour le cache NGINX, puis crĂ©e le fichier de configuration principal. nginx.conf. Veuillez prĂȘter attention au nombre de processus manipulateurs et Ă  la dĂ©finition de la taille maximale du fichier Ă  tĂ©lĂ©charger. Il y a aussi une ligne qui connecte un fichier de configuration de compression, dĂ©fini dans la section suivante, suivie des paramĂštres de mise en cache.

code du script

# Make directory for NGINX cache
mkdir -p /var/cache/nginx/proxy

echo " Configuring NGINX"
cat > ${NGINX_CONF_DIR}/nginx.conf << EOM
user nginx;
worker_processes auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       ${NGINX_CONF_DIR}/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    client_max_body_size ${UPLOAD_MAX_FILESIZE};
    keepalive_timeout  65;
    # gzip settings
    include ${NGINX_CONF_DIR}/gzip_compression.conf;
    # Cache settings
    proxy_cache_path /var/cache/nginx/proxy
        levels=1:2
        keys_zone=wp_cache:10m
        max_size=10g
        inactive=60m
        use_temp_path=off;
    include ${NGINX_CONF_DIR}/conf.d/*.conf;
}
EOM

Configuration de la compression NGINX

La compression du contenu à la volée avant de l'envoyer aux clients est un excellent moyen d'améliorer la performance du site, à condition que la compression soit correctement configurée. Cette section du script est basée sur les paramÚtres d'ici.

code du script

cat > ${NGINX_CONF_DIR}\/gzip_compression.conf << 'EOM'
# Crédit : https://github.com/h5bp/server-configs-nginx/
# ----------------------------------------------------------------------
# | Compression                                                        |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Activez la compression gzip.
# Par défaut : désactivé
gzip on;
# Niveau de compression (1-9).
# 5 est un bon compromis entre taille et utilisation CPU, offrant environ 75%
# de réduction pour la plupart des fichiers ASCII (presque identique au niveau 9).
# Par défaut : 1
gzip_comp_level 6;
# Ne compressez rien qui soit déjà petit et peu susceptible de réduire beaucoup si
# du tout (la valeur par défaut est 20 octets, ce qui est mauvais car cela mÚne souvent à des fichiers plus gros aprÚs compression gzip).
# Par défaut : 20
gzip_min_length 256;
# Compresser les donnĂ©es mĂȘme pour les clients qui se connectent via des proxies,
# identifiĂ©s par l'en-tĂȘte "Via" (nĂ©cessaire pour CloudFront).
# Par défaut : désactivé
gzip_proxied any;
# Dites aux proxies de mettre en cache à la fois la version gzippée et la version réguliÚre d'une ressource
# chaque fois que l'en-tĂȘte des capacitĂ©s Accept-Encoding du client varie ;
# Évite le problĂšme oĂč un client non compatible gzip (qui est extrĂȘmement rare aujourd'hui)
# afficherait des caractÚres inintelligibles si leur proxy leur donnait la version gzippée.
# Par défaut : désactivé
gzip_vary on;
# Compresser toutes les sorties étiquetées avec l'un des types MIME suivants.
# `text/html` est toujours compressé par le module gzip.
# Par défaut : text/html
gzip_types
  application/atom+xml
  application/geo+json
  application/javascript
  application/x-javascript
  application/json
  application/ld+json
  application/manifest+json
  application/rdf+xml
  application/rss+xml
  application/vnd.ms-fontobject
  application/wasm
  application/x-web-app-manifest+json
  application/xhtml+xml
  application/xml
  font/eot
  font/otf
  font/ttf
  image/bmp
  image/svg+xml
  text/cache-manifest
  text/calendar
  text/css
  text/javascript
  text/markdown
  text/plain
  text/xml
  text/vcard
  text/vnd.rim.location.xloc
  text/vtt
  text/x-component
  text/x-cross-domain-policy;
EOM

Configuration NGINX pour WordPress

Ensuite, le script crée un fichier de configuration pour WordPress default.conf dans le répertoire conf.d. Ici, vous pouvez paramétrer :

  • Activation des certificats TLS obtenus auprĂšs de Let's Encrypt via Certbot (sa configuration sera dans la section suivante)
  • Configuration des paramĂštres de sĂ©curitĂ© TLS, basĂ©e sur les recommandations de Let's Encrypt
  • Activation de la mise en cache des requĂȘtes passantes par dĂ©faut pendant 1 heure
  • DĂ©sactivation de la journalisation des accĂšs, ainsi que de la journalisation des erreurs, si le fichier n'est pas trouvĂ©, pour deux fichiers frĂ©quemment demandĂ©s : favicon.ico et robots.txt
  • Interdiction d'accĂšs aux fichiers cachĂ©s et Ă  certains fichiers .php, pour empĂȘcher tout accĂšs non autorisĂ© ou tout dĂ©marrage accidentel
  • DĂ©sactiver la journalisation d'accĂšs pour les fichiers statiques et les fichiers de polices
  • DĂ©finir l'en-tĂȘte Access-Control-Allow-Origin pour les fichiers de polices
  • Ajouter du routage pour index.php et d'autres fichiers statiques.

code du script

cat > ${NGINX_CONF_DIR}\/conf.d\/default.conf << EOM
upstream unit_php_upstream {
    server 127.0.0.1:8080;
    keepalive 32;
}
server {
    listen 80;
    listen [::]:80;
    # ACME-challenge utilisé par Certbot pour Let's Encrypt
    location ^~ \/.well-known\/acme-challenge\/ {
      root \/var\/www\/certbot;
    }
    location \/ {
      return 301 https:\/${TLS_HOSTNAME}$request_uri;
    }
}
server {
    listen      443 ssl http2;
    listen [::]:443 ssl http2;
    server_name ${TLS_HOSTNAME};
    root        \/var\/www\/wordpress\/;
    # Configuration de Let's Encrypt
    ssl_certificate         ${CERT_DIR}\/fullchain.pem;
    ssl_certificate_key     ${CERT_DIR}\/privkey.pem;
    ssl_trusted_certificate ${CERT_DIR}\/chain.pem;
    include ${NGINX_CONF_DIR}\/options-ssl-nginx.conf;
    ssl_dhparam ${NGINX_CONF_DIR}\/ssl-dhparams.pem;
    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    # Cache proxy
    proxy_cache wp_cache;
    proxy_cache_valid 200 302 1h;
    proxy_cache_valid 404 1m;
    proxy_cache_revalidate on;
    proxy_cache_background_update on;
    proxy_cache_lock on;
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
    location = \/favicon.ico {
        log_not_found off;
        access_log off;
    }
    location = \/robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Refuser toutes les tentatives d'accÚs aux fichiers cachés tels que .htaccess, .htpasswd,
    # .DS_Store (Mac)
    # Garder un journal des requĂȘtes pour les analyser plus tard (ou pour passer Ă  des utilitaires de pare-feu
    # tels que fail2ban)
    location ~ \/. {
        deny all;
    }
    # Refuser l'accÚs à tous les fichiers avec une extension .php dans le répertoire uploads;
    # fonctionne dans les installations de sous-répertoire et aussi dans le réseau multisite.
    # Garder un journal des requĂȘtes pour les analyser plus tard (ou pour passer Ă  des utilitaires de pare-feu
    # tels que fail2ban).
    location ~* \/(?:uploads|files)\/.php$ {
        deny all;
    }
    # WordPress : refuser l'accĂšs aux fichiers PHP de wp-content, wp-includes
    location ~* ^\/(?:wp-content|wp-includes)\/.php$ {
        deny all;
    }
    # Refuser l'accĂšs public Ă  wp-config.php
    location ~* wp-config.php {
        deny all;
    }
    # Ne pas journaliser l'accÚs aux ressources statiques, médias
    location ~* .(?:css(.map)?|js(.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
        access_log off;
    }
    location ~* .(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
        add_header Access-Control-Allow-Origin "*";
        access_log off;
    }
    location \/ {
        try_files $uri @index_php;
    }
    location @index_php {
        proxy_socket_keepalive on;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass       http:\/\/unit_php_upstream;
    }
    location ~* .php$ {
        proxy_socket_keepalive on;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        try_files        $uri =404;
        proxy_pass       http:\/\/unit_php_upstream;
    }
}
EOM

Configuration de Certbot pour les certificats de Let's Encrypt et leur renouvellement automatique

Certbot est un outil gratuit de l'Electronic Frontier Foundation (EFF) permettant d'obtenir et de renouveler automatiquement des certificats TLS de Let's Encrypt. Le script effectue les actions suivantes pour configurer Certbot afin de gérer les certificats de Let's Encrypt dans NGINX :

  • ArrĂȘte NGINX
  • TĂ©lĂ©charge les paramĂštres TLS recommandĂ©s
  • Lance Certbot pour obtenir des certificats pour le site
  • RedĂ©marre NGINX pour utiliser les certificats
  • Configure l'exĂ©cution quotidienne de Certbot Ă  3h24 du matin pour vĂ©rifier la nĂ©cessitĂ© de renouveler les certificats, ainsi que, si nĂ©cessaire, pour tĂ©lĂ©charger de nouveaux certificats et redĂ©marrer NGINX.

code du script

echo " ArrĂȘt de NGINX pour configurer Let's Encrypt"
service nginx stop

mkdir -p /var/www/certbot
chown www-data:www-data /var/www/certbot
chmod g+s /var/www/certbot

if [ ! -f ${NGINX_CONF_DIR}/options-ssl-nginx.conf ]; then
  echo " Téléchargement des paramÚtres TLS recommandés"
  curl --retry 6 -Ls -z "Tue, 14 Apr 2020 16:36:07 GMT" 
    -o "${NGINX_CONF_DIR}/options-ssl-nginx.conf" 
    "https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf" 
    || echo "Impossible de télécharger le dernier options-ssl-nginx.conf"
fi

if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
  echo " Téléchargement des paramÚtres DH TLS recommandés"
  curl --retry 6 -Ls -z "Tue, 14 Apr 2020 16:49:18 GMT" 
    -o "${NGINX_CONF_DIR}/ssl-dhparams.pem" 
    "https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem" 
    || echo "Impossible de télécharger le dernier ssl-dhparams.pem"
fi

# Si tls_certs_init.sh n'a pas été exécuté auparavant, supprimer les certificats auto-signés
if [ ! -d "/etc/letsencrypt/accounts" ]; then
  echo " Suppression des certificats auto-signés"
  rm -rf "${CERT_DIR}"
fi

if [ "" = "${LETS_ENCRYPT_STAGING:-}" ] || [ "0" = "${LETS_ENCRYPT_STAGING}" ]; then
  CERTBOT_STAGING_FLAG=""
else
  CERTBOT_STAGING_FLAG="--staging"
fi

if [ ! -f "${CERT_DIR}/fullchain.pem" ]; then
  echo " Génération des certificats avec Let's Encrypt"
  certbot certonly --standalone 
         -m "${WORDPRESS_ADMIN_EMAIL}" 
         ${CERTBOT_STAGING_FLAG} 
         --agree-tos --force-renewal --non-interactive 
         -d "${TLS_HOSTNAME}"
fi

echo " Lancement de NGINX pour utiliser la nouvelle configuration"
service nginx start

# Écriture du crontab pour le renouvellement pĂ©riodique des certificats Let's Encrypt
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
  echo " Ajout de certbot au crontab pour le renouvellement automatique de Let's Encrypt"
  (crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'" ) | crontab -
fi

Configuration supplémentaire de votre site

Nous avons expliquĂ© ci-dessus comment notre script configure NGINX et NGINX Unit pour servir un site prĂȘt pour le dĂ©ploiement avec TLS SSL activĂ©. Vous pouvez Ă©galement, en fonction de vos besoins, ajouter Ă  l'avenir :

  • Support Brotli, compression amĂ©liorĂ©e Ă  la volĂ©e via HTTPS
  • ModSecurity avec rĂšgles pour WordPress, afin de prĂ©venir les attaques automatiques sur votre site
  • Sauvegarde pour WordPress, adaptĂ© Ă  vos besoins
  • Protection Ă  l'aide de AppArmor (sur Ubuntu)
  • Postfix ou msmtp pour que WordPress puisse envoyer des emails
  • VĂ©rifications de votre site pour que vous sachiez combien de trafic il peut supporter

Pour des performances encore meilleures de votre site, nous vous recommandons de mettre à niveau vers NGINX Plus, notre produit commercial de niveau entreprise, basé sur NGINX open source. Ses abonnés bénéficieront d'un module Brotli chargé dynamiquement, ainsi que (en supplément) NGINX ModSecurity WAF. Nous proposons également NGINX App Protect, un module WAF pour NGINX Plus basé sur une technologie de sécurité de premier plan dans l'industrie, de F5.

N.B. Pour le soutien d'un site à fort trafic, vous pouvez contacter des spécialistes Southbridge. Nous assurerons le bon fonctionnement rapide et fiable de votre site ou service sous n'importe quelle charge.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster