Automatiseerime WordPressi installatsiooni NGINX Unit ja Ubuntu abil

Automatiseerime WordPressi installatsiooni NGINX Unit ja Ubuntu abil

WordPressi seadistamise kohta on palju materjale, Google'i otsing fraasiga "WordPress install" annab umbkaudu pool miljonit tulemust. Siiski on neid seas tegelikult ĂŒsna vĂ€he kvaliteetseid juhendeid, kuidas WordPressi ja alamsĂŒsteemi Ă”igesti seadistada ning pikaks ajaks sujuvalt toimima panna. Õige seadistus vĂ”ib sĂ”ltuda tugevalt konkreetsetest vajadustest vĂ”i olla pĂ”hjus, miks detailne selgitus muudab artikli raskesti loetavaks.

Selles artiklis ĂŒritame koguda kahe lĂ€henemise parimad elemendid, pakkudes bash-skripti WordPressi automaatseks installimiseks Ubuntu sĂŒsteemile, samuti kĂ€sitleme selle osi, selgitades, mida iga tĂŒkk teeb, ning arutame kompromise, mille olime sunnitud koostamisel tegema. Kui oled kogenud kasutaja, siis vĂ”id artikli tekstist mööda vaadata ja lihtsalt vĂ”tta skripti muudatuste tegemiseks ja kasutamiseks oma keskkondades. Skripti vĂ€ljundiks on kohandatav WordPressi installatsioon, mis toetab Lets Encrypt'i, töötab NGINX Unit'i peal ja sobib tööstuslikuks kasutamiseks.

WordPressi juurutamise arhitektuuri, kasutades NGINX Unit'i, on kirjeldatud varem ilmunud artiklis, nĂŒĂŒd seadistame samuti tĂ€iendavad asjad, mida seal ei kĂ€sitletud (nagu ka paljudes teistes juhendites):

  • WordPress CLI
  • Let’s Encrypt ja TLS sertifikaadid
  • Sertifikaatide automaatne uuendamine
  • NGINX'i vahemĂ€lu
  • NGINX'i tihendamine
  • HTTPS ja HTTP/2 toimetamine
  • Protsessi automatiseerimine

Artiklis kirjeldatakse installi ĂŒhel serveril, kus samal ajal on olemas staatiliste failide töötlemise server, PHP töötlemise server ja andmebaas. Mitme virtuaalse hosti ja teenuse toetava installi kĂ€sitlemine on potentsiaalne tuleviku teema. Kui soovid, et kirjutaksime millestki, mis selles artiklis pole kajastatud — kirjuta meile kommentaarides.

NÔuded

  • Konteiner-server (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 ligipÀÀsetavad portid 80 ja 443
  • Domeeninimi, mis on seotud selle serveri avaliku ip-aadressiga
  • LigipÀÀs root'i Ă”igustega (sudo).

Arhitektuuri ĂŒlevaade

Arhitektuur on sama nagu varem kirjeldatud artiklis, kolmetasandiline web-rakendus. See koosneb PHP skriptidest, mis kÀitatakse PHP töötleja peal, ja staatilistest failidest, mida töödeldakse veebiserveris.

Automatiseerime WordPressi installatsiooni NGINX Unit ja Ubuntu abil

ÜldpĂ”himĂ”tted

  • Paljud skripti seadistamise kĂ€sud on ĂŒmbritsetud tingimustega (if) idempotentsuse tagamiseks: skripti saab kĂ€itada mitu korda ilma riskita muuta juba seadistatud seadeid.
  • Skript pĂŒĂŒab installida tarkvara repodega, et saaksite sĂŒsteemi uuendusi kĂ€ivitada ĂŒhe kĂ€sklusega (apt upgrade Ubuntu jaoks).
  • KĂ€sud ĂŒritavad tuvastada, et nad kĂ€ivitatakse konteineris, et vastavalt oma seadeid muuta.
  • Seoses kĂ€ivitatavate protsesside / lĂ”imede arvu mÀÀramisega seades proovib skript Ă€ra arvata automaatse seadistuse parameetreid konteinerites, virtuaalmasinates ja fĂŒĂŒsilistes serverites töötamiseks.
  • Seadistuste kirjeldamisel mĂ”tleme esmalt automatiseerimisele, mis, nagu me loodame, saab teie enda infrastruktuuri nagu koodi loomise aluseks.
  • KĂ”ik kĂ€sud kĂ€ivitatakse kasutaja poolt root, sest need muudavad pĂ”hiosĂŒsteemi seadeid, kuid WordPress töötab tavakasutaja alt.

Keskkonnamuutujate seadistamine

Seadistage jÀrgmised keskkonnamuutujad enne skripti kÀivitamist:

  • WORDPRESS_DB_PASSWORD — WordPress andmebaasi parool
  • WORDPRESS_ADMIN_USER — WordPress administraatori nimi
  • WORDPRESS_ADMIN_PASSWORD — WordPress administraatori parool
  • WORDPRESS_ADMIN_EMAIL — WordPress administraatori e-posti aadress
  • WORDPRESS_URL — WordPress saidi tĂ€ielik URL, alustades https://.
  • LETS_ENCRYPT_STAGING — vaikimisi tĂŒhi, kuid kui seate vÀÀrtuseks 1, siis kasutate Let’s Encrypt staging servereid, mis on vajalikud sertifikaatide sagedaseks taotlemiseks teie seadeid testides, vastasel juhul vĂ”ib Let’s Encrypt ajutiselt blokeerida teie IP-aadressi suure arvu taotluste tĂ”ttu.

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

Tuletatud keskkonnamuutujate seadistamine

Skript ridades 55-61 seab jÀrgmised keskkonnamuutujad kas mÔnele kindlale vÀÀrtusele vÔi kasutades vÀÀrtust, mis on saadud eelnevas osas loodud muutujatest:

  • DEBIAN_FRONTEND="noninteractive" — teavitab rakendusi, et need kĂ€ivituvad skripti sees ja kasutajaga suhtlemine ei ole vĂ”imalik.
  • WORDPRESS_CLI_VERSION="2.4.0" — WordPress CLI rakenduse versioon.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" — WordPress CLI 2.4.0 kĂ€ivitatava faili MD5 kontrollsummat (versioon on mÀÀratud muutuja WORDPRESS_CLI_VERSION). Skripti 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 mitmetes kohtades, seega on mugavam mÀÀrata see ĂŒhes kohas.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'\/ ' -f3)" — sĂŒsteemi hostinimi, mis ekstraheeritakse muutuja WORDPRESS_URL-st. Kasutatakse sobivate TLS/SSL sertifikaatide saamiseks Let’s Encryptilt ja samuti WordPressi siseseks kontrollimiseks.
  • NGINX_CONF_DIR="\/etc\/nginx" — NGINX seadete katalooge, sealhulgas peamine fail. nginx.conf.
  • CERT_DIR="\/etc\/letsencrypt\/live\/${TLS_HOSTNAME}" — Let’s Encrypt sertifikaatide tee WordPressi saidile, saadud muutuja TLS_HOSTNAME.

WordPress serveri hostinime mÀÀramine.

Skripts mÀÀrab serverile hostinime, et vÀÀrtus vastaks saidi domeeninimele. See ei ole kohustuslik, kuid see muudab SMTP kaudu vĂ€liste e-kirjade saatmise mugavamaks, kui seadistada ĂŒksi serverit, nagu see 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

Hostinime lisamine \/etc\/hosts

TĂ€iendav WP‑Cron kasutatakse perioodiliste ĂŒlesannete kĂ€ivitamiseks ja eeldab, et WordPress suudab iseendale HTTP kaudu juurde pÀÀseda. Selleks, et veenduda, et WP-Cron töötab kĂ”igis keskkondades korrektselt, lisab skript faili real /etc/hosts, et WordPress saaks iseendale juurdepÀÀsu loopback liidese kaudu:

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Ôutud tööriistade seadistamine jÀrgmiste sammude jaoks.

Skripti ĂŒlejÀÀnud osa vajab mĂ”ningaid programme ja eeldab, et hoidlad on ajakohased. Uuendame hoidlate nimekirja, 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 Unit ja NGINX hoidlate lisamine.

Skript paigaldab NGINX Unit ja NGINX avatud lÀhtekoodiga ametlikest NGINX hoidlatest, et tagada, et kasutataks turvaparanduste ja bugifiksaatorite uusimaid versioone.

Skript lisab NGINX Unit hoidla ning seejĂ€rel — NGINX hoidla, lisades hoidlate vĂ”tmed ja seadistusfailid. apt, mis mÀÀravad juurdepÀÀsu hoidlatele interneti kaudu.

Reaalse NGINX Unita ja NGINX-i installatsioon toimub jÀrgnevates osades. Lisame eelnevalt hoidlad, et mitte uuendada metainf oma mitu korda, mis teeb 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

NGINX-i, NGINX Unita, PHP MariaDB, Certboti (Let’s Encrypt) ja nende sĂ”ltuvuste installatsioon

Kui kÔik hoidlad on lisatud, uuendame metainf ja installime rakendused. Skripti kaudu installitavad paketid sisaldavad ka PHP laiendusi, mis on soovitatavad WordPress.org-i kÀivitamisel.

skripti kood

echo " Uuendame hoidlate metainf"
apt-get -qq update

# Installi PHP koos sÔltuvustega ja NGINX Unit
echo " Installime PHP, NGINX Unita, NGINX-i, 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 WordPressiga kasutamiseks

Skript loob seadistuste faili katalooge conf.d. Siin mÀÀratakse PHP jaoks ĂŒleslaadimise maksimaalne failisuurus, lubatakse PHP veateadete vĂ€ljastamine STDERR-i, nii et need salvestatakse NGINX Uniti logisse, ja seejĂ€rel taaskĂ€ivitades NGINX Uniti.

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

Seadistame MariaDB andmebaasi WordPressi jaoks

Valisime MariaDB MySQL-i asemel, kuna sellel on aktiivsem kogukond ning lisaks sellele, pakub see tĂ”enĂ€oliselt vaikimisi kĂ”rgemat jĂ”udlust (tĂ”enĂ€oliselt on see palju lihtsam: MySQL-i installimiseks tuleb lisada veel ĂŒks hoidla, tlk. tĂ”lkija).

Skript loob uue andmebaasi ja loob WordPressi juurdepÀÀsuandmed loopback-liidese kaudu:

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 installimine

Sel samal sammul installib skript programmi WP-CLI. Selle abil saab installida ja hallata WordPressi seadistusi ilma failide kÀsitsi muutmiseta, andmebaasi uuendamiseta vÔi juhtpaneeli sisselogimiseta. Samuti saab selle kaudu installida teemasid ja lisandeid ning teostada WordPressi uuendusi.

skripti kood

if [ ! -f /usr/local/bin/wp ]; then
  # Installi WordPressi CLI
  echo " Installime WordPressi CLI tööriista"
  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 viimase WordPressi versiooni katalooge /var/www/wordpress, samuti muudab seadistusi:

  • AndmebaasiĂŒhendus töötab kaudu unix domain socket, mitte TCP lĂ”pp-punkti juures, et vĂ€hendada TCP liiklust.
  • WordPress lisab eesliite https:// URL-le, kui kliendid ĂŒhendavad NGINX-i HTTPS-protokolli kaudu, ja edastab kaug-hostnime (nagu NGINX-i poolt pakkuda) PHP-sse. Kasutame selle seadistamiseks koodilĂ”ik.
  • WordPress vajab sisselogimiseks HTTPS-i
  • URL-i struktuur pĂ”hineb vaikimisi ressurssidest
  • WordPressi kaustale on mÀÀratud Ă”iged failisĂŒsteemi Ă”igused.

skripti kood

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

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

  # See koodilÔik sisestatakse wp-config.php faili, kui see luuakse;
  # see teatab WordPressile, et oleme vastupidise proxy taga ja seega
  # vÔimaldab tal generaata linke kasutades HTTPS-i
  cat > /tmp/wp_forwarded_for.php << 'EOM'
/* LĂŒlita HTTPS 'sisse', kui HTTP_X_FORWARDED_PROTO vastab '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

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

  # Sea permalink struktuur mÔistlikuks vaikeseisundiks, mis ei ole UI-s
  su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data

  # Eemalda nÀidistfail, kuna see on tarbetu ja vÔib olla turvarisk
  rm /var/www/wordpress/wp-config-sample.php

  # Veendu, et WordPressi Ôigused on Ô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

Skript seadistab NGINX Unit PHP kÀitamiseks ja WordPressi teede töötlemiseks, eraldades PHP protsesside nimede ruumi ja optimeerides jÔudluseseadeid. Tasub tÀhelepanu pöörata kolmele funktsioonile:

  • Nimede ruumi tugi mÀÀratakse tingimuse alusel, tuginedes skripti kĂ€itamise kontrollimisele konteineris. See on vajalik, kuna enamik konteineriseadeid ei toeta sisemiste konteinerite kĂ€itamisele.
  • Kui nimede ruumi tugi on olemas, siis keelatakse nimede ruum network. See on vajalik, et vĂ”imaldada WordPressil samal ajal ĂŒhenduda ja olla kergesti juurdepÀÀsetav internetis.
  • Maksimaalne protsesside arv mÀÀratakse jĂ€rgmiselt: (Saadaval mĂ€lu MariaDB ja NGINX Uniy jaoks) / (PHP piirangud + 5)
    See vÀÀrtus mÀÀratakse NGINX Uniti seadetes.

Samuti tĂ€hendab see, et alati on vĂ€hemalt kaks aktiveeritud PHP protsessi, mis on oluline, kuna WordPress teeb palju asĂŒnkroonseid pĂ€ringuid ise endale, ja ilma lisaprotsessideta vĂ”ib nĂ€iteks WP-Cron peatuda. VĂ”ib-olla soovite neid piiranguid suurendada vĂ”i vĂ€hendada vastavalt oma kohandatud seadetele, kuna siin loodud seaded on konservatiivsed. Enamikus tootmis sĂŒsteemides on seadistus vahemikus 10–100.

skripti kood

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 " Arvutatud maksimaalne PHP protsesside arv on ${MAX_PHP_PROCESSES}. Soovitatav on seda vÀÀrtust kohandada vastavalt konfiguratsiooni erinevustele. Tootmis konfiguratsioonides on tavaline nÀha vÀÀrtusi vahemikus 10-100."

echo " Konfigureerimine NGINX Uniti, et kasutada PHP ja WordPressi"
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Ôhiseadete seadistamine

Skript loob NGINXi vahemĂ€lu katalooge ja seejĂ€rel loob peamise seadistuse faili nginx.confPöörake tĂ€helepanu töötlejate protsesside arvule ja ĂŒlesande maksimaalsele failisuurusele, mille saab laadida. Samuti on olemas rida, kus laaditakse sisse konfiguratsioonifail, mida mÀÀratletakse jĂ€rgmises osas, seejĂ€rel jĂ€rgnevad vahemĂ€cache seaded.

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 kompressiooni seadistamine

Sisu kompressimine reaalajas enne selle saatmist klientidele on suurepÀrane viis saidi jÔudluse parandamiseks, kuid ainult juhul, kui kompressioon on Ôigesti seadistatud. See skripti osa 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
# Aktiveeri gzip kompressioon.
# Vaikimisi: off
gzip on;
# Kompressiooni tase (1-9).
# 5 on ideaalne kompromiss suuruse ja CPU kasutamise vahel, pakkudes umbes 75%
# vÀhendamist enamikus ASCII failides (peaaegu identne tasemega 9).
# Vaikimisi: 1
gzip_comp_level 6;
# Ära kompressi midagi, mis on juba vĂ€ike ja ei pruugi palju kokku suruda,
# (vaikimisi on see 20 baiti, mis on halb, kuna see viib tavaliselt suuremate
# failide tekkeni pÀrast gzippingut).
# Vaikimisi: 20
gzip_min_length 256;
# Kompressi andmeid isegi klientide jaoks, kes ĂŒhenduvad meiega kaudu volikirju,
# tuvastatud "Via" pÀises (kui vajalik CloudFronti jaoks).
# Vaikimisi: off
gzip_proxied any;
# Ütle vahe-Serveritele, et salvestada nii gzipped kui ka tavaline versioon ressursist
# igal korral, kui kliendi Accept-Encoding vÔimed pÀis erinevad;
# VÀltige probleemi, kus mitte-gzip vÔimekusega klient (mis on ÀÀrmiselt haruldane
# tÀna) kuvab segadust, kui nende vahe-Server annab neile gzipped versiooni.
# Vaikimisi: off
gzip_vary on;
# Kompressi kogu vĂ€ljund, 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 WordPress'i jaoks

SeejÀrel loob skript WordPress'i seadistusfaili default.conf kaustas conf.d. Siin seadistatakse:

  • TLS sertifikaatide aktiveerimine, mis on saadud Let’s Encrypt kaudu Certboti kaudu (selle seadistamine tuleb jĂ€rgmises osas)
  • TLS turvaseadete seadistamine, mis pĂ”hineb Let’s Encrypt'i soovitustel
  • VahemĂ€lu seadistamine vahele jĂ€etud pĂ€ringutele 1 tunni jooksul vaikimisi
  • LigipÀÀsu logimise keelamine, samuti vealogimise, kui faili ei leita, kahe ĂŒldiselt nĂ”utud faili jaoks: favicon.ico ja robots.txt
  • Keelata ligipÀÀs peidetud failidele ja mĂ”ningatele failidele .php, et vĂ€ltida ebaseaduslikku juurdepÀÀsu vĂ”i tahtmatut kĂ€ivitamist
  • Logimise keelamine staatiliste ja fontifailide jaoks
  • Pealkirja mÀÀramine Access-Control-Allow-Origin fontifailide jaoks
  • Ruuterite lisamine index.php ja teiste staatiliste failide jaoks.

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-challenge, mida Certbot kasutab Let's Encrypti jaoks
    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 Encrypti 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;
    # Vahe-teeninduse cache
    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 juurdepÀÀsu saada peidetud failidele, nagu .htaccess, .htpasswd,
    # .DS_Store (Mac)
    # Hoia logimisprotsessid hilisemaks analĂŒĂŒsimiseks (vĂ”i edasta tulemĂŒĂŒritarkvarale
    # nagu fail2ban)
    location ~ \/. {
        deny all;
    }
    # Keela juurdepÀÀs mis tahes .php laiendiga failidele ĂŒleslaadimise kataloogis;
    # töötab alamkataloogide installides ja ka multisettevÔtte vÔrgus.
    # Hoia logimisprotsessid hilisemaks analĂŒĂŒsimiseks (vĂ”i edasta tulemĂŒĂŒritarkvarale
    # 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-le
    location ~* wp-config.php {
        deny all;
    }
    # Ära logi juurdepÀÀsu staatilistele varadele, meediale
    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 automatiseeritud uuendamine

Certbot on tasuta tööriist, mille on vÀlja töötanud Electronic Frontier Foundation (EFF), mille abil saab saada ja automaatselt uuendada TLS-sertifikaate Let's Encryptilt. Skript sooritab jÀrgmised toimingud, et seadistada Certbot Let's Encrypti sertifikaatide töötlemiseks NGINX-is:

  • Peatab NGINX-i
  • Laeb soovitatud TLS-i parameetreid
  • KĂ€ivitab Certboti, et hankida sertifikaate saidi jaoks
  • TaaskĂ€ivitab NGINX-i, et kasutada sertifikaate
  • Seadistab Certboti igapĂ€evase kĂ€ivitamise kell 3:24 öösel, et kontrollida sertifikaatide uuendamise vajadust, samuti vajadusel uute sertifikaatide hankimist ja NGINX-i taaskĂ€ivitamist.

skripti kood

echo " Peatame NGINX-i Let's Encrypti seadistamiseks"
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 " Laeme soovitatud TLS-i 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 viimast options-ssl-nginx.conf"
fi

if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
  echo " Laeme soovitatud TLS-i 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 viimast ssl-dhparams.pem"
fi

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

echo " KĂ€ivitame NGINX-i, et kasutada uut konfiguratsiooni"
service nginx start

# Kirjutame crontabi perioodilise Let's Encrypti sertifikaadi uuendamise jaoks
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
  echo " Lisame certboti crontabi automaatseks Let's Encrypti uuendamiseks"
  (crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -
fi

Teie saidi tÀiendav seadistamine

Oleme eelnevalt rÀÀkinud sellest, kuidas meie skript seadistab NGINX-i ja NGINX Unit'i valmis tööstuslikuks veebisaidiks, millel on TLS/SSL aktiivne. Saate ka sÔltuvalt teie vajadustest tulevikus lisada:

  • Tugevdus Brotli, tĂ€iustatud surumine HTTPS-i kaudu
  • ModSecurity jot reeglitega WordPressi jaoks, et takistada automatiseeritud rĂŒnnakuid teie saidile
  • Varundamine WordPressile, mis teile sobib
  • Kaitse kasutades AppArmor (Ubuntu-s)
  • Postfix vĂ”i msmtp, et WordPress saaks e-kirju saata
  • Teie saidi testimised, et mĂ”ista, kui palju liiklust see talub

Veelgi parema saidi jĂ”udluse saavutamiseks soovitame uuendada NGINX Plus, meie kommertsiettevĂ”tte tasemel toode, mis pĂ”hineb avatud lĂ€htekoodiga NGINX-il. Selle tellijad saavad dĂŒnaamiliselt laaditava Brotli mooduli, samuti (lisatasu eest) NGINX ModSecurity WAF. Me pakume ka NGINX App Protect, WAF moodulit NGINX Plus jaoks, mis pĂ”hineb valdkonna juhtivatel turvatehnoloogiatel F5-lt.

MÀrkus. KÔrge koormusega saidi toetamiseks vÔite pöörduda spetsialistide poole Southbridge. Tagame teie saidi vÔi teenuse kiire ja usaldusvÀÀrse toimimise igasuguste koormuste all.

Allikas: habr.com

Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster