We automatiseren de installatie van WordPress met NGINX Unit en Ubuntu

We automatiseren de installatie van WordPress met NGINX Unit en Ubuntu

Er zijn veel materialen beschikbaar voor het installeren van WordPress; een zoekopdracht in Google met de zoekwoorden "WordPress install" levert ongeveer een half miljoen resultaten op. Desondanks zijn er slechts weinig goede handleidingen te vinden die uitleggen hoe je WordPress en het bijbehorende besturingssysteem kunt installeren en configureren, zodat ze langdurig kunnen worden ondersteund. Het is mogelijk dat de juiste instellingen sterk afhangen van specifieke behoeften, of dat het komt omdat een gedetailleerde uitleg het artikel moeilijk leesbaar maakt.

In dit artikel proberen we het beste van twee benaderingen te combineren, door een bash-script te bieden voor de automatische installatie van WordPress op Ubuntu, en we zullen het script doornemen om uit te leggen wat elk stukje doet, evenals welke compromissen we hebben gesloten bij de ontwikkeling. Als je een ervaren gebruiker bent, kun je de tekst van het artikel overslaan en gewoon het script gebruiken voor aanpassing en gebruik in jouw omgevingen. Het uitvoerresultaat van het script is een configureerbare installatie van WordPress met ondersteuning voor Lets Encrypt, die draait op NGINX Unit en geschikt is voor industriële toepassing.

De ontwikkelde architectuur voor het uitrollen van WordPress met NGINX Unit is beschreven in een oudere artikel, nu zullen we ook extra instellingen doornemen die daar niet zijn behandeld (zoals in veel andere handleidingen):

  • WordPress CLI
  • Let’s Encrypt en TLS-certificaten
  • Automatische certificaatvernieuwing
  • NGINX-caching
  • NGINX-compressie
  • Ondersteuning voor HTTPS en HTTP/2
  • Automatisering van het proces

In het artikel wordt de installatie op één server beschreven, waarop tegelijkertijd een statische verwerkingsserver, een PHP-verwerkingsserver en een database worden gehost. Een installatie met ondersteuning voor meerdere virtuele hosts en services is een potentieel onderwerp voor de toekomst. Laat het ons weten in de reacties als je wilt dat we over iets schrijven dat nog niet in deze artikelen staat.

Vereisten

  • Server-container (LXC of LXD), virtuele machine, of een gewone fysieke server, met minimaal 512MB RAM en met Ubuntu 18.04 of nieuwer geïnstalleerd.
  • Toegankelijke poorten 80 en 443 van het internet
  • Een domeinnaam die is gekoppeld aan het openbare IP-adres van deze server
  • Toegang met root-rechten (sudo).

Architectuuroverzicht

De architectuur is hetzelfde als beschreven eerder, een drievoudige webtoepassing. Deze bestaat uit PHP-scripts die worden uitgevoerd door de PHP-handler en statische bestanden die worden behandeld door de webserver.

We automatiseren de installatie van WordPress met NGINX Unit en Ubuntu

Algemene principes

  • Veel configuratiecommando's in het script zijn omgeven door voorwaarden (if) voor idempotentie: het script kan meerdere keren worden uitgevoerd zonder het risico dat instellingen die al gereed zijn, worden gewijzigd.
  • Het script probeert software uit repositories te installeren, zodat je systeemupdates in één commando kunt toepassen (apt upgrade voor Ubuntu).
  • De commando's proberen te detecteren of ze in een container worden uitgevoerd om hun instellingen dienovereenkomstig aan te passen.
  • Om het aantal uit te voeren processen/threads in de instellingen op te geven, probeert het script automatische configureerparameters te raden voor gebruik in containers, virtuele machines en 'dedicated' servers.
  • Bij het beschrijven van de instellingen denken we altijd eerst aan automatisering, die hopelijk de basis zal vormen voor het creëren van jouw eigen infrastructuur als code.
  • Alle commando's worden uitgevoerd als gebruiker root, omdat ze de belangrijkste systeeminstellingen wijzigen, maar WordPress zelf draait onder een standaard gebruiker.

Instelling van omgevingsvariabelen

Stel de volgende omgevingsvariabelen in voordat je het script uitvoert:

  • WORDPRESS_DB_PASSWORD — het wachtwoord voor de WordPress-database
  • WORDPRESS_ADMIN_USER — de naam van de WordPress-beheerder
  • WORDPRESS_ADMIN_PASSWORD — het wachtwoord van de WordPress-beheerder
  • WORDPRESS_ADMIN_EMAIL — de e-mail van de WordPress-beheerder
  • WORDPRESS_URL — de volledige URL van de WordPress-site, beginnend met https://.
  • LETS_ENCRYPT_STAGING — standaard leeg, maar door het op 1 te zetten, gebruik je de staging-servers van Let’s Encrypt, die nodig zijn voor het frequent aanvragen van certificaten tijdens het testproces van jouw instellingen, anders kan Let’s Encrypt tijdelijk je IP-adres blokkeren vanwege een groot aantal verzoeken.

Het script controleert of deze aan WordPress gerelateerde variabelen zijn ingesteld en beëindigt de uitvoering als dat niet het geval is.
De regels van het script 572-576 controleren de waarde LETS_ENCRYPT_STAGING.

Instelling van afgeleide omgevingsvariabelen

Het script op regels 55-61 stelt de volgende omgevingsvariabelen in, hetzij op een enkele vaste waarde, hetzij door toepassing van waarde verkregen vanuit de variabelen die in de vorige sectie zijn ingesteld:

  • DEBIAN_FRONTEND="noninteractive" — laat applicaties weten dat ze worden uitgevoerd in een script en dat interactie met de gebruiker niet mogelijk is.
  • WORDPRESS_CLI_VERSION="2.4.0" — versie van de WordPress CLI-applicatie.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" — controlegetal van het uitvoerbare bestand WordPress CLI 2.4.0 (de versie wordt vermeld in de variabele WORDPRESS_CLI_VERSION). Het script op regel 162 gebruikt deze waarde om te controleren of het correcte WordPress CLI-bestand is gedownload.
  • UPLOAD_MAX_FILESIZE="16M" — de maximale bestandsgrootte die kan worden geüpload in WordPress. Deze instelling wordt op verschillende plaatsen gebruikt, dus het is makkelijker om deze op één plek in te stellen.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'\/ ' -f3)" — hostname van het systeem, geëxtraheerd uit de variabele WORDPRESS_URL. Dit wordt gebruikt om de bijbehorende TLS/SSL-certificaten van Let’s Encrypt te verkrijgen, evenals voor interne verificatie van WordPress.
  • NGINX_CONF_DIR="\/etc\/nginx" — pad naar de map met NGINX-instelling, inclusief het hoofd bestand nginx.conf.
  • CERT_DIR="\/etc\/letsencrypt\/live\/${TLS_HOSTNAME}" — pad naar de Let’s Encrypt-certificaten voor de WordPress-site, verkregen uit de variabele TLS_HOSTNAME.

Toewijzing van hostname aan de WordPress-server

Het script stelt de hostname van de server in zodat de waarde overeenkomt met de domeinnaam van de site. Dit is niet verplicht, maar het vergemakkelijkt het verzenden van uitgaande e-mails via SMTP wanneer een enkele server wordt ingesteld, zoals in het script wordt ingesteld.

scriptcode

# 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

Hostname toevoegen aan \/etc\/hosts

Aanvulling WP‑Cron wordt gebruikt om periodieke taken uit te voeren, vereist dat WordPress toegang heeft tot zichzelf via HTTP. Om ervoor te zorgen dat WP-Cron correct werkt in alle omgevingen, voegt het script een regel toe aan het bestand /etc/hosts, zodat WordPress toegang tot zichzelf kan krijgen via de loopback-interface:

scriptcode

# 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

Installen van de vereiste tools voor de volgende stappen

De rest van het script heeft enkele programma's nodig en gaat ervan uit dat de repositories up-to-date zijn. We werken de lijst met repositories bij, waarna we de benodigde tools installeren:

scriptcode

# 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

Toevoegen van de NGINX Unit en NGINX repositories

Het script installeert NGINX Unit en NGINX met open source uit de officiële NGINX-repositories om ervoor te zorgen dat de versies met de laatste beveiligingsupdates en bugfixes worden gebruikt.

Het script voegt de NGINX Unit-repository toe en vervolgens de NGINX-repository, en voegt de repository-sleutels en configuratiebestanden toe apt, die toegang tot de repositories via internet instellen.

De daadwerkelijke installatie van NGINX Unit en NGINX vindt plaats in het volgende gedeelte. We voegen vooraf repositories toe om te voorkomen dat we de metadata meerdere keren bijwerken, wat de installatie versnelt.

scriptcode

# 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

Installatie van NGINX, NGINX Unit, PHP MariaDB, Certbot (Let’s Encrypt) en hun afhankelijkheden

Zodra alle repositories zijn toegevoegd, vernieuwen we de metadata en installeren we de applicaties. De pakketten die door het script worden geïnstalleerd, bevatten ook de aanbevolen PHP-extensies voor WordPress.org.

scriptcode

echo " Bijwerken van repository metadata"
apt-get -qq update

# Installeer PHP met afhankelijkheden en NGINX Unit
echo " Installeren van PHP, NGINX Unit, NGINX, Certbot en 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

Configuratie van PHP voor gebruik met NGINX Unit en WordPress

Het script maakt een configuratiebestand aan in de map conf.d. Hier worden de maximale uploadgrootte voor bestanden in PHP ingesteld, wordt foutuitvoer van PHP in STDERR ingeschakeld, zodat deze in het NGINX Unit-logboek worden geregistreerd, en wordt NGINX Unit opnieuw gestart.

scriptcode

# 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

Database-instellingen voor MariaDB voor WordPress instellen

We hebben voor MariaDB gekozen in plaats van MySQL, omdat het een actiever gemeenschap heeft, bovendien kan het mogelijk betere prestaties standaard bieden (waarschijnlijk is het hier eenvoudiger: om MySQL te installeren, moet een extra repository worden toegevoegd, opmerking van de vertaler).

Het script maakt een nieuwe database aan en creëert inloggegevens voor toegang tot WordPress via de loopback-interface:

scriptcode

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

Installatie van het WordPress CLI-programma

In deze stap installeert het script het programma WP-CLI. Hiermee kun je WordPress-instellingen installeren en beheren zonder handmatig bestanden te bewerken, de database bij te werken of in het controlepaneel in te loggen. Ook kun je ermee thema's en plugins installeren en WordPress-updates uitvoeren.

scriptcode

if [ ! -f /usr/local/bin/wp ]; then
  # Installeer de WordPress CLI
  echo " De WordPress CLI-tool installeren"
  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

Installatie en configuratie van WordPress

Het script installeert de laatste versie van WordPress in de map /var/www/wordpress, en wijzigt ook de instellingen:

  • De verbinding met de database verloopt via een unix domain socket in plaats van TCP op loopback, om TCP-verkeer te verminderen.
  • WordPress voegt een prefix toe https:// Bij URL's, wanneer klanten verbinding maken met NGINX via het HTTPS-protocol, wordt ook de externe hostname (zoals NGINX deze verstrekt) naar PHP gestuurd. We passen een stukje code toe om dit in te stellen.
  • WordPress heeft HTTPS nodig voor inloggen.
  • De URL-structuur is standaard gebaseerd op bronnen.
  • De juiste rechten worden ingesteld op het bestandssysteem voor de WordPress-directory.

scriptcode

if [ ! -d /var/www/wordpress ]; then
  # Maak WordPress-directory's aan
  mkdir -p /var/www/wordpress
  chown -R www-data:www-data /var/www

  # Download WordPress met behulp van de WordPress CLI
  echo " WordPress aan het installeren"
  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}""

  # Dit fragment wordt ingevoegd in het wp-config.php-bestand wanneer het wordt aangemaakt;
  # het informeert WordPress dat we achter een reverse proxy zitten en zo
  # kan het links genereren met HTTPS
  cat > /tmp/wp_forwarded_for.php << 'EOM'
/* Zet HTTPS 'aan' als HTTP_X_FORWARDED_PROTO overeenkomt met '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

  # Maak de WordPress-configuratie aan
  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

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

  # Stel de permalinkstructuur in op een redelijke standaard die niet in de UI staat
  su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data

  # Verwijder het voorbeeldbestand omdat dit rommel is en een beveiligingsprobleem kan zijn
  rm /var/www/wordpress/wp-config-sample.php

  # Zorg ervoor dat de WordPress-rechten correct zijn
  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

Configuratie van NGINX Unit

Het script configureert NGINX Unit om PHP uit te voeren en WordPress-paden te verwerken, waarbij de naamruimtes van de PHP-processen worden geïsoleerd en de prestatie-instellingen worden geoptimaliseerd. Er zijn drie functies waar je op moet letten:

  • Ondersteuning voor naamruimtes wordt bepaald door een voorwaarde, gebaseerd op het controleren of het script binnen een container draait. Dit is nodig omdat de meeste containerinstellingen geneste containeruitvoering niet ondersteunen.
  • Als er ondersteuning is voor naamruimtes, wordt de naamruimte uitgeschakeld. netwerk. Dit is nodig om WordPress in staat te stellen tegelijkertijd verbinding te maken met endpoints en toegankelijk te zijn op het internet.
  • Het maximale aantal processen wordt als volgt bepaald: (Beschikbare geheugen voor draaiende MariaDB en NGINX Uniy) / (limiet voor RAM in PHP + 5)
    Deze waarde wordt ingesteld in de instellingen van NGINX Unit.

Deze waarde impliceert ook dat er altijd minimaal twee draaiende PHP-processen zijn, wat belangrijk is, omdat WordPress veel asynchrone verzoeken naar zichzelf doet. Zonder extra processen zal bijvoorbeeld WP-Cron falen. U wilt deze limieten mogelijk verhogen of verlagen op basis van uw lokale instellingen, aangezien de hier gemaakte instellingen conservatief zijn. Op de meeste productiesystemen liggen de instellingen tussen 10 en 100.

scriptcode

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 " Het maximale aantal PHP-processen is berekend als ${MAX_PHP_PROCESSES}. U wilt deze waarde mogelijk aanpassen vanwege variaties in uw configuratie. Het is niet ongewoon om waarden tussen 10-100 te zien in productieconfiguraties."

echo " NGINX Unit configureren om PHP en WordPress te gebruiken"
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

Configuratie van NGINX

Instelling van de basisparameters van NGINX

Het script maakt een map voor de NGINX-cache en vervolgens het hoofdconfiguratiebestand. nginx.conf. Let op het aantal verwerkingsprocessen en stel de maximale bestandsgrootte voor uploads in. Er is ook een regel waarop het bestand met compressie-instellingen wordt verbonden, dat in het volgende gedeelte wordt gedefinieerd, gevolgd door cache-instellingen.

scriptcode

# 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

Configuratie van NGINX-compressie

Inhoud on-demand comprimeren voordat deze naar klanten wordt verzonden, is een uitstekende manier om de prestaties van de website te verbeteren, maar alleen als de compressie correct is ingesteld. Deze sectie van het script is gebaseerd op de instellingen hier.

scriptcode

cat > ${NGINX_CONF_DIR}\/gzip_compression.conf << 'EOM'
# Credit: https://github.com/h5bp/server-configs-nginx/
# ----------------------------------------------------------------------
# | Compressie                                                          |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Schakel gzip-compressie in.
# Standaard: uit
gzip on;
# Compressieniveau (1-9).
# 5 is een perfecte compromis tussen grootte en CPU-gebruik, met ongeveer 75%
# vermindering voor de meeste ASCII-bestanden (bijna identiek aan niveau 9).
# Standaard: 1
gzip_comp_level 6;
# Comprimeer niets dat al klein is en waarschijnlijk niet veel verder zal krimpen als al
# (de standaard is 20 bytes, wat slecht is, omdat dit meestal leads tot grotere
# bestanden na gzipping).
# Standaard: 20
gzip_min_length 256;
# Comprimeer gegevens zelfs voor cliënten die via proxy met ons verbinden,
# geïdentificeerd door de "Via"-header (vereist voor CloudFront).
# Standaard: uit
gzip_proxied any;
# Vertel proxies om zowel de gezipte als de reguliere versie van een bron te cachen
# telkens als de Accept-Encoding-capaciteitheader van de cliënt varieert;
# Vermijdt het probleem waarbij een niet-gzip-geschikte cliënt (wat extreem zeldzaam is
# vandaag de dag) onzin zou weergeven als hun proxy hen de gezipte versie gaf.
# Standaard: uit
gzip_vary on;
# Comprimeer alle uitvoer gelabeld met een van de volgende MIME-types.
# `text\/html` wordt altijd gecomprimeerd door het gzip-module.
# Standaard: 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

Configuratie van NGINX voor WordPress

Daarna creëert het script een configuratiebestand voor WordPress default.conf in de catalogus conf.d. Hier wordt ingesteld:

  • Activatie van TLS-certificaten verkregen van Let’s Encrypt via Certbot (deze configuratie zal in het volgende gedeelte worden behandeld)
  • Configuratie van TLS-beveiligingsparameters, gebaseerd op aanbevelingen van Let’s Encrypt
  • Activatie van cache voor gemiste aanvragen voor 1 uur standaard
  • Deactivering van toeganglogging en ook foutlogging als het bestand niet is gevonden, voor twee algemene opgevraagde bestanden: favicon.ico en robots.txt
  • Toegang tot verborgen bestanden en bepaalde bestanden verbieden .php, om ongeoorloofde toegang of onbedoelde uitvoering te voorkomen
  • Toegang logging uitschakelen voor statische en lettertypebestanden
  • Header instellen Access-Control-Allow-Origin voor lettertypebestanden
  • Routing toevoegen voor index.php en andere statische bestanden.

scriptcode

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-uitdaging gebruikt door Certbot voor 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 configuratie
    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 stapeling
    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;
    }

    # Weiger alle pogingen om verborgen bestanden zoals .htaccess, .htpasswd,
    # .DS_Store (Mac)
    # Houd logging van verzoeken aan voor latere analyse (of om door te geven aan firewall-tools
    # zoals fail2ban)
    location ~ \/. {
        deny all;
    }
    # Weiger toegang tot bestanden met een .php extensie in de uploads-directory;
    # werkt in subdirectory-installaties en ook in multi-site netwerken.
    # Houd logging van verzoeken aan voor latere analyse (of om door te geven aan firewall-tools
    # zoals fail2ban).
    location ~* \/(?:uploads|files)\/.php$ {
        deny all;
    }
    # WordPress: weiger toegang tot wp-content, wp-includes PHP-bestanden
    location ~* ^\/(?:wp-content|wp-includes)\/.php$ {
        deny all;
    }
    # Weiger openbare toegang tot wp-config.php
    location ~* wp-config.php {
        deny all;
    }
    # Log geen toegang voor statische bronnen, 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

Configuratie van Certbot voor certificaten van Let’s Encrypt en automatische vernieuwing

Certbot — een gratis tool van de Electronic Frontier Foundation (EFF), waarmee TLS-certificaten van Let’s Encrypt kunnen worden verkregen en automatisch bijgewerkt. Het script voert de volgende acties uit om Certbot in te stellen voor het beheren van certificaten van Let’s Encrypt in NGINX:

  • Stop NGINX
  • Download aanbevolen TLS-instellingen
  • Start Certbot om certificaten voor de site te verkrijgen
  • Herstart NGINX om de certificaten te gebruiken
  • Stelt dagelijks Certbot in om om 3:24 's nachts te controleren of certificaten moeten worden vernieuwd, en downloadt indien nodig nieuwe certificaten en herstart NGINX.

scriptcode

echo " NGINX stoppen om Let's Encrypt in te stellen"
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 " Aanbevolen TLS-instellingen downloaden"
  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 "Kon de nieuwste options-ssl-nginx.conf niet downloaden"
fi

if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
  echo " Aanbevolen TLS DH-parameters downloaden"
  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 "Kon de nieuwste ssl-dhparams.pem niet downloaden"
fi

# Als tls_certs_init.sh nog niet eerder is uitgevoerd, verwijder de zelfondertekende certificaten
if [ ! -d "/etc/letsencrypt/accounts" ]; then
  echo " Zelfondertekende certificaten verwijderen"
  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 " Certificaten genereren met Let's Encrypt"
  certbot certonly --standalone 
         -m "${WORDPRESS_ADMIN_EMAIL}" 
         ${CERTBOT_STAGING_FLAG} 
         --agree-tos --force-renewal --non-interactive 
         -d "${TLS_HOSTNAME}"
fi

echo " NGINX starten om de nieuwe configuratie te gebruiken"
service nginx start

# Schrijf crontab voor periodieke verlenging van Let's Encrypt-certificaten
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
  echo " Certbot aan crontab toevoegen voor automatische verlenging van Let's Encrypt"
  (crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -
fi

Aanvullende configuratie van uw website

We hebben hierboven uitgelegd hoe ons script NGINX en NGINX Unit configureert om een productieklare website met ingeschakelde TLS/SSL te bedienen. U kunt in de toekomst, afhankelijk van uw behoeften, ook het volgende toevoegen:

  • Ondersteuning Brotli, verbeterde on-the-fly compressie via HTTPS
  • ModSecurity met regels voor WordPress, om automatische aanvallen op uw site te voorkomen
  • Back-up voor WordPress, die voor u geschikt zijn
  • Beveiliging met behulp van AppArmor (op Ubuntu)
  • Postfix of msmtp, zodat WordPress e-mail kan verzenden
  • Controle van uw website, zodat u begrijpt hoeveel verkeer deze kan verwerken

Voor nog betere prestaties van uw website raden we aan om te upgraden naar NGINX Plus, ons commerciële product van ondernemingsniveau, gebaseerd op open-source NGINX. Abonnees krijgen een dynamisch laadmodule Brotli, evenals (tegen een extra vergoeding) NGINX ModSecurity WAF. We bieden ook NGINX App Protect, een WAF-module voor NGINX Plus, gebaseerd op toonaangevende beveiligingstechnologie van F5.

N.B. Voor ondersteuning van uw hoogbelaste website kunt u contact opnemen met onze specialisten Southbridge. Wij zorgen voor een snelle en betrouwbare werking van uw website of dienst onder elke belasting.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster