Automatizáljuk a WordPress telepítését NGINX Unit és Ubuntu segítségével

Automatizáljuk a WordPress telepítését NGINX Unit és Ubuntu segítségével

Rengeteg anyag található a WordPress telepítéséről, a Google keresése a "WordPress install" kulcsszavakkal körülbelül félmillió találatot ad. Ennek ellenére ténylegesen nagyon kevés érdemi útmutató van, amelyek segítségével telepíthetjük és konfigurálhatjuk a WordPress-t, valamint az alatta lévő operációs rendszert, hogy azok hosszú távon fenntarthatóak legyenek. Lehet, hogy a helyes beállítások nagymértékben függenek a konkrét igényektől, vagy ennek az az oka, hogy a részletes magyarázatok megnehezítik az olvasást.

Ebben a cikkben megpróbáljuk összehozni a két megközelítés legjobbjait, biztosítva egy bash scriptet a WordPress automatikus telepítéséhez Ubuntu alatt, és végigmegyünk rajta, magyarázva, hogy mit csinál minden egyes darab, valamint milyen kompromisszumokra jutottunk a fejlesztése során. Ha tapasztalt felhasználó vagy, átugorhatod a cikk szövegét és egyszerűen felveheted a scriptet a testreszabásra és a saját környezetedben való használatra. A script kimeneteként egy testreszabható WordPress telepítést kapunk, amely támogatja a Lets Encrypt-et, és működik az NGINX Unit-on, ipari alkalmazásra alkalmas.

A WordPress NGINX Unit-tal történő telepítésére kifejlesztett architektúra a régebbi cikkbenlett leírva, most pedig kiegészítő beállításokat végzünk, amelyeket ott nem érintettek (és sok más útmutatóban sem):

  • WordPress CLI
  • Let’s Encrypt és TLS/SSL tanúsítványok
  • Tanúsítványok automatikus frissítése
  • NGINX gyorsítótárazás
  • NGINX tömörítés
  • HTTPS és HTTP/2 támogatás
  • A folyamat automatizálása

A cikk egy olyan szerveren történő telepítést ír le, amely egyidejűleg statikus fájlokat, PHP-t és egy adatbázist kezel. Az olyan telepítések, amelyek többszörös virtuális hostokat és szolgáltatásokat is támogatnak - potenciális téma a jövőre nézve. Ha szeretnéd, hogy írjunk valamiről, ami nincs benne ezekben a cikkekben - írj a megjegyzésekbe.

Követelmények

  • Konténer szerver (LXC vagy LXD), virtuális gép vagy hagyományos fizikai szerver, legalább 512 MB RAM-mal és telepített Ubuntu 18.04 vagy újabb verzióval.
  • Nyilvános internetes 80-as és 443-as portok elérhetősége
  • A domain név, amely a szerver nyilvános IP-címéhez kapcsolódik
  • Root jogosultsággal (sudo) való hozzáférés.

Az architektúra áttekintése

Az architektúra ugyanaz, mint amit korábban leírtunk, háromszintű webalkalmazás. PHP szkriptekből áll, amelyeket a PHP feldolgozó hajt végre, és statikus fájlokból, amelyeket a webszerver kezel.

Automatizáljuk a WordPress telepítését NGINX Unit és Ubuntu segítségével

Általános elvek

  • Számos parancs a szkriptekben feltételekbe (if) van csomagolva az idempotencia érdekében: a szkript többször is futtatható anélkül, hogy kockáztatná a már konfigurált beállítások megváltoztatását.
  • A szkript igyekszik szoftvereket telepíteni a tárolókból, így egy parancs segítségével frissítheti a rendszert (apt upgrade az Ubuntu esetében).
  • A parancsok próbálják meghatározni, hogy konténerben futnak-e, hogy ennek megfelelően módosítsák a beállításaikat.
  • A beállítások során mindig az automatizálásra gondoljunk először, amely reményeink szerint az alapja lesz a saját infrastruktúrája kialakításának kód formájában.
  • Minden parancs a
  • root , felhasználó nevében fut, mivel alapvető rendszerbeállításokat módosítanak, de a WordPress közvetlenül egy normál felhasználóként működik.Környezeti változók beállítása

Állítsa be az alábbi környezeti változókat a szkript indítása előtt:

WORDPRESS_DB_PASSWORD

  • — a WordPress adatbázis jelszava WORDPRESS_ADMIN_USER
  • — a WordPress adminisztrátor neve WORDPRESS_ADMIN_PASSWORD
  • — a WordPress adminisztrátor jelszava WORDPRESS_ADMIN_EMAIL
  • — a WordPress adminisztrátor e-mail címe WORDPRESS_URL
  • — a WordPress webhely teljes URL-je, kezdve a https:// LETS_ENCRYPT_STAGING.
  • — alapértelmezetten üres, de ha értéket ad meg, 1-re állítva, a Let’s Encrypt staging szervereit fogja használni, amelyek szükségesek a tanúsítványok gyakori kérelmezéséhez a beállítások tesztelése közben, különben a Let’s Encrypt ideiglenesen blokkolhatja az IP-címét a sok kérelem miatt. A szkript ellenőrzi, hogy ezek a WordPress-hez kapcsolódó változók be vannak állítva, és leáll, ha nem.

A szkript 572-576 sorai ellenőrzik az értéket
Környezeti változók származtatásának beállítása — alapértelmezetten üres, de ha értéket ad meg, 1-re állítva, a Let’s Encrypt staging szervereit fogja használni, amelyek szükségesek a tanúsítványok gyakori kérelmezéséhez a beállítások tesztelése közben, különben a Let’s Encrypt ideiglenesen blokkolhatja az IP-címét a sok kérelem miatt..

A szkript 55-61 sorai az alábbi környezeti változókat állítják be, vagy egy fix értékre, vagy a korábbi szakaszban beállított változókból származtatott értékekkel:

DEBIAN_FRONTEND="noninteractive"

  • DEBIAN_FRONTEND="noninteractive" — tájékoztatja az alkalmazásokat, hogy ők szkriptben futnak és nincs lehetőségük a felhasználóval való interakcióra.
  • WORDPRESS_CLI_VERSION="2.4.0" — a WordPress CLI alkalmazás verziója.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" — a WordPress CLI 2.4.0 futtatható fájl ellenőrző összege (a verzió a "WORDPRESS_CLI_VERSION" változóban található), WORDPRESS_CLI_VERSION). A szkript 162. sorában használja ezt az értéket annak ellenőrzésére, hogy a WordPress CLI megfelelő fájl került letöltésre.
  • UPLOAD_MAX_FILESIZE="16M" — a maximális fájlméret, amely feltölthető a WordPressbe. Ezt a beállítást több helyen használják, ezért egyszerűbb egy helyen megadni.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'\/ ' -f3)" — a rendszer hostname-ja, amely a WORDPRESS_URL változóból vonható le. Ez a Let’s Encrypt-től származó megfelelő TLS/SSL tanúsítványok megszerzésére, valamint a WordPress belső ellenőrzésére szolgál.
  • NGINX_CONF_DIR="\/etc\/nginx" — az NGINX beállítások könyvtárának elérési útja, beleértve a fő fájlt, nginx.conf.
  • CERT_DIR="\/etc\/letsencrypt\/live\/${TLS_HOSTNAME}" — a Let’s Encrypt tanúsítványok elérési útja a WordPress webhelyhez, a "TLS_HOSTNAME" változóból származik. TLS_HOSTNAME.

A WordPress szerver hostname-jának beállítása.

A szkript beállítja a szerver hostname-ját, hogy az érték megfeleljen a webhely domain nevének. Ez nem kötelező, de kényelmesebb az SMTP-n keresztül kiinduló levelek küldésére, amikor egyetlen szervert állítanak be, ahogyan azt a szkript is beállítja.

a szkript kódja

# 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 hozzáadása a \/etc\/hosts fájlhoz.

Kiegészítés WP‑Cron a rendszeres feladatok futtatására szolgál, megköveteli, hogy a WordPress HTTP-n keresztül hozzáférjen önmagához. Annak biztosítása érdekében, hogy a WP-Cron minden környezetben megfelelően működjön, a szkript egy sort ad hozzá a fájlhoz, /etc/hosts, így a WordPress hozzáférhet önmagához a loopback interfészen keresztül:

a szkript kódja

# 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

A következő lépésekhez szükséges eszközök telepítése.

A szkript többi része néhány programot igényel és azt feltételezi, hogy a tárolók aktuálisak. Frissítjük a tárolók listáját, majd telepítjük a szükséges eszközöket:

a szkript kódja

# 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 Unit és NGINX tárolók hozzáadása.

A szkript az NGINX hivatalos tárolóiból telepíti az NGINX Unit-ot és az NGINX-et, hogy biztosítsa, hogy a legfrissebb biztonsági frissítésekkel és hibajavításokkal rendelkező verziókat használják.

A szkript hozzáadja az NGINX Unit tárolót, majd a NGINX tárolót, hozzáadva a tárolók kulcsát és a beállító fájlokat. apt, amelyek az interneten keresztül biztosítják a tárolóhoz való hozzáférést.

A NGINX Unit és NGINX valódi telepítése a következő szakaszban történik. Először hozzáadjuk a tárolókat, hogy ne frissítsük a metadatokat többször, ami gyorsabbá teszi a telepítést.

a szkript kódja

# 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

NGINX, NGINX Unit, PHP MariaDB, Certbot (Let’s Encrypt) és ezek függőségeinek telepítése

Miután minden tároló hozzá lett adva, frissítjük a metadatokat és telepítjük az alkalmazásokat. A szkripttel telepített csomagok között szerepelnek a PHP kiterjesztések is, amelyek ajánlottak a WordPress.org telepítéséhez.

a szkript kódja

echo " A tárolók metaadatai frissítése"
apt-get -qq update

# Telepítsd a PHP-t a függőségekkel és az NGINX Unit-tal
echo " PHP, NGINX Unit, NGINX, Certbot és MariaDB telepítése"
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

A PHP beállítása az NGINX Unit és a WordPress használatához

A szkript létrehozza a beállítási fájlt a könyvtárban conf.d. Itt a PHP által feltölthető fájlok maximális méretét állítjuk be, engedélyezzük a PHP hibák STDERR-be való kiírását, így azok rögzítésre kerülnek az NGINX Unit naplóban, és újraindítjuk az NGINX Unit-ot.

a szkript kódja

# 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

A MariaDB adatbázis beállítása a WordPress számára

A MariaDB-t választottuk a MySQL helyett, mivel ennek nagyobb közösségi aktivitása van, ráadásul valószínűleg jobb teljesítményt nyújt alapértelmezés szerint (valószínűleg itt minden egyszerűbb: ha MySQL-t szeretnénk telepíteni, még egy tárolót kell hozzáadnunk, ford. megj.

A szkript létrehoz egy új adatbázist és generálja a WordPress hozzáférési adatait a loopback interfészen keresztül:

a szkript kódja

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

A WordPress CLI telepítése

Ez a lépés a szkript telepíti a WP-CLI. Ezzel telepíthetjük és kezelhetjük a WordPress beállításait, anélkül hogy manuálisan kellene módosítanunk a fájlokat, frissítenünk a databázist vagy belépnünk a vezérlőpultba. Ezen kívül telepíthetjük a témákat és bővítményeket, és végrehajthatjuk a WordPress frissítéseit is.

a szkript kódja

if [ ! -f /usr/local/bin/wp ]; then
  # Telepítsd a WordPress CLI-t
  echo " A WordPress CLI eszköz telepítése"
  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

A WordPress telepítése és beállítása

A szkript a legújabb WordPress verziót telepíti a könyvtárba /var/www/wordpress, és megváltoztatja a beállításokat:

  • Az adatbázishoz való csatlakozás unix domain socket-en keresztül történik a loopback-en, hogy csökkentse a TCP forgalmat.
  • A WordPress prefixet ad hozzá LETS_ENCRYPT_STAGING A URL, if clients connect to NGINX over HTTPS protocol and also sends the remote hostname (as provided by NGINX) to PHP. We apply a piece of code to set this up.
  • WordPress requires HTTPS for login
  • The default URL structure is based on resources
  • The correct permissions are set on the file system for the WordPress directory.

a szkript kódja

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 Unit Configuration

The script configures NGINX Unit to run PHP and manage WordPress paths, isolating the PHP process namespace and optimizing performance settings. There are three functions worth noting here:

  • Namespace support is determined by a condition based on checking if the script is running in a container. This is necessary since most container settings do not support nested container launches.
  • If namespace support is enabled, the namespace is disabled network. This is needed to allow WordPress to connect to both endpoints simultaneously and be accessible on the internet.
  • A maximális folyamatok számát a következő módon határozzák meg: (A futó MariaDB és NGINX Uniy számára elérhető memória) / (PHP maximális memóriahatára + 5)
    Ez az érték az NGINX Unit beállításainál van megadva.

Ez az érték azt is jelenti, hogy mindig legalább két futó PHP folyamat van, ami fontos, mivel a WordPress sok aszinkron kérést indít el önmaga felé, és ha nem áll rendelkezésre további folyamat, például a WP-Cron futása megszakadhat. Érdemes lehet ezeket a korlátokat növelni vagy csökkenteni a helyi beállítások alapján, mivel az itt megadott beállítások konzervatívak. A legtöbb éles rendszer esetében a beállítások 10 és 100 között mozognak.

a szkript kódja

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 " A PHP folyamatok maximális számát ${MAX_PHP_PROCESSES} értékre számítottuk. Érdemes lehet ezt az értéket finomhangolni a konfigurációnak megfelelően. Nem szokatlan, ha a termelési konfigurációk között értékek 10-100 között mozognak."

echo " NGINX Unit konfigurálása PHP és WordPress használatához"
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 beállítása

NGINX alapvető paraméterek beállítása

A skript létrehozza a NGINX gyorsítótárhoz szükséges könyvtárat, majd létrehozza az alapvető konfigurációs fájlt nginx.confKérjük, vegye figyelembe a folyamatok számát és a maximális feltöltési fájlméret beállítását. Továbbá van egy sor, amely a tömörítési beállító fájlt kapcsolja be, amelyet a következő szakaszban határozunk meg, majd jönnek a gyorsítótárazási beállítások.

a szkript kódja

# 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 tömörítési beállítás

A tartalom valós idejű tömörítése a klienseknek való elküldés előtt nagyszerű módja a weboldal teljesítményének javítására, de csak akkor, ha a tömörítés megfelelően van beállítva. Ez a szkript szakasz a beállításokon alapul. innen.

a szkript kódja

cat > ${NGINX_CONF_DIR}/gzip_compression.conf << 'EOM'
# Hitel: https://github.com/h5bp/server-configs-nginx/
# ----------------------------------------------------------------------
# | Tömörítés                                                        |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Engedélyezze a gzip tömörítést.
# Alapértelmezett: ki
gzip on;
# Tömörítési szint (1-9).
# Az 5 a méret és a CPU-használat tökéletes kompromisszuma, a legtöbb ASCII fájl esetén körülbelül 75%-os csökkentést kínál (majdnem azonos a 9-es szinttel).
# Alapértelmezett: 1
gzip_comp_level 6;
# Ne tömörítsen semmit, ami már kicsi, és valószínűleg nem fog sokat zsugorodni,
# (az alapértelmezett 20 bájt, ami rossz, mivel ez általában nagyobb fájlokhoz vezet a gzip használatával).
# Alapértelmezett: 20
gzip_min_length 256;
# Tömörítse az adatokat akkor is, ha a kliensek proxikon keresztül csatlakoznak hozzánk,
# az "Via" fejléc alapján azonosítva (CloudFront számára szükséges).
# Alapértelmezett: ki
gzip_proxied any;
# Mondja el a proxiknak, hogy tárolják mind a gzippelt, mind a normál verzióját az erőforrásnak,
# valahányszor a kliens Accept-Encoding képességi fejléc változik;
# Megakadályozza azt a problémát, amikor egy nem gzip képes kliens (ami ma rendkívül ritka)
# zavaros szöveget jelenít meg, ha a proxija a gzippelt verziót adta nekik.
# Alapértelmezett: ki
gzip_vary on;
# Tömörítse az összes kimenetet, amelyet az alábbi MIME-típusok egyike jelöl.
# A `text/html` mindig a gzip modul által van tömörítve.
# Alapértelmezett: 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 beállítása WordPresshez

A szkript most létrehoz egy beállító fájlt a WordPress számára default.conf a könyvtárban conf.d. Itt a következőket állítjuk be:

  • A TLS tanúsítványok aktiválása, amelyeket a Let’s Encrypt biztosít a Certbottal (a beállítása a következő szakaszban lesz)
  • A TLS biztonsági beállításainak konfigurálása, amely a Let’s Encrypt ajánlásain alapul
  • Alapértelmezetten a kihagyott kérések gyorsítótárazása 1 órára
  • A hozzáférési naplózás, valamint a hibák naplózásának letiltása, ha a fájl nem található, a két leggyakrabban kért fájlra: favicon.ico és robots.txt
  • A hozzáférés megakadályozása rejtett fájlokhoz és néhány fájlhoz .php, hogy megakadályozza a jogosulatlan hozzáférést vagy a véletlen indítást
  • A statikus fájlok és betűtípusok hozzáférési naplózásának letiltása
  • Fejléc beállítása Access-Control-Allow-Origin betűtípusokhoz
  • Útvonal leképezése az index.php és egyéb statikus fájlokhoz.

a szkript kódja

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, amelyet a Certbot használ a Let's Encrypt-hez
    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 konfiguráció
    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;
    }

    # Minden kísérlet letiltása rejtett fájlok, például .htaccess, .htpasswd,
    # .DS_Store (Mac)
    # Naplózza a kéréseket későbbi feldolgozásra (vagy ha tűzfal utility-knek
    # mint a fail2ban)
    location ~ \/. {
        deny all;
    }
    # Minden olyan fájl letiltása, amelynek kiterjesztése .php az uploads könyvtárban;
    # működik almappa telepítésekben és többhelyi hálózatban is.
    # Naplózza a kéréseket későbbi feldolgozásra (vagy ha tűzfal utility-nek
    # mint a fail2ban).
    location ~* \/(?:uploads|files)\/.php$ {
        deny all;
    }
    # WordPress: a wp-content, wp-includes PHP fájlokhoz való hozzáférés letiltása
    location ~* ^\/(?:(?:wp-content|wp-includes)\/.php)$ {
        deny all;
    }
    # Nyilvános hozzáférés letiltása a wp-config.php fájlhoz
    location ~* wp-config.php {
        deny all;
    }
    # A statikus eszközök, média hozzáférésének naplózásának letiltása
    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

A Certbot beállítása a Let’s Encrypt tanúsítványokhoz és azok automatikus megújítása

Certbot – egy ingyenes eszköz az Electronic Frontier Foundation (EFF) részéről, amellyel TLS tanúsítványokat szerezhetünk és automatikusan megújíthatunk a Let’s Encrypttől. A skript a következő lépéseket hajtja végre, amelyek beállítják a Certbotot, hogy kezelje a Let’s Encrypt tanúsítványait az NGINX-ben:

  • Leállítja az NGINX-et
  • Letölti az ajánlott TLS paramétereket
  • Elindítja a Certbotot, hogy tanúsítványokat szerezzen a webhelyhez
  • Újraindítja az NGINX-et a tanúsítványok használatára
  • Beállítja a Certbot napi futtatását hajnali 3:24-kor a tanúsítványok megújításának ellenőrzésére, valamint szükség esetén új tanúsítványok letöltésére és az NGINX újraindítására.

a szkript kódja

echo " Az NGINX leállítása a Let's Encrypt beállítása érdekében"
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 " Az ajánlott TLS paraméterek letöltése"
  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 "Nem sikerült letölteni a legfrissebb options-ssl-nginx.conf fájlt"
fi

if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
  echo " Az ajánlott TLS DH paraméterek letöltése"
  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 "Nem sikerült letölteni a legfrissebb ssl-dhparams.pem fájlt"
fi

# Ha a tls_certs_init.sh még nem futott, távolítsa el az önaláírt tanúsítványokat
if [ ! -d "/etc/letsencrypt/accounts" ]; then
  echo " Az önaláírt tanúsítványok eltávolítása"
  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 " Tanúsítványok generálása a Let's Encrypt segítségével"
  certbot certonly --standalone 
         -m "${WORDPRESS_ADMIN_EMAIL}" 
         ${CERTBOT_STAGING_FLAG} 
         --agree-tos --force-renewal --non-interactive 
         -d "${TLS_HOSTNAME}"
fi

echo " Az NGINX indítása az új konfiguráció használatához"
service nginx start

# Crontab írása a Let's Encrypt tanúsítványok időszakos megújítása érdekében
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
  echo " Certbot hozzáadása a crontabhoz az automatikus Let's Encrypt megújításhoz"
  (crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -
fi

További beállítások az Ön webhelyéhez

Fentiekben beszéltünk arról, hogyan állítja be a szkriptünk az NGINX-t és az NGINX Unitot, hogy működőképes TLS/SSL-el rendelkező webhelyet szolgáljon ki. Ezen kívül, az Ön igényeitől függően, a jövőben hozzáadhatja:

  • Támogatás Brotli, amely javított tömörítést biztosít HTTPS-en keresztül
  • ModSecurity a szabályokkal a WordPresshez, hogy megakadályozza a webhelyével szembeni automatizált támadásokat
  • Biztonsági mentés WordPresshez, ami Önnek megfelelő
  • Védelem segítségével AppArmor (Ubuntuon)
  • Postfix vagy msmtp, hogy a WordPress képes legyen e-mailt küldeni
  • A webhely ellenőrzései, hogy megértsd, mennyi forgalmat képes elviselni

A weboldalad még jobb teljesítménye érdekében javasoljuk, hogy frissíts NGINX Plus, a kereskedelmi szintű, NGINX nyílt forráskódú alapú termékünk. Előfizetőink dinamikusan betölthető Brotli modult kapnak, valamint (további díj ellenében) NGINX ModSecurity WAF. Ezenkívül kínálunk NGINX App Protect, WAF modul az NGINX Plus számára, iparágvezető biztonsági technológiával az F5-től.

Figyelem. A nagy terhelésű webhely támogatásáért keresd a szakértőinket Southbridge. Gyors és megbízható működést biztosítunk a webhelyednek vagy szolgáltatásodnak bármilyen terhelés alatt.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster