Mir automatiséieren d'Installatioun WordPress mat NGINX Eenheet an Ubuntu

Mir automatiséieren d'Installatioun WordPress mat NGINX Eenheet an Ubuntu

Et gĂ«tt vill Installatiounsmaterialien. WordPress, Google Sich no SchlĂ«sselwierder "WordPress "install" gĂ«tt ongefĂ©ier eng hallef Millioun Resultater. Ënnert hinnen ginn et awer tatsĂ€chlech ganz wĂ©ineg nĂ«tzlech Guiden fir d'Installatioun an d'Konfiguratioun. WordPress an dat zugronnleeĂ«nd Betribssystem, fir datt se iwwer eng laang ZĂ€it Ă«nnerstĂ«tzt kĂ«nne ginn. VlĂ€icht hĂ€nken dĂ©i richteg Astellungen staark vun de spezifesche Bedierfnesser of, oder vlĂ€icht lĂ€it dat dorun, datt dĂ©i detaillĂ©iert ErklĂ€rung den Artikel schwĂ©ier ze liesen mĂ©cht.

An dĂ«sem Artikel wĂ€erte mir probĂ©ieren dat Bescht aus bĂ©iden Approchen ze kombinĂ©ieren andeems mir e Bash-Skript fir automatesch Installatioun ubidden. WordPress op UbuntuMir wĂ€erten et och duerchgoen, erklĂ€ren, wat all StĂ©ck mĂ©cht a wĂ©i eng KompromĂ«sser mir bei senger EntwĂ©cklung gemaach hunn. Wann Dir en erfuerene Benotzer sidd, kĂ«nnt Dir den Text iwwersprangen an einfach ... de Skript huelen fir Modifikatioun an Notzung an Ären Ëmfeld. D'Skriptausgab ass eng personalisĂ©iert Installatioun. WordPress mat Let's Encrypt ËnnerstĂ«tzung, leeft op NGINX Unit a gĂ«eegent fir Produktiounsgebrauch.

Entwéckelt Architektur fir den Asaz WordPress D'Benotzung vun der NGINX Eenheet gëtt beschriwwen 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 Hardwareserver mat mindestens 512 MB RAM an installĂ©iert Ubuntu 18.04 oder mĂ©i spĂ©it.
  • 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.

Mir automatiséieren d'Installatioun WordPress 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'Haaptsystemastellungen Ă€nneren, awer direkt WordPress funktionĂ©iert vun engem normale Benotzer.

Ëmfeld VerĂ€nnerlechen Astellung

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

  • WORDPRESS_DB_PASSWORD — Passwuert fir d'Datebank WordPress
  • WORDPRESS_ADMIN_USER — den Numm vum Administrateur WordPress
  • WORDPRESS_ADMIN_PASSWORD — Administrateurpasswuert WordPress
  • WORDPRESS_ADMIN_EMAIL — E-Mail vum Administrateur WordPress
  • WORDPRESS_URL — komplett WebsĂ€it-URL WordPress, ugefaange mat 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 ob dës verbonne sinn WordPress Variabelen sinn gesat, a gëtt ausgeschloss, 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" — Applikatiounsversioun WordPress CLI.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" — Kontrollsum vun der ausfĂŒhrbarer Datei WordPress CLI 2.4.0 (d'Versioun ass an der Variabel spezifizĂ©iert) WORDPRESS_CLI_VERSIONDe Skript an der Zeil 162 benotzt dĂ«se WĂ€ert fir ze kontrollĂ©ieren, ob dĂ©i richteg Datei erofgeluede gouf. WordPress CLI.
  • UPLOAD_MAX_FILESIZE="16M" — dĂ©i maximal DateigrĂ©isst, dĂ©i eropgeluede ka ginn WordPressDĂ«s Astellung gĂ«tt op verschiddene Plazen benotzt, dofir ass et mĂ©i einfach, se op enger Plaz anzestellen.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" — den Hostnumm vum System, ofgeruff vun der Variabel WORDPRESS_URL. GĂ«tt benotzt fir dĂ©i entspriechend TLS/SSL-Zertifikater vu Let's Encrypt ze krĂ©ien, souwĂ©i fir intern VerifizĂ©ierung. WordPress.
  • 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}" — Wee zu de Let's Encrypt Zertifikater fir d'WebsĂ€it WordPress, kritt aus enger Variabel TLS_HOSTNAME.

Hostnumm-Zouweisung 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 auszefĂ©ieren, erfuerdert datt WordPress konnt sech iwwer HTTP zougrĂ€ifen. Fir sĂ©cherzestellen, datt WP-Cron an allen Ëmfeld richteg funktionĂ©iert, fĂŒĂŒgt de Skript eng Zeil an d'Datei bĂ€i. / etc / hun, esou WordPress kann iwwer d'Loopback-Interface op sech 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

Soubal all d'Repositories derbÀigesat sinn, aktualiséiere mir d'Metadaten an installéieren d'Applikatiounen. D'Packagen, déi vum Skript installéiert ginn, enthalen och PHP-Extensiounen, déi beim Start recommandéiert ginn. WordPress.org

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 fir d'Benotzung mat NGINX Unit konfiguréieren an WordPress

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

D'Astellungen vun der MariaDB-Datebank opsetzen WordPress

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 Zougangsdaten. 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;"

Programm Installatioun WordPress CLI

Op dësem Schrëtt installéiert de Skript de Programm WP-CLIMat senger Hëllef kënnt Dir Astellungen konfiguréieren a verwalten WordPress ouni datt Dir Dateien manuell Ànnere musst, d'Datebank aktualiséiere musst oder Iech am Kontrollpanel aloggen musst. Et kann och benotzt ginn fir Themen an Add-ons z'installéieren an Updates duerchzeféieren. WordPress.

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

Installatioun a Konfiguratioun WordPress

De Skript installéiert déi lescht Versioun WordPress ze katalogiséieren /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 derbĂ€i 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 HTTPS ass nĂ©ideg fir sech unzemellen
  • D'Standard URL Struktur basĂ©iert op Ressourcen
  • DĂ©i richteg Dateisystemrechter sinn fir den Dossier agestallt. WordPress.

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}" --data-gt-translate-attributes='["title"]' 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 Unit fir PHP auszeféieren a Weeër ze behandelen. WordPress, den PHP-Prozess-Namespace ze isoléieren an d'Performance-Astellungen ze optimiséieren. Et ginn drÀi Funktiounen, déi et wÀert sinn ze bemierken:

  • Ë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 NetzDĂ«st ass nĂ©ideg fir ze ermĂ©iglechen WordPress glĂ€ichzĂ€iteg mat Endpunkten verbannen a um Internet zougĂ€nglech 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 mindestens zwee PHP-Prozesser lafen, wat wichteg ass, well WordPress mĂ©cht vill asynchron Ufroen u sech selwer, an ouni zousĂ€tzlech Prozesser wĂ€ert d'AusfĂ©ierung vu zum Beispill WP-Cron klappen. Dir kĂ«nnt dĂ«s Limitte jee no Äre lokalen Astellungen erhĂ©ijen oder reduzĂ©ieren, well d'Astellungen, dĂ©i hei erstallt ginn, konservativ sinn. Op de meeschte Produktiounssystemer leien 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 opsetzen fir WordPress

Duerno 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 с Reegele fir WordPressfir automatisĂ©iert Attacken op Ärem Site ze verhĂ«nneren
  • Backup fir WordPress, gĂ«eegent fir Iech
  • Schutz mat der HĂ«llef vun AppArmor (um Ubuntu)
  • Postfix oder msmtp un WordPress kĂ©int e Mail schĂ©cken
  • 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

Kaaft zouverlĂ€sseg Hosting fir Site mat DDoS Schutz, VPS VDS Server đŸ”„ Kaaft zouverlĂ©issegt WebsĂ€ithosting mat DDoS-Schutz, VPS VDS Server | ProHoster