Automatiseerime WordPressi installatsiooni NGINX Uniti ja Ubuntu abil.

Automatiseerime WordPressi installatsiooni NGINX Uniti ja Ubuntu abil.

WordPressi installimise kohta on palju materjale, Google'i otsing vĂ”tmesĂ”nadega "WordPress install" annab umbes pool miljonit tulemust. Siiski on nende seas vĂ€ga vĂ€he korralikke juhendeid, mis aitaksid WordPressi ja alussĂŒsteemi installida ja seadistada nii, et need saaksid pikaajalist toetust. Õiged seadistused vĂ”ivad olenevalt konkreetsetest vajadustest oluliselt erineda, vĂ”i vĂ”ib-olla on see tingitud sellest, et detailsed selgitused muudavad artikli raskesti loetavaks.

Selles artiklis pĂŒĂŒame ĂŒhendada kaks lĂ€henemist, pakkudes bash skripti WordPressi automaatseks installimiseks Ubuntu sĂŒsteemile ning selgitades seejuures, mida iga skriptiosa teeb ja millistele kompromissidele me tema vĂ€ljatöötamisel lĂ€ksime. Kui olete kogenud kasutaja, vĂ”ite artikli teksti vahele jĂ€tta ja lihtsalt vĂ”tta skripti muudatuste tegemiseks ja kasutamiseks oma keskkondades. Skripti tulemuseks on kohandatav WordPressi installatsioon Lets Encrypti toega, mis töötab NGINX Unit'il ja on tööstuslikuks kasutamiseks sobiv.

WordPressi juurutamiseks mĂ”eldud arhitektuur NGINX Unity abil on kirjeldatud vanemas artiklis, nĂŒĂŒd seadistame tĂ€iendavalt ka asju, mida seal ei kĂ€sitletud (nagu paljudes teistes giidides):

  • WordPress CLI
  • Let’s Encrypt ja TLS/SSL sertifikaatid
  • Sertifikaatide automaatne uuendamine
  • NGINX vahemĂ€lu
  • NGINX tihendamine
  • HTTPS ja HTTP/2 tugi
  • Protsessi automatiseerimine

Artiklis kĂ€sitletakse paigaldust ĂŒhel serveril, kus samal ajal on olemas staatilise sisu server, PHP töötlemise server ja andmebaas. Mitme virtuaalse hosti ja teenuse toetava installatsiooni teema on tuleviku vĂ”imalus. Kui soovite, et kirjutaksime millestki, mida nende artiklite seas ei ole, andke meile kommentaarides teada.

NÔuded

  • Konteineriserver (LXC vĂ”i LXD), virtuaalmasin vĂ”i tavaline fĂŒĂŒsiline server, millel on vĂ€hemalt 512 MB RAM-i ja installitud Ubuntu 18.04 vĂ”i uuem versioon.
  • Interneti kaudu kergesti ligipÀÀsetavad portid 80 ja 443
  • Domeen, mis on seotud selle serveri avaliku IP-aadressiga
  • Root (sudo) Ă”igustega ligipÀÀs.

Arhitektuuri ĂŒlevaade

Arhitektuur on sama, nagu oli kirjeldatud oleme teada saanud, kolme tasemi veebirakendus. See koosneb PHP skriptidest, mis kÀivitatakse PHP töötlejas, ja staatilistest failidest, mida töötleb veebiserver.

Automatiseerime WordPressi installatsiooni NGINX Uniti ja Ubuntu abil.

Üldised printsiibid

  • Paljud skripti seaded on mĂ€hitud tingimustesse (if), et tagada idempotentsus: skripti saab mitu korda kĂ€ivitada ilma riskita muuta juba valmis seadistusi.
  • Skript pĂŒĂŒab installida tarkvara hoidlatest, et saaksite rakendada sĂŒsteemi uuendusi ĂŒhe kĂ€suga (apt upgrade Ubuntu jaoks).
  • KĂ€sud pĂŒĂŒavad kindlaks teha, et nad kĂ€ivitatakse konteineris, et muuta oma seadistusi vastavalt.
  • KĂ€ivitamisprotsesside (töötajate) arvu seadmiseks proovib skript Ă€ra arvata automaatseid seadistusparameetreid, et töötada konteinerites, virtuaalmasinates ja fĂŒĂŒsilistes serverites.
  • Seadiste kirjeldamisel mĂ”tleme alati kĂ”igepealt automatiseerimisele, mis, nagu me loodame, saab aluseks teie enda infrastruktuuri loomisele koodina.
  • KĂ”ik kĂ€sud kĂ€ivituvad kasutaja poolt root, sest need muudavad pĂ”hitoimingute seadistusi, kuid WordPress töötab tavalise kasutaja alt.

Keskkonna muutujate seadistamine

Seadke jÀrgmised keskkonnamuutujad enne skripti kÀivitamist:

  • WORDPRESS_DB_PASSWORD — WordPressi andmebaasi parool
  • WORDPRESS_ADMIN_USER — WordPressi administraatori nimi
  • WORDPRESS_ADMIN_PASSWORD — WordPressi administraatori parool
  • WORDPRESS_ADMIN_EMAIL — WordPressi administraatori meiliaadress
  • WORDPRESS_URL — WordPressi saidi tĂ€ielik URL, alustades https://.
  • LETS_ENCRYPT_STAGING — vaikimisi tĂŒhi, kuid kui seadistate vÀÀrtuse 1, kasutate Let’s Encrypti stseeniserverit, mis on vajalik sertifikaatide sagedase nĂ”udmise testimiseks, vastasel juhul vĂ”ib Let’s Encrypt ajutiselt blokeerida teie IP-aadressi suure arvu pĂ€ringute tĂ”ttu.

Skript kontrollib, et need WordPressiga seotud muutujad on seadistatud, ja lÔpetab töö, kui ei ole.
Skripti read 572-576 kontrollivad vÀÀrtust LETS_ENCRYPT_STAGING.

TĂŒvi muude keskkonnamuutujate seadistamine

Skript ridadel 55-61 seadistab jÀrgmised keskkonnamuutujad, kas mingi kindla vÀÀrtusega vÔi kasutades eelmisest osast saadud muutujate vÀÀrtusi:

  • DEBIAN_FRONTEND="noninteractive" — teatab rakendustele, et neid kĂ€ivitatakse skriptis ja kasutajaga suhtlemise vĂ”imalust ei ole.
  • WORDPRESS_CLI_VERSION="2.4.0" — WordPress CLI rakenduse versioon.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" — WordPress CLI 2.4.0 kĂ€ivitatava faili kontrollsumma (versioon on mÀÀratud muutuja WORDPRESS_CLI_VERSION). Skriptis, mida on 162. real, kasutatakse seda vÀÀrtust, et kontrollida, kas WordPress CLI Ă”ige fail on alla laaditud.
  • UPLOAD_MAX_FILESIZE="16M" — maksimaalne failisuurus, mida saab WordPressi ĂŒles laadida. Seda seadet kasutatakse mitmes kohas, seega on lihtsam see ĂŒhes kohas mÀÀrata.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" — sĂŒsteemi hostname, mis on saadud muutuja WORDPRESS_URL pĂ”hjal. Seda kasutatakse sobivate TLS/SSL sertifikaatide saamiseks Let’s Encryptilt ning ka WordPressi sisemiste kontrollide jaoks.
  • NGINX_CONF_DIR="/etc/nginx" — tee NGINX seadete katalooge, sealhulgas pĂ”hifail. nginx.conf.
  • CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" — tee Let’s Encrypt sertifikaatide jaoks WordPressi saidile, saadud muutuja TLS_HOSTNAME.

WordPressi serverile hostname mÀÀramine.

Skript mÀÀrab serveri hostname, et vÀÀrtus vastaks saidi domeeninimele. See ei ole kohustuslik, kuid see muudab vĂ€ljamineva e-postiga SMTP kaudu saatmise lihtsamaks, kui seadistus on tehtud ĂŒhele serverile, nagu skriptis seadistatakse.

skripti kood

# 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'i lisamine failile \/etc\/hosts

TĂ€iendamine WP‑Cron kasutatakse perioodiliste ĂŒlesannete kĂ€ivitamiseks, nĂ”uab, et WordPress saaks iseendaga HTTP kaudu ĂŒhendust vĂ”tta. WP-Croni Ă”igeks toimimiseks kĂ”ikides keskkondades lisab skript faili rea /etc/hosts, et WordPress saaks iseendaga loopback-liidese kaudu ĂŒhendust vĂ”tta:

skripti kood

# 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

NÔutavate tööriistade installeerimine jÀrgmisteks sammudeks

Skripti jÀrgmine osa vajab mitmeid programme ja eeldab, et hoidlad on ajakohased. Uuendame hoidlate loendit, seejÀrel installime vajalikud tööriistad:

skripti kood

# 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 Uniti ja NGINX'i hoidlate lisamine

Skript installib NGINX Uniti ja avatud lÀhtekoodiga NGINX'i ametlikest NGINX'i hoidlatest, et tagada, et kasutatakse uusimate turvauuenduste ja vea parandustega versioone.

Skript lisab NGINX Uniti hoidla, seejĂ€rel — NGINX'i hoidla, lisades hoidlate vĂ”tme ja seadefailid apt, mis mÀÀratlevad juurdepÀÀsu hoidlatele internetis.

NGINX Unit ja NGINX tegelik installatsioon toimub jÀrgmises jaotises. Eelnevalt lisame hoidlad, et vÀltida metateabe mitu korda uuendamist, mis muudab installatsiooni kiiremaks.

skripti kood

# 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

NGINXi, NGINX Uniti, PHP MariaDB, Certboti (Let’s Encrypt) ja nende sĂ”ltuvuste installimine

Kui kÔik hoidlad on lisatud, vÀrskendame metateavet ja installime rakendused. Skripti poolt installitavad paketid hÔlmavad ka PHP laiendusi, mis on soovitatavad WordPress.org kÀivitamisel.

skripti kood

echo " VÀÀrskendame hoidlate metateavet"
apt-get -qq update

# Installi PHP koos sÔltuvustega ja NGINX Unit
echo " Installin PHP, NGINX Uniti, NGINXi, Certboti ja 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 seadistamine NGINX Uniti ja WordPressi kasutamiseks

Skript loob seadistusfaili kaustas conf.d. Siin mÀÀratakse PHP jaoks ĂŒleslaadimise maksimaalne failisuurus, lubatakse PHP veateated STDERR-is, nii et need registreeritakse NGINX Uniti logisse, samuti taaskĂ€ivitatakse NGINX Unit.

skripti kood

# 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 andmebaasi seadistamine WordPressi jaoks

Oleme valinud MariaDB MySQLi asemel, kuna sellel on aktiivsem kogukond ja see on vĂ”ib-olla... pakub parem jĂ”udlust vaikimisi (ilmselt on siin kĂ”ik lihtsam: MySQL-i installimiseks tuleb lisada veel ĂŒks hoidla, tĂ”lkija mĂ€rk.).

Skript loob uue andmebaasi ja loob WordPressi ligipÀÀsu andmed lÀbi loopbacki liidese:

skripti kood

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

WordPress CLI programmi installimine

Sellel sammul skript installib programmi WP-CLI. Selle abil saab installida ja hallata WordPressi seadistusi ilma faili kÀsitsi parandamiseta, andmebaasi vÀrskendamiseta vÔi juhtpaneeli sisenemiseta. Samuti saab selle abil installida teemasid ja lisandeid ning teostada WordPressi vÀrskendusi.

skripti kood

if [ ! -f /usr/local/bin/wp ]; then
  # Installige WordPress CLI
  echo " WordPress CLI tööriista installimine"
  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

WordPressi installimine ja seadistamine

Skript installib kÔige uuema WordPressi versiooni katalooge /var/www/wordpress, samuti muudab seadeid:

  • Andmebaasi ĂŒhendus töötab lĂ€bi unix domain socket'i, mitte TCP loopback'i kaudu, et vĂ€hendada TCP liiklust.
  • WordPress lisab eesliite https:// URL-ile, kui kliendid ĂŒhenduvad NGINX-iga HTTPS-protokolli kaudu, ja saadab ka kaug-hostinime (nagu NGINX seda pakub) PHP-sse. Me rakendame vĂ€ikest koodilĂ”iku, et see seadistada.
  • WordPress vajab sisselogimiseks HTTPS-i
  • URL-i struktuur pĂ”hineb vaikimisi ressurssidel
  • WordPressi katalooge koheldakse Ă”igesti failisĂŒsteemis.

skripti kood

kui [ ! -d /var/www/wordpress ]; siis
  # Loo WordPressi kataloogid
  mkdir -p /var/www/wordpress
  chown -R www-data:www-data /var/www

  # Laadi WordPress alla WordPress CLI abil
  echo "Installin WordPressi"
  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}'"

  # See koodijupp sisestatakse wp-config.php faili selle loomise ajal;
  # see teavitab WordPressi, et oleme tagasipöörduva proxi taga ja seega
  # vÔimaldab tal genereerida linke HTTPS-i abil
  cat > /tmp/wp_forwarded_for.php << 'EOM'
/* LĂŒlita HTTPS 'sisse', kui HTTP_X_FORWARDED_PROTO vastab 'https'-le */
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

  # Loo WordPressi konfiguratsioon
  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

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

  # Muuda permalinkide struktuur mÔistlikuks vaikevÀÀrtuseks, mis ei ole kasutajas
  su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data

  # Eemalda nÀidisdokument, kuna see on rÀmps ja vÔib olla turbeprobleem
  rm /var/www/wordpress/wp-config-sample.php

  # Veendu, et WordPressi Ôigused oleksid Ôiged
  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 seadistamine

Skripti eesmÀrk on seadistada NGINX Unit PHP kÀitamiseks ja WordPressi teede töötlemiseks, isolides PHP protsesside nimespaciaid ja optimeerides jÔudlust. On kolm funktsiooni, millele tasub tÀhelepanu pöörata:

  • Nimespaci toetust mÀÀratletakse tingimuse alusel, mis pĂ”hineb skripti kĂ€itamise kontrollimisel konteineris. See on vajalik, kuna enamik konteineriseadeid ei toeta sisemist konteinerite kĂ€ivitamist.
  • Kui nimespaci tugi on olemas, lĂŒlitatakse nimespaci vĂ€lja network. See on vajalik, et vĂ”imaldada WordPressil samal ajal ĂŒhenduda lĂ”pp-punktide ja olla internetis kĂ€ttesaadav.
  • Protsesside maksimaalne arv mÀÀratakse jĂ€rgmiselt: (Vaba mĂ€lu kĂ€ivitatud MariaDB ja NGINX Unit jaoks) / (PHP mĂ€lu piir + 5)
    See vÀÀrtus seatakse NGINX Unit seadetes.

See vÀÀrtus tĂ€hendab ka, et alati on kĂ€imas vĂ€hemalt kaks PHP-protsessi, mis on oluline, kuna WordPress teeb palju asĂŒnkroonseid pĂ€ringuid iseendale, ja ilma tĂ€iendavate protsessideta, nĂ€iteks WP-Cron, ei tööta korralikult. VĂ”ite soovida neid limiteerimisi suurendada vĂ”i vĂ€hendada, tuginedes oma lokaalsetele seadistustele, kuna siin mÀÀratud seadistused on konservatiivsed. Enamiku tootmissĂŒsteemide puhul on seadistused vahemikus 10 kuni 100.

skripti kood

kui [ "${container:-unknown}" != "lxc" ] && [ "$(grep -m1 -a container=lxc /proc/1/environ | tr -d ' ')" == "" ]; siis
  NAMESPACES='"namespaces": {
        "cgroup": true,
        "credential": true,
        "mount": true,
        "network": false,
        "pid": true,
        "uname": true
    }'
eelse
  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 " Maksimaalne PHP protsesside arv on ${MAX_PHP_PROCESSES}. Soovitame seda vÀÀrtust vastavalt teie seadistustele kohandada. Tootmiskeskkondades on tavaliselt vÀÀrtuste vahemik 10–100."

echo " Konfigureerin NGINX Unit'i PHP ja WordPress'i kasutamiseks"
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 seadistamine

NGINX pÔhinÀitaja seadistamine

Skript loob NGINX-i vahemĂ€lu jaoks kausta ja seejĂ€rel lihtsalt pĂ”hikonfiguratsioonifaili nginx.conf. Pange tĂ€hele töötlemisprotsesside arvu ja maksimaalse faili suuruse seadistamist. Samuti on olemas rida, mis ĂŒhendab jĂ€rgmises jaotises mÀÀratletud tihendamise seadistuse faili, millele jĂ€rgneb vahemĂ€lu seadistus.

skripti kood

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

Sisu tihendamine reaalajas enne selle edastamist klientidele on suurepÀrane viis saidi jÔudluse parandamiseks, kuid ainult siis, kui tihendamine on Ôigesti seadistatud. See skripti jaotis pÔhineb seadistustel siit.

skripti kood

cat > ${NGINX_CONF_DIR}/gzip_compression.conf << 'EOM'
# Autor: https://github.com/h5bp/server-configs-nginx/
# ----------------------------------------------------------------------
# | Kompressioon                                                        |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# LĂŒlita sisse gzip kompressioon.
# Vaikimisi: vÀlja
gzip on;
# Kompressiooni tase (1-9).
# 5 on suurepÀrane kompromiss suuruse ja CPU kasutuse vahel, pakkudes umbes 75%
# vÀhendust enamikule ASCII failidele (peaaegu identne tasemega 9).
# Vaikimisi: 1
gzip_comp_level 6;
# Ära kompressi midagi, mis on juba vĂ€ike ja tĂ”enĂ€oliselt ei kahane palju,
# kui ĂŒldse (vaikimisi on 20 baiti, mis on halb, kuna see viib tavaliselt suuremate
# failideni pÀrast gzippingut).
# Vaikimisi: 20
gzip_min_length 256;
# Kompressi andmeid isegi klientide jaoks, kes ĂŒhenduvad meiega kaudu vahendite,
# mida tuvastatakse "Via" pÀise kaudu (kui CloudFront on vajalik).
# Vaikimisi: vÀlja
gzip_proxied any;
# Ütle vahenditele, et salvestada nii gzipped kui tavaline versioon resursist
# iga kord, kui kliendi Accept-Encodingi vÔimaluste pÀis varieerub;
# VÀltida, et mitte-gzipi vÔimekusega klient (mida on tÀnapÀeval ÀÀrmiselt harva)
# kuvaks segadust, kui nende vahend vÀljastab neile gzipped versiooni.
# Vaikimisi: vÀlja
gzip_vary on;
# Kompressi kĂ”ik vĂ€ljundid, millel on ĂŒks jĂ€rgmistest MIME-tĂŒĂŒpidest.
# `text/html` on alati gzip mooduli poolt kompressitud.
# Vaikimisi: 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 seadistamine WordPressile

JĂ€rgmisena loob skript konfiguratsioonifaili WordPressi jaoks default.conf kaustas conf.d. Siin seadistatakse:

  • TLS sertifikaatide aktiveerimine, mis on saadud Let’s Encrypt'ilt lĂ€bi Certboti (selle seadistus kĂ€sitletakse jĂ€rgmisena)
  • TLS turvaparametrite seadistamine, mis pĂ”hineb Let’s Encrypt'i soovitustel
  • Vaikimisi vahemĂ€lu seadmine ĂŒlekantud pĂ€ringutele ĂŒheks tunniks
  • LigipÀÀsu logimise keelamine, samuti logimise keelamine, kui fail ei ole leitud, kahe ĂŒldiselt kĂŒsitud faili puhul: favicon.ico ja robots.txt
  • LigipÀÀsu keeld peidetud failidele ja mĂ”nedele failidele .php, et vĂ€ltida ebaseaduslikku juurdepÀÀsu vĂ”i tahtmatut kĂ€ivitamist
  • Statistika ja fontide failide ligipÀÀsu logimise keelamine
  • Pealkirja seadmine Access-Control-Allow-Origin fontide failide jaoks
  • Index.php ja muu staatika marsruutimise lisamine.

skripti kood

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-kutse, mida kasutab Certbot 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 konfiguratsioon
    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;
    }

    # Keela kÔik katsed pÀÀseda peidetud failide juurde nagu .htaccess, .htpasswd,
    # .DS_Store (Mac)
    # JÀtka logide pidamist pÀringute hiljem töötlemiseks (vÔi firewalli utiliitidele
    # nagu fail2ban)
    location ~ /\. {
        deny all;
    }
    # Keela juurdepÀÀs kĂ”igile failidele, millel on .php laiend ĂŒleslaadimise kataloogis;
    # töötab alamkaustade installides ja ka mitme saidi vÔrgu korral.
    # JÀtka logide pidamist pÀringute hiljem töötlemiseks (vÔi firewalli utiliitidele
    # nagu fail2ban).
    location ~* /(?:uploads|files)/.*\.php$ {
        deny all;
    }
    # WordPress: keela juurdepÀÀs wp-content, wp-includes PHP failidele
    location ~* ^/(?:wp-content|wp-includes)/.*\.php$ {
        deny all;
    }
    # Keela avalik juurdepÀÀs wp-config.php
    location ~* wp-config.php {
        deny all;
    }
    # Ära logi juurdepÀÀsu staatilistele varadele, meedia
    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

Certboti seadistamine Let’s Encrypti sertifikaatide jaoks ja nende automaatne pikendamine

Certbot — tasuta tööriist Electronic Frontier Foundationilt (EFF), mis vĂ”imaldab saada ja automaatselt uuendada Let’s Encrypti TLS-sertifikaate. Skript tĂ€idab jĂ€rgmised toimingud, mis seavad Certboti ette Let’s Encrypti sertifikaatide kĂ€itlemiseks NGINX-is:

  • Peatab NGINX-i
  • Laeb alla soovitatud TLS-i seaded
  • KĂ€ivitab Certboti, et saada veebisaidi jaoks sertifikaate
  • TaaskĂ€ivitab NGINX-i, et kasutada sertifikaate
  • Seab igapĂ€evaselt kĂ€ivituma Certboti kell 3:24 öösel, et kontrollida sertifikaatide vĂ€rskendamise vajadust ning vajadusel uute sertifikaatide allalaadimist ja NGINX-i taaskĂ€ivitamist.

skripti kood

echo "Peatun NGINX, et seadistada 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 "Laadimine soovitatavad TLS parameetrid"
  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 "Ei suutnud alla laadida uusimat options-ssl-nginx.conf"
fi

if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
  echo "Laadimine soovitatavad TLS DH parameetrid"
  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 "Ei suutnud alla laadida uusimat ssl-dhparams.pem"
fi

# Kui tls_certs_init.sh pole varem kÀivitatud, eemalda iseeneslikud sertifikaadid
if [ ! -d "/etc/letsencrypt/accounts" ]; then
  echo "Eemaldamine iseeneslikud sertifikaadid"
  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 "Sertifikaatide genereerimine Let's Encryptiga"
  certbot certonly --standalone 
         -m "${WORDPRESS_ADMIN_EMAIL}" 
         ${CERTBOT_STAGING_FLAG} 
         --agree-tos --force-renewal --non-interactive 
         -d "${TLS_HOSTNAME}"
fi

echo "Alustamine NGINX uue seadistusega"
service nginx start

# Kirjuta crontab Let's Encrypt sertifikaadi perioodiliseks uuendamiseks
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
  echo "Lisamine certbot crontab automaatseks Let's Encrypt uuendamiseks"
  (crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -
fi

Teie veebisaidi lisaseaded

Oleme juba rÀÀkinud, kuidas meie skript konfigureerib NGINX ja NGINX Unit, et teenindada tööstuslikuks kasutamiseks valmis veebisaiti, kus on sisse lĂŒlitatud TLS/SSL. Samuti vĂ”ite tulevikus vastavalt oma vajadustele lisada:

  • Tugi Brotli, tĂ€iustatud surumistehnika HTTPS-i kaudu
  • ModSecurity koos reeglitega WordPressi jaoks, et vĂ€ltida automaatseid rĂŒnnakuid teie saidile
  • Varundamine WordPressile, mis teile sobib
  • Kaitse kasutades AppArmor (Ubuntu sĂŒsteemis)
  • Postfix vĂ”i msmtp, et WordPress saaks e-kirju saata
  • Teie saidi kontrollimine, et mĂ”ista, kui palju liiklust see taluda suudab

VĂ€hemalt veel parema veebilehe jĂ”udluse saavutamiseks soovitame uuendada NGINX Plus, meie ettevĂ”tte taseme kaubanduslik toode, mis pĂ”hineb avatud lĂ€htekoodiga NGINX-l. Selle tellijad saavad dĂŒnaamiliselt laaditava Brotli mooduli ja (lisatasu eest) NGINX ModSecurity WAF. Pakume ka NGINX App Protect, NGINX Plus jaoks mĂ”eldud WAF moodul, mis pĂ”hineb F5 juhtivatel turvatehnoloogiatel.

N.B. KĂŒlasta meid kĂ”rge koormusega veebisaidi toe jaoks Southbridge. Tagame teie veebisaidi vĂ”i teenuse kiire ja usaldusvÀÀrse töö igasugustes koormustes.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster