A WordPress telepítésének automatizálása NGINX Unit és Ubuntu segítségével

A WordPress telepítésének automatizálása NGINX Unit és Ubuntu segítségével

Sok oktatóanyag található a WordPress telepítésével kapcsolatban, a Google keresése a "WordPress install" kifejezésre körülbelül félmillió találatot eredményez. Valójában azonban nagyon kevés jó útmutató található közöttük, amelyek szerint a WordPress és az alapul szolgáló operációs rendszer úgy telepíthető és konfigurálható, hogy azok hosszú ideig képesek legyenek a támogatásra. Lehet, hogy a helyes beállítások nagymértékben függnek az egyedi igényektől, vagy ennek az az oka, hogy a részletes magyarázat miatt a cikk nehezen olvasható.

Ebben a cikkben megpróbáljuk kombinálni a két világ legjavát egy bash szkript biztosításával, amely automatikusan telepíti a WordPress-t Ubuntun, valamint végigjárjuk azt, elmagyarázva az egyes darabok működését, valamint a fejlesztés során tett kompromisszumokat. . Ha Ön haladó felhasználó, kihagyhatja a cikk szövegét, és csak vedd a forgatókönyvet módosítására és a környezetében való használatra. A szkript kimenete egy egyedi WordPress-telepítés Lets Encrypt támogatással, amely NGINX egységen fut, és alkalmas éles használatra.

A WordPress NGINX egység használatával történő üzembe helyezéséhez kifejlesztett architektúra leírása itt található régebbi cikk, most tovább konfiguráljuk azokat a dolgokat is, amelyekről ott nem volt szó (mint sok más oktatóanyagban):

  • WordPress CLI
  • Titkosítsuk a TLSSSL-tanúsítványokat
  • A tanúsítványok automatikus megújítása
  • NGINX gyorsítótár
  • NGINX tömörítés
  • HTTPS és HTTP/2 támogatás
  • Folyamatautomatizálás

A cikk leírja a telepítést egy kiszolgálóra, amely egyidejűleg egy statikus feldolgozó szervert, egy PHP feldolgozó szervert és egy adatbázist tartalmaz. A több virtuális gazdagépet és szolgáltatást támogató telepítés a jövő potenciális témája. Ha azt szeretné, hogy olyasmiről írjunk, ami nem szerepel ezekben a cikkekben, írja meg a megjegyzésekben.

Követelmények

  • Tárolószerver (évi LXC vagy LXD), egy virtuális gép vagy egy normál vaskiszolgáló legalább 512 MB RAM-mal, és telepítve van az Ubuntu 18.04 vagy újabb verziója.
  • Internet elérhető 80-as és 443-as portok
  • A kiszolgáló nyilvános IP-címéhez társított tartománynév
  • Root hozzáférés (sudo).

Építészeti áttekintés

Az architektúra megegyezik a leírtakkal korábban, egy háromszintű webalkalmazás. A PHP-motoron futó PHP szkriptekből és a webszerver által feldolgozott statikus fájlokból áll.

A WordPress telepítésének automatizálása NGINX Unit és Ubuntu segítségével

Általános elvek

  • A szkriptben lévő számos konfigurációs parancs be van csomagolva, ha az idempotencia feltételei vannak: a szkript többször is futtatható anélkül, hogy fennállna a már meglévő beállítások megváltoztatásának veszélye.
  • A szkript megpróbál szoftvert telepíteni tárolókból, így a rendszerfrissítéseket egyetlen paranccsal alkalmazhatja (apt upgrade Ubuntu számára).
  • A parancsok megpróbálják észlelni, hogy egy tárolóban futnak, így ennek megfelelően módosíthatják beállításaikat.
  • Annak érdekében, hogy a beállításokban beállítsa az induló szálfolyamatok számát, a szkript megpróbálja kitalálni a konténerekben, virtuális gépekben és hardverkiszolgálókban végzett munka automatikus beállításait.
  • A beállítások leírásánál mindenekelőtt az automatizálásra gondolunk, amely reményeink szerint az alapja lesz a saját infrastruktúra kódként történő létrehozásának.
  • Minden parancs felhasználóként fut gyökér, mert megváltoztatják az alapvető rendszerbeállításokat, de közvetlenül a WordPress normál felhasználóként fut.

Környezeti változók beállítása

A szkript futtatása előtt állítsa be a következő környezeti változókat:

  • WORDPRESS_DB_PASSWORD - WordPress adatbázis jelszava
  • WORDPRESS_ADMIN_USER - WordPress rendszergazdai név
  • WORDPRESS_ADMIN_PASSWORD - WordPress rendszergazdai jelszó
  • WORDPRESS_ADMIN_EMAIL - WordPress rendszergazdai e-mail
  • WORDPRESS_URL a WordPress webhely teljes URL-címe, kezdve a https://.
  • LETS_ENCRYPT_STAGING - alapértelmezés szerint üres, de az érték 1-re állításával a Let's Encrypt staging szervereket fogod használni, amelyek a beállítások tesztelésekor szükségesek a gyakori tanúsítványkéréshez, ellenkező esetben a Let's Encrypt ideiglenesen blokkolhatja az ip-címedet a sok kérés miatt .

A szkript ellenőrzi, hogy ezek a WordPress-hez kapcsolódó változók be vannak-e állítva, és kilép, ha nem.
Az 572-576. szkriptsorok ellenőrzik az értéket LETS_ENCRYPT_STAGING.

Származtatott környezeti változók beállítása

Az 55-61. sorok szkriptje a következő környezeti változókat állítja be, akár valamilyen keményen kódolt értékre, akár az előző szakaszban beállított változókból kapott érték felhasználásával:

  • DEBIAN_FRONTEND="noninteractive" - Közli az alkalmazásokkal, hogy szkriptben futnak, és nincs lehetőség a felhasználói 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 változóban van megadva WORDPRESS_CLI_VERSION). A 162. sorban található szkript ezt az értéket használja annak ellenőrzésére, hogy a megfelelő WordPress CLI fájl lett-e letöltve.
  • UPLOAD_MAX_FILESIZE="16M" - a WordPressben feltölthető maximális fájlméret. Ezt a beállítást több helyen használják, így egyszerűbb egy helyen beállítani.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" - a rendszer gazdagépneve, a WORDPRESS_URL változóból leolvasva. A megfelelő TLS/SSL-tanúsítványok beszerzésére szolgál a Let's Encrypt-től, valamint belső WordPress-ellenőrzés.
  • NGINX_CONF_DIR="/etc/nginx" - az NGINX beállításokkal rendelkező könyvtár elérési útja, beleértve a fő fájlt nginx.conf.
  • CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" — a változóból nyert Let's Encrypt tanúsítványok elérési útja a WordPress webhelyhez TLS_HOSTNAME.

Gazdanév hozzárendelése WordPress szerverhez

A szkript úgy állítja be a szerver gazdagépnevét, hogy megegyezzen a webhely tartománynevével. Ez nem kötelező, de kényelmesebb a kimenő levelek küldése SMTP-n keresztül, ha egyetlen szervert állít be, a parancsfájl szerint.

script kódot

# 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

Gazdanév hozzáadása az /etc/hosts fájlhoz

Kiegészítés WP-Cron időszakos feladatok futtatására használják, megköveteli, hogy a WordPress hozzáférjen önmagához HTTP-n keresztül. Annak érdekében, hogy a WP-Cron minden környezetben megfelelően működjön, a szkript hozzáad egy sort a fájlhoz / Etc / hostshogy a WordPress hozzáférjen önmagához a loopback felületen keresztül:

script kódot

# 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 beszerelése

A szkript többi részének szüksége van néhány programra, és feltételezi, hogy a tárolók naprakészek. Frissítjük a tárolók listáját, majd telepítjük a szükséges eszközöket:

script kódot

# 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 egység és NGINX adattárak hozzáadása

A szkript telepíti az NGINX egységet és a nyílt forráskódú NGINX-et a hivatalos NGINX tárolókból, hogy megbizonyosodjon arról, hogy a legújabb biztonsági javításokat és hibajavításokat tartalmazó verziókat használja.

A szkript hozzáadja az NGINX egység tárat, majd az NGINX lerakat, hozzáadva a tárolókulcsot és a konfigurációs fájlokat apt, amely meghatározza a tárolókhoz való hozzáférést az interneten keresztül.

Az NGINX egység és az NGINX tényleges telepítése a következő részben történik. Előre hozzáadjuk a tárolókat, hogy ne kelljen többször frissítenünk a metaadatokat, ami gyorsabbá teszi a telepítést.

script kódot

# 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

Az NGINX, NGINX Unit, PHP MariaDB, Certbot (Titkosítsuk) és függőségeik telepítése

Az összes adattár hozzáadása után frissítse a metaadatokat, és telepítse az alkalmazásokat. A szkript által telepített csomagok a WordPress.org futtatásakor javasolt PHP-bővítményeket is tartalmazzák

script kódot

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

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

A szkript létrehoz egy beállítási fájlt a könyvtárban konf.d. Ez beállítja a PHP-feltöltések maximális méretét, bekapcsolja a PHP hibakimenetét STDERR-re, így azok az NGINX egység naplójába kerülnek, és újraindítja az NGINX egységet.

script kódot

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

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

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

MariaDB adatbázis-beállítások megadása WordPresshez

A MariaDB-t választottuk a MySQL helyett, mivel több közösségi aktivitással rendelkezik, és valószínűleg ez is lesz alapértelmezés szerint jobb teljesítményt biztosít (valószínűleg itt minden egyszerűbb: a MySQL telepítéséhez hozzá kell adni egy másik tárolót, kb. fordító).

A szkript létrehoz egy új adatbázist, és hitelesítő adatokat hoz létre a WordPress eléréséhez a loopback felületen keresztül:

script kódot

# 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 program telepítése

Ebben a lépésben a szkript telepíti a programot WP-CLI. Ezzel telepítheti és kezelheti a WordPress beállításait anélkül, hogy manuálisan szerkesztené a fájlokat, frissítené az adatbázist, vagy be kellene lépnie a vezérlőpultra. Témák és kiegészítők telepítésére, valamint a WordPress frissítésére is használható.

script kódot

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

A WordPress telepítése és konfigurálása

A szkript a WordPress legújabb verzióját telepíti egy könyvtárba /var/www/wordpressés módosítja a beállításokat is:

  • Az adatbázis-kapcsolat Unix tartományi socket-en keresztül működik TCP helyett visszahurkolt állapotban, hogy csökkentse a TCP-forgalmat.
  • A WordPress előtagot ad hozzá https:// az URL-re, ha az ügyfelek HTTPS-en keresztül csatlakoznak az NGINX-hez, és elküldi a távoli gazdagép nevét (az NGINX által biztosított) PHP-nek. Ennek beállításához egy kódrészletet használunk.
  • A WordPressnek HTTPS-re van szüksége a bejelentkezéshez
  • Az alapértelmezett URL-struktúra erőforrásokon alapul
  • Beállítja a megfelelő engedélyeket a WordPress könyvtár fájlrendszerében.

script kódot

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

Az NGINX egység beállítása

A szkript úgy konfigurálja az NGINX egységet, hogy futtassa a PHP-t és feldolgozza a WordPress útvonalait, elkülönítve a PHP folyamat névterét és optimalizálja a teljesítménybeállításokat. Itt három funkcióra kell figyelni:

  • A névterek támogatását feltétel határozza meg, annak ellenőrzése alapján, hogy a szkript fut-e egy tárolóban. Erre azért van szükség, mert a legtöbb tárolóbeállítás nem támogatja a tárolók beágyazott indítását.
  • Ha a névterek támogatottak, tiltsa le a névteret hálózat. Ez lehetővé teszi a WordPress számára, hogy mindkét végponthoz csatlakozzon, és egyszerre legyen elérhető az interneten.
  • A folyamatok maximális számát a következőképpen határozzuk meg: (Elérhető memória a MariaDB és az NGINX Uniy futtatásához)/(RAM-korlát PHP + 5-ben)
    Ez az érték az NGINX egység beállításaiban állítható be.

Ez az érték azt is jelenti, hogy mindig legalább két PHP-folyamat fut, ami azért fontos, mert a WordPress sok aszinkron kérést küld magának, és további folyamatok nélkül a futás pl. a WP-Cron megszakad. Érdemes lehet növelni vagy csökkenteni ezeket a korlátokat a helyi beállítások alapján, mert az itt létrehozott beállítások konzervatívak. A legtöbb éles rendszeren a beállítások 10 és 100 között vannak.

script kódot

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

Az NGINX beállítása

Alapvető NGINX beállítások konfigurálása

A szkript létrehoz egy könyvtárat az NGINX gyorsítótár számára, majd létrehozza a fő konfigurációs fájlt nginx.conf. Ügyeljen a kezelői folyamatok számára és a feltöltés maximális fájlméretének beállítására. Van egy sor is, amely tartalmazza a következő részben meghatározott tömörítési beállításokat, majd a gyorsítótárazási beállításokat.

script kódot

# 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és beállítása

A tartalom menet közbeni tömörítése az ügyfeleknek való elküldés előtt nagyszerű módja a webhely teljesítményének javításának, de csak akkor, ha a tömörítés megfelelően van beállítva. A szkript ezen része a beállításokon alapul ezért.

script kódot

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

Az NGINX beállítása WordPresshez

Ezután a szkript létrehoz egy konfigurációs fájlt a WordPress számára default.conf a katalógusban konf.d. Itt van beállítva:

  • A Let's Encrypttől Certboton keresztül kapott TLS-tanúsítványok aktiválása (beállítása a következő részben lesz)
  • TLS biztonsági beállítások konfigurálása a Let's Encrypt ajánlásai alapján
  • Alapértelmezés szerint engedélyezze a kérések gyorsítótárazását 1 órára
  • Tiltsa le a hozzáférési naplózást, valamint a hibanaplózást, ha a fájl nem található, két gyakran kért fájlnál: favicon.ico és robots.txt
  • A rejtett fájlokhoz és egyes fájlokhoz való hozzáférés megakadályozása . Phpaz illegális hozzáférés vagy a nem szándékos indítás megakadályozása érdekében
  • A statikus és betűtípusfájlok hozzáférési naplózásának letiltása
  • Fejléc beállítása Access-Control-Allow-Origin betűtípusfájlokhoz
  • Útválasztás hozzáadása az index.php-hez és egyéb statikához.

script kódot

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

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

certbot az Electronic Frontier Foundation (EFF) ingyenes eszköze, amely lehetővé teszi a Let's Encrypt TLS-tanúsítványok beszerzését és automatikus megújítását. A szkript a következőket teszi a Certbot konfigurálásához a Let's Encrypt tanúsítványok NGINX-ben történő feldolgozására:

  • Leállítja az NGINX-et
  • Letölti az ajánlott TLS-beállításokat
  • A Certbotot futtatja a webhely tanúsítványainak beszerzéséhez
  • A tanúsítványok használatához újraindítja az NGINX-et
  • Úgy konfigurálja a Certbotot, hogy naponta 3:24-kor fusson, hogy ellenőrizze, nem kell-e megújítani a tanúsítványokat, és ha szükséges, töltse le az új tanúsítványokat, és indítsa újra az NGINX-et.

script kódot

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

A webhely további testreszabása

Fentebb már beszéltünk arról, hogy a szkriptünk hogyan konfigurálja az NGINX-et és az NGINX-egységet úgy, hogy a TLSSSL-t engedélyező termelésre kész webhelyet szolgáltasson. Igényeitől függően a jövőben a következőket is hozzáadhatja:

  • Támogatás brotli, továbbfejlesztett on-the-fly tömörítés HTTPS-en keresztül
  • ModSecurity с Wordpress szabályaihogy megakadályozza az Ön webhelyét ért automatizált támadásokat
  • biztonsági mentés az Önnek megfelelő WordPress számára
  • Védelem keresztül AppArmor (Ubuntun)
  • Postfix vagy msmtp, hogy a WordPress leveleket küldhessen
  • Ellenőrizze webhelyét, hogy megértse, mekkora forgalmat képes kezelni

A webhely még jobb teljesítménye érdekében javasoljuk, hogy frissítsen a következőre NGINX Plus, nyílt forráskódú NGINX alapú kereskedelmi, vállalati szintű termékünk. Előfizetői dinamikusan feltöltött Brotli modult kapnak, valamint (felár ellenében) NGINX ModSecurity WAF. mi is kínálunk NGINX App Protect, egy WAF-modul az NGINX Plus-hoz, amely az F5 iparágvezető biztonsági technológiáján alapul.

NB A nagy terhelésű webhely támogatásához forduljon szakértőhöz Southbridge. Biztosítjuk weboldala vagy szolgáltatása gyors és megbízható működését bármilyen terhelés mellett.

Forrás: will.com