Automatiséieren WordPress Installatioun mat NGINX Eenheet an Ubuntu

Automatiséieren WordPress Installatioun mat NGINX Eenheet an Ubuntu

Et gi vill Tutorials wéi Dir WordPress installéiere kënnt, eng Google Sich no "WordPress install" wäert ongeféier eng hallef Millioun Resultater ginn. Wéi och ëmmer, et gi ganz wéineg gutt Guiden ënnert hinnen, no deenen Dir WordPress an de Basisbetribssystem installéiere kënnt an konfiguréieren sou datt se fäeg sinn fir eng laang Zäit z'ënnerstëtzen. Vläicht sinn déi richteg Astellunge ganz ofhängeg vu spezifesche Besoinen, oder dat ass wéinst der Tatsaach datt eng detailléiert Erklärung den Artikel schwéier ze liesen mécht.

An dësem Artikel wäerte mir probéieren dat Bescht vu béide Welten ze kombinéieren andeems Dir e Bash Skript ubitt fir WordPress automatesch op Ubuntu z'installéieren, souwéi duerch et ze goen, z'erklären wat all Stéck mécht, souwéi d'Kompromisser déi mir gemaach hunn an der Entwécklung . Wann Dir en fortgeschrattene Benotzer sidd, kënnt Dir den Text vum Artikel iwwersprangen a just de Skript huelen fir Ännerung a Gebrauch an Ären Ëmfeld. D'Ausgab vum Skript ass eng personaliséiert WordPress Installatioun mat Lets Encrypt Support, Lafen op NGINX Unit a gëeegent fir Produktiounsgebrauch.

Déi entwéckelt Architektur fir WordPress z'installéieren mat der NGINX Eenheet gëtt an eeleren Artikel, elo wäerte mir och weider Saachen konfiguréieren déi net do waren (wéi a villen aneren Tutorials):

  • WordPress CLI
  • Loosst eis verschlësselen an TLSSSL Certificaten
  • Automatesch Erneierung vun Certificaten
  • NGINX Cache
  • NGINX Kompressioun
  • HTTPS an HTTP/2 Ënnerstëtzung
  • Prozess Automatisatioun

Den Artikel wäert d'Installatioun op engem Server beschreiwen, deen gläichzäiteg e statesche Veraarbechtungsserver, e PHP-Veraarbechtungsserver an eng Datebank héiert. Eng Installatioun déi verschidde virtuell Hosten a Servicer ënnerstëtzt ass e potenziellt Thema fir d'Zukunft. Wann Dir wëllt datt mir iwwer eppes schreiwen wat net an dësen Artikelen ass, schreift an de Kommentaren.

Ufuerderunge

  • Container Server (LXC oder LXD), eng virtuell Maschinn, oder e reguläre Eisenserver mat mindestens 512MB RAM an Ubuntu 18.04 oder méi nei installéiert.
  • Internet zougänglech Ports 80 an 443
  • Domain Numm assoziéiert mat der ëffentlecher IP Adress vun dësem Server
  • Root Zougang (sudo).

Architektur Iwwersiicht

D'Architektur ass déiselwecht wéi beschriwwen virdrun, eng dräistäckeg Webapplikatioun. Et besteet aus PHP Scripten déi um PHP-Motor lafen a statesch Dateien déi vum Webserver veraarbecht ginn.

Automatiséieren WordPress Installatioun mat NGINX Eenheet an Ubuntu

Generelle Prinzipien

  • Vill Konfiguratiounsbefehl an engem Skript sinn agewéckelt wann Konditioune fir Idempotenz: de Skript kann e puer Mol lafen ouni de Risiko fir Astellungen z'änneren déi scho sinn.
  • De Skript probéiert Software vu Repositories z'installéieren, sou datt Dir Systemupdates an engem Kommando benotze kënnt (apt upgrade fir Ubuntu).
  • Kommandoen probéieren z'entdecken datt se an engem Container lafen, sou datt se hir Astellungen deementspriechend änneren.
  • Fir d'Zuel vun de Fuedemprozesser ze setzen fir an den Astellungen unzefänken, probéiert de Skript déi automatesch Astellunge ze roden fir a Containeren, virtuelle Maschinnen an Hardwareserveren ze schaffen.
  • Wann mir Astellunge beschreiwen, denken mir ëmmer fir d'éischt un d'Automatisatioun, déi, mir hoffen, d'Basis gëtt fir Är eege Infrastruktur als Code ze kreéieren.
  • All Kommandoe ginn als Benotzer ausgeführt root, well se d'Basis System Astellunge änneren, awer direkt WordPress leeft als normale Benotzer.

Ëmfeld Verännerlechen Astellung

Setzt déi folgend Ëmfeldvariablen ier Dir de Skript leeft:

  • WORDPRESS_DB_PASSWORD - WordPress Datebank Passwuert
  • WORDPRESS_ADMIN_USER - WordPress Admin Numm
  • WORDPRESS_ADMIN_PASSWORD - WordPress Admin Passwuert
  • WORDPRESS_ADMIN_EMAIL - WordPress Admin E-Mail
  • WORDPRESS_URL ass déi komplett URL vum WordPress Site, ab https://.
  • LETS_ENCRYPT_STAGING - Par défaut eidel, awer andeems Dir de Wäert op 1 setzt, benotzt Dir d'Let's Encrypt Staging Server, déi néideg sinn fir dacks Zertifikater ze froen wann Dir Är Astellungen testen, soss kann Let's Encrypt Är IP Adress temporär blockéieren wéinst enger grousser Unzuel vun Ufroen .

De Skript kontrolléiert datt dës WordPress-verwandte Variablen agestallt sinn an erausgoen wann net.
Skript Linnen 572-576 kontrolléieren de Wäert LETS_ENCRYPT_STAGING.

Astellung ofgeleet Ëmfeld Variablen

De Skript op Linnen 55-61 setzt déi folgend Ëmfeldvariablen, entweder op e puer haart kodéierte Wäert oder benotzt e Wäert, deen aus de Variabelen an der viregter Sektioun gesat gëtt:

  • DEBIAN_FRONTEND="noninteractive" - Erzielt Uwendungen datt se an engem Skript lafen an datt et keng Méiglechkeet vu Benotzerinteraktioun ass.
  • WORDPRESS_CLI_VERSION="2.4.0" ass d'Versioun vun der WordPress CLI Applikatioun.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" - Checksum vun der WordPress CLI 2.4.0 ausführbar Datei (d'Versioun gëtt an der Variabel spezifizéiert WORDPRESS_CLI_VERSION). De Skript op der Linn 162 benotzt dëse Wäert fir ze kontrolléieren ob déi richteg WordPress CLI Datei erofgeluede gouf.
  • UPLOAD_MAX_FILESIZE="16M" - déi maximal Dateigréisst déi op WordPress eropgeluede ka ginn. Dës Astellung gëtt op e puer Plazen benotzt, sou datt et méi einfach ass op enger Plaz ze setzen.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" - Hostnumm vum System, aus der WORDPRESS_URL Variabel zréckgezunn. Benotzt fir entspriechend TLS / SSL Zertifikater vu Let's Encrypt souwéi intern WordPress Verifikatioun ze kréien.
  • NGINX_CONF_DIR="/etc/nginx" - Wee an de Verzeechnes mat NGINX Astellungen, dorënner d'Haaptdatei nginx.conf.
  • CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" - de Wee op d'Let's Encrypt Certificaten fir de WordPress Site, kritt vun der Variabel TLS_HOSTNAME.

Gitt e Hostnumm un e WordPress Server

De Skript setzt den Hostnumm vum Server fir dem Domain Numm vum Site ze passen. Dëst ass net erfuerderlech, awer et ass méi bequem fir erausginn Mail iwwer SMTP ze schécken wann Dir en eenzege Server opstellt, wéi vum Skript konfiguréiert.

Skript Code

# 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

Füügt Hostnumm op /etc/hosts

Addition WP-Cron benotzt fir periodesch Aufgaben ze lafen, erfuerdert WordPress fir sech selwer iwwer HTTP zouzegräifen. Fir sécherzestellen datt WP-Cron an all Ëmfeld korrekt funktionnéiert, füügt de Skript eng Zeil an d'Datei / etc / hunsou datt WordPress sech selwer iwwer de Loopback Interface ka zougräifen:

Skript Code

# 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

Installéiert déi néideg Tools fir déi nächst Schrëtt

De Rescht vum Skript brauch e puer Programmer an iwwerhëlt datt d'Repositories aktuell sinn. Mir aktualiséieren d'Lëscht vun de Repositories, duerno installéiere mir déi néideg Tools:

Skript Code

# 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

NGINX Eenheet an NGINX Repositories derbäi

De Skript installéiert NGINX Eenheet an Open Source NGINX vun den offiziellen NGINX Repositories fir sécherzestellen datt d'Versioune mat de leschte Sécherheetspatches a Bugfixes benotzt ginn.

De Skript füügt den NGINX Unit Repository an dann den NGINX Repository derbäi, addéiere de Repositories Schlëssel a Konfiguratiounsdateien apt, Zougang zu Repositories iwwer Internet definéieren.

Déi aktuell Installatioun vun NGINX Eenheet an NGINX geschitt an der nächster Sektioun. Mir fügen d'Repositories vir, sou datt mir d'Metadaten net e puer Mol musse aktualiséieren, wat d'Installatioun méi séier mécht.

Skript Code

# 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

Installéiere vun NGINX, NGINX Unit, PHP MariaDB, Certbot (Let's Encrypt) an hir Ofhängegkeeten

Wann all d'Repositories bäigefüügt sinn, aktualiséieren d'Metadaten an installéiert d'Applikatiounen. D'Packagen, déi vum Skript installéiert sinn, enthalen och d'PHP-Extensiounen recommandéiert wann Dir WordPress.org leeft

Skript Code

echo " Updating repository metadata"
apt-get -qq update

# Install PHP with dependencies and NGINX Unit
echo " Installing PHP, NGINX Unit, NGINX, Certbot, and 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

PHP opsetzen fir mat NGINX Eenheet a WordPress ze benotzen

De Skript erstellt eng Astellungsdatei am Verzeechnes conf.d. Dëst setzt déi maximal Dateigréisst fir PHP-Uploads, schalt PHP-Fehlerausgang op STDERR un, sou datt se an den NGINX Unit Log geschriwwe ginn an d'NGINX Unit nei starten.

Skript Code

# 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

MariaDB Datebank Astellunge fir WordPress spezifizéieren

Mir hunn MariaDB iwwer MySQL gewielt well et méi Gemeinschaftsaktivitéit huet an och méiglech ass stellt besser Leeschtung Par défaut (wahrscheinlech ass alles méi einfach hei: fir MySQL z'installéieren, musst Dir en anere Repository derbäi, ca. Iwwersetzer).

De Skript erstellt eng nei Datebank a erstellt Umeldungsinformatiounen fir Zougang zu WordPress iwwer d'Loopback Interface:

Skript Code

# 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;"

Installéiere vum WordPress CLI Programm

Op dësem Schrëtt installéiert de Skript de Programm WP-CLI. Mat et kënnt Dir WordPress Astellungen installéieren a verwalten ouni manuell Dateien z'änneren, d'Datebank ze aktualiséieren oder d'Kontrollpanel anzeginn. Et kann och benotzt ginn fir Themen an Add-ons z'installéieren an WordPress ze aktualiséieren.

Skript Code

if [ ! -f /usr/local/bin/wp ]; then
  # Install the WordPress CLI
  echo " Installing the WordPress CLI tool"
  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

WordPress installéieren an konfiguréieren

De Skript installéiert déi lescht Versioun vu WordPress an engem Verzeechnes /var/www/wordpressan ännert och d'Astellungen:

  • D'Datebankverbindung funktionnéiert iwwer Unix Domain Socket anstatt TCP op Loopback fir den TCP Traffic ze reduzéieren.
  • WordPress füügt e Präfix https:// op d'URL wann d'Clientë mat NGINX iwwer HTTPS verbannen, a schéckt och den Fernhostnumm (wéi vum NGINX geliwwert) op PHP. Mir benotzen e Stéck Code fir dëst opzestellen.
  • WordPress brauch HTTPS fir Login
  • D'Standard URL Struktur baséiert op Ressourcen
  • Setzt déi richteg Permissiounen am Dateiesystem fir de WordPress Verzeechnes.

Skript Code

if [ ! -d /var/www/wordpress ]; then
  # Create WordPress directories
  mkdir -p /var/www/wordpress
  chown -R www-data:www-data /var/www

  # Download WordPress using the WordPress CLI
  echo " Installing 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}""

  # This snippet is injected into the wp-config.php file when it is created;
  # it informs WordPress that we are behind a reverse proxy and as such
  # allows it to generate links using HTTPS
  cat > /tmp/wp_forwarded_for.php << 'EOM'
/* Turn HTTPS 'on' if HTTP_X_FORWARDED_PROTO matches '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

  # Create WordPress configuration
  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

  # Install 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

  # Set permalink structure to a sensible default that isn't in the UI
  su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data

  # Remove sample file because it is cruft and could be a security problem
  rm /var/www/wordpress/wp-config-sample.php

  # Ensure that WordPress permissions are correct
  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

NGINX Eenheet opbauen

De Skript konfiguréiert d'NGINX Eenheet fir PHP auszeféieren an WordPress Weeër ze veraarbechten, de PHP-Prozessnameraum ze isoléieren an d'Performance-Astellungen ze optimiséieren. Et ginn dräi Features fir hei nozekucken:

  • Ënnerstëtzung fir Nummraim gëtt duerch Konditioun festgeluegt, baséiert op der Kontroll datt de Skript an engem Container leeft. Dëst ass néideg well déi meescht Container Setups net nestéiert Start vu Container ënnerstëtzen.
  • Wann et Ënnerstëtzung fir Nummraim gëtt, deaktivéiert den Nummraum Netz. Dëst ass fir WordPress z'erméiglechen mat béiden Endpunkter ze verbannen a gläichzäiteg um Internet verfügbar ze sinn.
  • Déi maximal Unzuel vu Prozesser ass wéi follegt definéiert: (Verfügbar Erënnerung fir MariaDB an NGINX Uniy ze lafen) / (RAM Limit an PHP + 5)
    Dëse Wäert gëtt an den NGINX Eenheet Astellunge festgeluecht.

Dëse Wäert implizéiert och datt et ëmmer op d'mannst zwee PHP Prozesser lafen, wat wichteg ass well WordPress vill asynchronen Ufroe fir sech selwer mécht, an ouni zousätzlech Prozesser lafen zB WP-Cron wäert briechen. Dir wëllt dës Limiten op Basis vun Äre lokalen Astellungen erhéijen oder erofsetzen, well d'Astellungen déi hei erstallt sinn konservativ sinn. Op de meeschte Produktiounssystemer sinn d'Astellungen tëscht 10 an 100.

Skript Code

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 " Calculated the maximum number of PHP processes as ${MAX_PHP_PROCESSES}. You may want to tune this value due to variations in your configuration. It is not unusual to see values between 10-100 in production configurations."

echo " Configuring NGINX Unit to use PHP and 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

NGINX opsetzen

Basis NGINX Astellunge konfiguréieren

De Skript erstellt e Verzeechnes fir den NGINX Cache an erstellt dann d'Haaptkonfiguratiounsdatei nginx.conf. Opgepasst op d'Zuel vun den Handlerprozesser an d'Astellung vun der maximaler Dateigréisst fir den Eroplueden. Et gëtt och eng Zeil déi d'Kompressiounsastellungsdatei enthält, déi an der nächster Sektioun definéiert ass, gefollegt vun den Cache-Astellungen.

Skript Code

# 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

NGINX Kompressioun opsetzen

D'Kompressioun vum Inhalt op der Flucht ier se un d'Clientë geschéckt gëtt ass e super Wee fir d'Performance vum Site ze verbesseren, awer nëmmen wann d'Kompressioun richteg konfiguréiert ass. Dës Sektioun vum Skript baséiert op Astellungen vun hei.

Skript Code

cat > ${NGINX_CONF_DIR}/gzip_compression.conf << 'EOM'
# Credit: https://github.com/h5bp/server-configs-nginx/
# ----------------------------------------------------------------------
# | Compression                                                        |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Enable gzip compression.
# Default: off
gzip on;
# Compression level (1-9).
# 5 is a perfect compromise between size and CPU usage, offering about 75%
# reduction for most ASCII files (almost identical to level 9).
# Default: 1
gzip_comp_level 6;
# Don't compress anything that's already small and unlikely to shrink much if at
# all (the default is 20 bytes, which is bad as that usually leads to larger
# files after gzipping).
# Default: 20
gzip_min_length 256;
# Compress data even for clients that are connecting to us via proxies,
# identified by the "Via" header (required for CloudFront).
# Default: off
gzip_proxied any;
# Tell proxies to cache both the gzipped and regular version of a resource
# whenever the client's Accept-Encoding capabilities header varies;
# Avoids the issue where a non-gzip capable client (which is extremely rare
# today) would display gibberish if their proxy gave them the gzipped version.
# Default: off
gzip_vary on;
# Compress all output labeled with one of the following MIME-types.
# `text/html` is always compressed by gzip module.
# Default: 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

NGINX fir WordPress opsetzen

Als nächst erstellt de Skript eng Konfiguratiounsdatei fir WordPress default.conf am Katalog conf.d. Et ass hei konfiguréiert:

  • TLS Zertifikater aktivéieren, déi vu Let's Encrypt iwwer Certbot kritt goufen (et opzestellen ass an der nächster Sektioun)
  • TLS Sécherheetsastellungen konfiguréieren baséiert op Empfehlungen vu Let's Encrypt
  • Aktivéiert Caching Skip Ufroe fir 1 Stonn Standard
  • Deaktivéiert den Zougangsprotokoll, souwéi d'Fehlerprotokoller wann d'Datei net fonnt gëtt, fir zwee gemeinsam ugefrote Dateien: favicon.ico an robots.txt
  • Verhënnert Zougang zu verstoppte Dateien an e puer Dateien .phpillegalen Zougang oder ongewollten Start ze verhënneren
  • Deaktivéiert Zougangsprotokoll fir statesch a Schrëftdateien
  • Header Astellung Zougang-Kontroll-Erlaabt-Origin fir Schrëftdateien
  • Füügt Routing fir index.php an aner Statik.

Skript Code

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 used by Certbot for 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/;
    # Let's Encrypt configuration
    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;
    # Proxy caching
    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;
    }

    # Deny all attempts to access hidden files such as .htaccess, .htpasswd,
    # .DS_Store (Mac)
    # Keep logging the requests to parse later (or to pass to firewall utilities
    # such as fail2ban)
    location ~ /. {
        deny all;
    }
    # Deny access to any files with a .php extension in the uploads directory;
    # works in subdirectory installs and also in multi-site network.
    # Keep logging the requests to parse later (or to pass to firewall utilities
    # such as fail2ban).
    location ~* /(?:uploads|files)/.*.php$ {
        deny all;
    }
    # WordPress: deny access to wp-content, wp-includes PHP files
    location ~* ^/(?:wp-content|wp-includes)/.*.php$ {
        deny all;
    }
    # Deny public access to wp-config.php
    location ~* wp-config.php {
        deny all;
    }
    # Do not log access for static assets, media
    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

Certbot opzestellen fir Zertifikater vu Let's Encrypt an automatesch ze erneieren

certbot ass e gratis Tool vun der Electronic Frontier Foundation (EFF) dat Iech erlaabt TLS Zertifikater vu Let's Encrypt ze kréien an automatesch ze erneieren. De Skript mécht déi folgend fir Certbot ze konfiguréieren fir Zertifikater vu Let's Encrypt an NGINX ze veraarbecht:

  • Stoppen NGINX
  • Downloads recommandéiert TLS Astellungen
  • Leeft Certbot fir Certificaten fir de Site ze kréien
  • Neistart NGINX fir Certificaten ze benotzen
  • Configuréiert Certbot fir all Dag um 3:24 AM ze lafen fir z'iwwerpréiwen ob Zertifikater mussen erneiert ginn, a wann néideg, nei Zertifikater eroflueden an NGINX nei starten.

Skript Code

echo " Stopping NGINX in order to set up 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 " Downloading recommended TLS parameters"
  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 "Couldn't download latest options-ssl-nginx.conf"
fi

if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
  echo " Downloading recommended TLS DH parameters"
  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 "Couldn't download latest ssl-dhparams.pem"
fi

# If tls_certs_init.sh hasn't been run before, remove the self-signed certs
if [ ! -d "/etc/letsencrypt/accounts" ]; then
  echo " Removing self-signed certificates"
  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 " Generating certificates with Let's Encrypt"
  certbot certonly --standalone 
         -m "${WORDPRESS_ADMIN_EMAIL}" 
         ${CERTBOT_STAGING_FLAG} 
         --agree-tos --force-renewal --non-interactive 
         -d "${TLS_HOSTNAME}"
fi

echo " Starting NGINX in order to use new configuration"
service nginx start

# Write crontab for periodic Let's Encrypt cert renewal
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
  echo " Adding certbot to crontab for automatic Let's Encrypt renewal"
  (crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -
fi

Zousätzlech Personnalisatioun vun Ärem Site

Mir hunn uewen geschwat wéi eise Skript NGINX an NGINX Unit konfiguréiert fir e Produktiounsfäerdeg Site mat TLSSSL aktivéiert ze déngen. Dir kënnt och, ofhängeg vun Äre Besoinen, an Zukunft addéieren:

  • ënnerstëtzen Brotli, verbessert On-the-Fly Kompressioun iwwer HTTPS
  • Mod Sécherheet с Regele fir Wordpressfir automatiséiert Attacken op Ärem Site ze verhënneren
  • Backup fir WordPress déi Iech passt
  • Schutz mat der Hëllef vun AppArmor (op Ubuntu)
  • Postfix oder msmtp sou datt WordPress E-Mail schécken kann
  • Iwwerpréift Äre Site fir datt Dir verstitt wéi vill Traffic et kann handhaben

Fir nach besser Site Leeschtung, Mir recommandéieren Upgrade ze NGINX Plus, eise kommerziellen, Enterprise-grade Produkt baséiert op Open Source NGINX. Seng Abonnente kréien en dynamesch gelueden Brotli Modul, souwéi (fir eng zousätzlech Tax) NGINX ModSecurity WAF. Mir bidden och NGINX App Protect, e WAF-Modul fir NGINX Plus baséiert op industrieféierend Sécherheetstechnologie vu F5.

NB Fir Ënnerstëtzung vun engem héich gelueden Site, kënnt Dir d'Spezialisten kontaktéieren Southbridge. Mir garantéieren eng séier an zouverlässeg Operatioun vun Ärer Websäit oder Service ënner all Laascht.

Source: will.com