Automatizojmë instalimin e WordPress me NGINX Unit dhe Ubuntu

Automatizojmë instalimin e WordPress me NGINX Unit dhe Ubuntu

Ka shumë materiale për instalimin e WordPress, një kërkim në Google me fjalët kyçe "instalimi i WordPress" do të japë rreth pesëqind mijë rezultate. Megjithatë, në realitet, mes tyre ka shumë pak udhëzimesh të dobishme që mund të instalojnë dhe konfigurojnë WordPress dhe sistemin operativ përkatës në mënyrë që ato të jenë të qëndrueshme për një periudhë të gjatë kohore. Ndoshta cilësimet e duhura varen shumë nga nevojat specifike, ose kjo është e lidhur me faktin se një shpjegim i detajuar e bën artikullin të vështirë për t'u lexuar.

NĂ« kĂ«tĂ« artikull ne do tĂ« pĂ«rpiqemi tĂ« mbledhim mĂ« tĂ« mirĂ«n nga tĂ« dyja qasjet, duke ofruar njĂ« skenar nĂ« bash pĂ«r instalimin automatizuar tĂ« WordPress nĂ« Ubuntu, si dhe do ta shqyrtojmĂ« atĂ«, duke shpjeguar se çfarĂ« bĂ«n çdo pjesĂ«, si dhe cilat kompromise kemi bĂ«rĂ« gjatĂ« zhvillimit tĂ« tij. NĂ«se jeni njĂ« pĂ«rdorues i avancuar — mund t'i kaloni tekstet e artikullit dhe thjesht merrni skriptin pĂ«r ta modifikuar dhe pĂ«rdorur nĂ« ambientet tuaja. Rezultati i skriptit Ă«shtĂ« njĂ« instalim i personalizuar i WordPress me mbĂ«shtetje pĂ«r Lets Encrypt, i cili funksionon mbi NGINX Unit dhe Ă«shtĂ« i pĂ«rshtatshĂ«m pĂ«r pĂ«rdorim industrial.

Arkitektura e ndërtuar për të shpërndarë WordPress duke përdorur NGINX Unit është përshkruar në një artikull më të vjetër, tani ne gjithashtu do të konfigurojmë më shumë gjëra që nuk ishin mbuluar atje (ashtu si në shumë udhëzime të tjera):

  • WordPress CLI
  • Let’s Encrypt dhe certifikatat TLS/SSL
  • Rivendosja automatike e certifikatave
  • Keßimi NGINX
  • Shtypja NGINX
  • MbĂ«shtetje pĂ«r HTTPS dhe HTTP/2
  • Automatizimi i procesit

Ky artikull do tĂ« pĂ«rshkruajĂ« instalimin nĂ« njĂ« server, ku do tĂ« vendosen njĂ«kohĂ«sisht serveri qĂ« pĂ«rpunon statikĂ«n, serveri qĂ« pĂ«rpunon PHP, dhe databaza. NjĂ« instalim me mbĂ«shtetje pĂ«r shumĂ« hoste virtualĂ« dhe shĂ«rbime Ă«shtĂ« njĂ« temĂ« e mundshme pĂ«r tĂ« ardhmen. DĂ«shironi qĂ« ne tĂ« shkruajmĂ« pĂ«r diçka qĂ« nuk Ă«shtĂ« pĂ«rfshirĂ« nĂ« kĂ«to artikuj — shkruani nĂ« komentet.

Kërkesat

  • Serveri-kontener (LXC ose LXD), makinĂ« virtuale, ose njĂ« server tĂ« zakonshĂ«m fizik, me jo mĂ« pak se 512MB memorie RAM dhe Ubuntu 18.04 ose version mĂ« tĂ« ri tĂ« instaluar.
  • Portet e aksesueshme nga interneti 80 dhe 443
  • Emri i domenit tĂ« lidhur me adresĂ«n publike IP tĂ« kĂ«tij serveri.
  • Qasje me tĂ« drejtat root (sudo).

Përmbledhje e arkitekturës

Arkitektura është e njëjtë me atë që ishte përshkruar më parë, një aplikacion web me tri nivele. Ai përbëhet nga skriptet PHP, të cilat ekzekutohen në përpunuesin PHP dhe skedarët statikë, që përpunohen nga serveri web.

Automatizojmë instalimin e WordPress me NGINX Unit dhe Ubuntu

Parimet e përgjithshme

  • ShumĂ« komanda pĂ«r konfigurimin nĂ« skript janĂ« tĂ« mbĂ«shtjella nĂ« kushte (if) pĂ«r idempotencĂ«: skripti mund tĂ« ekzekutohet disa herĂ« pa rrezikun e ndryshimit tĂ« cilĂ«simeve qĂ« tashmĂ« janĂ« tĂ« gatshme.
  • Skripti pĂ«rpiqet tĂ« instaloje softuerin nga depo, kĂ«shtu qĂ« ju mund tĂ« aplikoni pĂ«rditĂ«simet e sistemit me njĂ« komandĂ« (apt upgrade pĂ«r Ubuntu).
  • Komandat pĂ«rpiqen tĂ« pĂ«rcaktojnĂ« se po ekzekutohen nĂ« njĂ« kontejner, pĂ«r tĂ« ndryshuar pĂ«rkatĂ«sisht cilĂ«simet e tyre.
  • PĂ«r tĂ« caktuar numrin e proceseve qĂ« do tĂ« ekzekutohen nĂ« cilĂ«sime, skripti pĂ«rpiqet tĂ« gjejĂ« parametrat automatikĂ« tĂ« konfigurimit pĂ«r tĂ« punuar nĂ« kontejnerĂ«, makina virtuale dhe serverĂ« ‘hard’.
  • Kur pĂ«rshkruajmĂ« cilĂ«simet, gjithmonĂ« mendojmĂ« sĂ« pari pĂ«r automatizimin, i cili, siç shpresojmĂ«, do tĂ« bĂ«het baza pĂ«r krijimin e infrastrukturĂ«s suaj si kod.
  • TĂ« gjitha komandat ekzekutohen nga pĂ«rdoruesi root, sepse ato ndryshojnĂ« cilĂ«simet kryesore tĂ« sistemit, por WordPress funksionon drejtpĂ«rdrejt nga njĂ« pĂ«rdorues i zakonshĂ«m.

Instalimi i variablave të ambientit

Vendosni variablat e mëposhtëm të mjedisit përpara se të ekzekutoni skriptin:

  • WORDPRESS_DB_PASSWORD — fjalĂ«kalimi pĂ«r databazĂ«n e WordPress-it
  • WORDPRESS_ADMIN_USER — emri i administratorit tĂ« WordPress-it
  • WORDPRESS_ADMIN_PASSWORD — fjalĂ«kalimi i administratorit tĂ« WordPress-it
  • WORDPRESS_ADMIN_EMAIL — emaili i administratorit tĂ« WordPress-it
  • WORDPRESS_URL — URL-ja e plotĂ« e faqes WordPress, duke filluar nga https://.
  • LETS_ENCRYPT_STAGING — e zbrazĂ«t si parazgjedhje, por duke vendosur vlerĂ«n nĂ« 1, do tĂ« pĂ«rdorni serverĂ«t staging tĂ« Let’s Encrypt, tĂ« nevojshĂ«m pĂ«r kĂ«rkimin e shpeshtĂ« tĂ« certifikatave gjatĂ« testimit tĂ« cilĂ«simeve tuaja, pĂ«rndryshe Let’s Encrypt mund tĂ« bllokojĂ« pĂ«rkohĂ«sisht adresĂ«n tuaj IP pĂ«r shkak tĂ« numrit tĂ« madh tĂ« kĂ«rkesave.

Skripti kontrollon që këto variabla të lidhura me WordPress të jenë vendosur dhe përfundon ekzekutimin nëse jo.
Rreshtat e skriptit 572-576 kontrollojnë vlerën LETS_ENCRYPT_STAGING.

Vendosja e variablave të rrjedhës

Skripti në rreshtat 55-61 vendos variablat e mëposhtëm të mjedisit, ndoshta në një vlerë të caktuar në mënyrë të ngurtë ose duke përdorur vlerën e marrë nga variablat e vendosur në seksionin e mëparshëm:

  • DEBIAN_FRONTEND="noninteractive" — informon aplikacionet se po ekzekutohen nĂ« skript dhe nuk ka mundĂ«si ndĂ«rveprimi me pĂ«rdoruesin.
  • WORDPRESS_CLI_VERSION="2.4.0" — versioni e aplikacionit WordPress CLI.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" — kontrolla e shumĂ«s sĂ« ekzekutuesit tĂ« WordPress CLI 2.4.0 (versioni jepet nĂ« variablĂ«n WORDPRESS_CLI_VERSION). Skripti nĂ« linjĂ«n 162 pĂ«rdor kĂ«tĂ« vlerĂ« pĂ«r tĂ« verifikuar qĂ« Ă«shtĂ« shkarkuar skedari i saktĂ« i WordPress CLI.
  • UPLOAD_MAX_FILESIZE="16M" — madhĂ«sia maksimale e skedarit qĂ« mund tĂ« ngarkohet nĂ« WordPress. Ky rregullim pĂ«rdoret nĂ« disa vende, prandaj Ă«shtĂ« mĂ« e lehtĂ« ta caktoni atĂ« nĂ« njĂ« vend tĂ« vetĂ«m.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'\/ -f3)" — hostname i sistemit, i nxjerrĂ« nga variabla WORDPRESS_URL. PĂ«rdoret pĂ«r tĂ« marrĂ« certifikatat e duhura TLS/SSL nga Let’s Encrypt, si dhe pĂ«r verifikimin e brendshĂ«m tĂ« WordPress.
  • NGINX_CONF_DIR="\/etc\/nginx" — rruga drejt katalogut me konfigurimet NGINX, duke pĂ«rfshirĂ« skedarin kryesor nginx.conf.
  • CERT_DIR="\/etc\/letsencrypt\/live\/${TLS_HOSTNAME}" — rruga drejt certifikatave Let’s Encrypt pĂ«r faqen WordPress, e marrĂ« nga variabla TLS_HOSTNAME.

Cakto hostname për serverin WordPress

Skripti cakton hostname për serverin që vlera të përputhet me emrin domain të faqes. Kjo nuk është e detyrueshme, por është më e lehtë për të dërguar email të daljes përmes SMTP kur konfigurohet një server i vetëm, siç e konfiguron skripti.

kodi i skriptit

# 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

Shtimi i hostname në \/etc\/hosts

Shtesa WP‑Cron pĂ«rdoret pĂ«r tĂ« ekzekutuar detyra periodike, kĂ«rkon qĂ« WordPress tĂ« jetĂ« nĂ« gjendje tĂ« q.access vetveten pĂ«rmes HTTP. PĂ«r tĂ« siguruar qĂ« WP-Cron funksionon siç duhet nĂ« tĂ« gjitha ambientet, skripti shton njĂ« rresht nĂ« skedarin /etc/hosts, kĂ«shtu qĂ« WordPress mund tĂ« q.access vetveten pĂ«rmes ndĂ«rfaqes loopback:

kodi i skriptit

# 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

Instalimi i mjeteve të kërkuara për hapat e mëvonshëm

Pjesa e mbetur e skriptit ka nevojë për disa programe dhe nënkupton se repozitorët janë të azhurnuar. Ne përditësojmë listën e repozitorëve, pas së cilës instalojmë mjetet e nevojshme:

kodi i skriptit

# 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

Shtimi i repozitorëve NGINX Unit dhe NGINX

Skripti instalon NGINX Unit dhe NGINX nga repozitorët zyrtarë NGINX që të sigurohet që përdoren versionet me azhurnimet më të fundit të sigurisë dhe riparimet e gabimeve.

Skripti shton repozitorin NGINX Unit dhe mĂ« pas — repozitorin NGINX, duke shtuar çelĂ«sin e repozitorĂ«ve dhe skedarĂ«t e konfigurimit apt, duke caktuar q.access nĂ« repozitorĂ«t pĂ«rmes internetit.

Instalimi real i NGINX Unit dhe NGINX bëhet në seksionin e mëposhtëm. Ne paraprakisht shtojmë repository për të shmangur përditësimin e metadatas disa herë, gjë që bën që instalimi të jetë më i shpejtë.

kodi i skriptit

# 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

Instalimi i NGINX, NGINX Unit, PHP MariaDB, Certbot (Let’s Encrypt) dhe varĂ«sive tĂ« tyre

Sapo të jenë shtuar të gjitha repository-t, përditësojmë metadata dhe instalojmë aplikacionet. Paketat që instalohen nga skripti përfshijnë gjithashtu zgjerime PHP, të rekomanduara gjatë aktivizimit të WordPress.org

kodi i skriptit

echo " Përditësimi i metadatas së repository-t"
apt-get -qq update

# Instaloni PHP me varësi dhe NGINX Unit
echo " Instalimi i PHP, NGINX Unit, NGINX, Certbot dhe 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

Konfigurimi i PHP për t'u përdorur me NGINX Unit dhe WordPress

Skripti krijon një skedar konfigurimi në katalogun conf.d. Këtu përcaktohet madhësia maksimale e skedave që mund të ngarkohen për PHP, aktivizohet shfaqja e gabimeve PHP në STDERR, kështu që ato do të regjistrohen në gazetën e NGINX Unit, si dhe riaktivizohet NGINX Unit.

kodi i skriptit

# 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

Caktimi i konfigurimeve të bazës së të dhënave MariaDB për WordPress

Ne zgjodhëm MariaDB në vend të MySQL, pasi ajo ka më shumë aktivitete të komunitetit, përveç kësaj, ajo mundësisht ofron një performancë më të lartë si standard (ndoshta, këtu është më e lehtë: për të instaluar MySQL, duhet të shtoni një depo të re, shënim, përkthyesi).

Skripti krijon një bazë të re të të dhënave dhe krijon kredencialet për qasjen e WordPress përmes ndërfaqes loopback:

kodi i skriptit

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

Instalimi i aplikacionit WordPress CLI

Në këtë hap, skripti instalon aplikacionin WP-CLI. Me të, është e mundur të instaloni dhe menaxhoni konfigurimet e WordPress pa qenë nevoja për të redaktuar manualisht skedarët, përditësuar bazën ose hyrë në panelin e menaxhimit. Gjithashtu, me të mund të instaloni tema dhe shtesa dhe të kryeni përditësime të WordPress.

kodi i skriptit

if [ ! -f /usr/local/bin/wp ]; then
  # Instaloni mjetin WordPress CLI
  echo " Instalimi i mjetit WordPress CLI"
  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

Instalimi dhe konfigurimi i WordPress

Skripti instalon versionin më të fundit të WordPress në katalogun /var/www/wordpress, si dhe ndryshon konfigurimet:

  • Koneksioni me bazĂ«n e tĂ« dhĂ«nave funksionon pĂ«rmes soketit tĂ« domain-it unix nĂ« vend tĂ« TCP nĂ« loopback, pĂ«r tĂ« reduktuar trafikun TCP.
  • WordPress shton njĂ« paragraf https:// pĂ«r URL-nĂ«, nĂ«se klientĂ«t lidhen me NGINX pĂ«rmes protokollit HTTPS, gjithashtu dĂ«rgon emrin e hostit tĂ« largĂ«t (siç e ofron NGINX) nĂ« PHP. Ne zbatojmĂ« njĂ« copĂ« kod pĂ«r ta konfiguruar kĂ«tĂ«.
  • WordPress-i ka nevojĂ« pĂ«r HTTPS pĂ«r hyrje
  • Struktura e URL-sĂ« bazuar nĂ« parametrit e burimeve
  • Caktimi i tĂ« drejtave tĂ« sakta nĂ« sistemin e skedarĂ«ve pĂ«r direktorinĂ« e WordPress-it.

kodi i skriptit

if [ ! -d /var/www/wordpress ]; then
  # Krijoni katalogët e WordPress-it
  mkdir -p /var/www/wordpress
  chown -R www-data:www-data /var/www

  # Shkarkoni WordPress-in duke përdorur CLI e WordPress-it
  echo " Instalimi i WordPress-it"
  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}""

  # Ky copë kod është injektuar në skedarin wp-config.php kur krijohet;
  # informon WordPress-in që ne jemi pas një proxy të prapme dhe si i tillë
  # lejon që të krijojë lidhje duke përdorur HTTPS
  cat > /tmp/wp_forwarded_for.php << 'EOM'
/* Aktivizoni HTTPS 'nëse' HTTP_X_FORWARDED_PROTO përputhet me '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

  # Krijoni konfigurimin e WordPress-it
  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

  # Instaloni WordPress-in
  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

  # Caktoni strukturën e permalink-ut në një të paracaktuar të arsyeshëm që nuk është në UI
  su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data

  # Hiqni skedarin shembull sepse është mbetje dhe mund të jetë një problem sigurie
  rm /var/www/wordpress/wp-config-sample.php

  # Sigurohuni që të drejtat e WordPress-it janë korrekte
  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

Konfigurimi i NGINX Unit

Skripti konfiguron NGINX Unit për të ekzekutuar PHP dhe për të trajtuar rrugët e WordPress-it, duke izoluara hapësirën emërore të proceseve PHP dhe optimizuar konfigurimet e performancës. Këtu janë tri funksione që meritojnë vëmendje:

  • MbĂ«shtetje pĂ«r hapĂ«sirat emĂ«rore pĂ«rcaktohet nga njĂ« kusht, i bazuar nĂ« kontrollin e ekzekutimit tĂ« skriptit nĂ« kontejner. Kjo Ă«shtĂ« e nevojshme, pasi shumica e konfigurimeve tĂ« kontejnerĂ«ve nuk mbĂ«shtesin ekzekutimin e brendshĂ«m tĂ« kontejnerĂ«ve.
  • NĂ«se ka mbĂ«shtetje pĂ«r hapĂ«sirat emĂ«rore, hapĂ«sira emĂ«rore çaktivizohet rrjeti. Kjo Ă«shtĂ« e nevojshme pĂ«r tĂ« lejuar WordPress-in qĂ« tĂ« lidhet njĂ«kohĂ«sisht me endpoint-et dhe tĂ« jetĂ« e aksesueshme nĂ« internet.
  • Numri maksimal i proceseve pĂ«rcaktohet si mĂ« poshtĂ«: (Memoria e disponueshme pĂ«r MariaDB dhe NGINX Uniy tĂ« lĂ«shuara) / (kuota e memories RAM nĂ« PHP + 5)
    Ky vlerësim caktohet në parametrat e NGINX Unit.

Ky vlerësim nënkupton gjithashtu se gjithmonë ka të paktën dy procese PHP të lëshuara, e cila është e rëndësishme sepse WordPress bën shumë kërkesa asinkrone për veten e tij, dhe pa procese shtesë, ekzekutimi i WP-Cron, për shembull, do të dështojë. Ju ndoshta dëshironi të rrisni ose të ulni këto kufij, në varësi të konfigurimeve tuaja lokale, sepse parametrat e krijuar këtu janë konservatorë. Në shumicën e sistemeve prodhuese, parametrat janë midis 10 dhe 100.

kodi i skriptit

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 " Llogaritur numri maksimal i proceseve PHP si ${MAX_PHP_PROCESSES}. Mund të dëshironi ta rregulloni këtë vlerë për shkak të variacioneve në konfigurimin tuaj. Nuk është e pazakontë të shikoni vlera midis 10-100 në konfigurimet prodhuese."

echo " Konfigurimi i NGINX Unit për të përdorur PHP dhe 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

Konfigurimi i NGINX

Konfigurimi i parametrave themelorë të NGINX

Skema krijon një katalog për keshin NGINX dhe pastaj krijon skedarin kryesor të konfigurimit nginx.conf.Kujdesi për numrin e proceseve të përpunuesve dhe caktimin e madhësisë maksimale të skedareve për ngarkim. Ka gjithashtu një radhë ku lidhet skedari i konfigurimit për kompresimin, i përcaktuar në seksionin vijues, pasojnë cilësimet e enkashtimit.

kodi i skriptit

# 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

Konfigurimi i kompresionit NGINX

Kompresimi i përmbajtjes në kohë reale para se t'i dërgohet klientëve është një mënyrë e shkëlqyer për të përmirësuar performancën e sitit, por vetëm nëse kompresimi është i konfigurueshëm siç duhet. Ky seksion i skriptit bazohet në cilësimet këtu.

kodi i skriptit

cat > ${NGINX_CONF_DIR}/gzip_compression.conf << 'EOM'
# Kredit: https://github.com/h5bp/server-configs-nginx/
# ----------------------------------------------------------------------
# | Kompresimi                                                        |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Aktivizo kompresimin gzip.
# NĂ« parazgjedhje: off
gzip on;
# Nivel kompresimi (1-9).
# 5 është një kompromis perfekt midis madhësisë dhe përdorimit të CPU-së, duke ofruar rreth 75%
# reduktim për shumicën e skedareve ASCII (më afër nivelit 9).
# NĂ« parazgjedhje: 1
gzip_comp_level 6;
# Mos kompresoni asgjë që është tashmë e vogël dhe e prirur për të u zvogëluar shumë nëse
# ndodhi (parazgjedhja është 20 byte, që është e keqe pasi kjo zakonisht udhëheq në skedare më të mëdhenj pas gzipping).
# NĂ« parazgjedhje: 20
gzip_min_length 256;
# Kompresoni të dhënat për klientët që po lidhen me ne përmes proksive,
# të identifikuar nga titulli "Via" (e nevojshme për CloudFront).
# NĂ« parazgjedhje: off
gzip_proxied any;
# Thoni proksive të ruajnë si versionin e gzipped ashtu edhe versionin e zakonshëm të një burimi
# çdo herë që kapacitetet e titullit të pranuar të klientit ndryshojnë;
# Shmangni problemin ku një klient jo-gzip (i cili është jashtëzakonisht i rrallë
# sot) do të shfaqte përmbajtje të pavlefshme nëse proksi i tij u dha versionin e gzipped.
# NĂ« parazgjedhje: off
gzip_vary on;
# Kompresoni të gjitha daljet të etiketuar me një nga MIME-tipet e mëposhtme.
# `text/html` gjithmonë kompresohet nga moduli gzip.
# NĂ« parazgjedhje: 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

Konfigurimi i NGINX për WordPress

Më pas skripti krijon një skedë konfigurimi për WordPress default.conf në katalogun conf.d.Këtu konfigurohet:

  • Aktivizimi i certifikatatve TLS, tĂ« fituar nga Let’s Encrypt pĂ«rmes Certbot (konfigurimi i tij do tĂ« pĂ«rmendet nĂ« seksionin vijues)
  • Konfigurimi i parametrave tĂ« sigurisĂ« TLS, bazuar nĂ« rekomandimet e Let’s Encrypt
  • Aktivizimi i enkashtimit pĂ«r kĂ«rkesat qĂ« kalojnĂ« pĂ«r 1 orĂ« si parazgjedhje
  • Çaktivizimi i regjistrimit tĂ« aksesit, si dhe regjistrimi i gabimeve, nĂ«se skedari nuk gjendet, pĂ«r dy skedarĂ« tĂ« zakonshĂ«m tĂ« kĂ«rkuar: favicon.ico dhe robots.txt
  • Ndalesa e aksesit pĂ«r skedarĂ«t e fshehtĂ« dhe disa skedarĂ« .php, pĂ«r tĂ« parandaluar aksesin e paligjshĂ«m ose lansimin e paqĂ«llimshĂ«m
  • Çaktivizimi i regjistrimit tĂ« aksesit pĂ«r statikĂ«n dhe skedarĂ«t e fonteve
  • Caktimi i titullit Access-Control-Allow-Origin pĂ«r skedarĂ«t e fonteve
  • Shtimi i rrugĂ«zimit pĂ«r index.php dhe statikĂ« tjetĂ«r.

kodi i skriptit

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 e përdorur nga Certbot për 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\/;
    # Konfigurimi për Let's Encrypt
    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;
    # Cache proxy
    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;
    }

    # Ndalo çdo përpjekje për të hyrë në skedarë të fshehur si .htaccess, .htpasswd,
    # .DS_Store (Mac)
    # Mbani regjistrimin e kërkesave për t'i analizuar më vonë (ose për t'i kaluar në utilitetet e firewall-it
    # si fail2ban)
    location ~ \/. {
        deny all;
    }
    # Ndalo qasjen në çdo skedar me një zgjerim .php në drejtorinë e ngarkimeve;
    # funksionon në instalime në nën-drejtorinë dhe gjithashtu në rrjetin me shumë vende.
    # Mbani regjistrimin e kërkesave për t'i analizuar më vonë (ose për t'i kaluar në utilitetet e firewall-it
    # si fail2ban).
    location ~* \/(?:uploads|files)\/.*.php$ {
        deny all;
    }
    # WordPress: ndalo qasjen në skedarët PHP të wp-content, wp-includes
    location ~* ^\/(?:wp-content|wp-includes)\/.*.php$ {
        deny all;
    }
    # Ndalo aksesin publik në wp-config.php
    location ~* wp-config.php {
        deny all;
    }
    # Mos regjistro aksesin për asete statike, 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

Konfigurimi i Certbot pĂ«r certifikatat e Let’s Encrypt dhe rinovimi automatik i tyre

Certbot Ă«shtĂ« njĂ« mjet falas nga Electronic Frontier Foundation (EFF), me tĂ« cilin mund tĂ« merrni dhe tĂ« rinovoni automatikisht certifikatat TLS nga Let’s Encrypt. Skripti realizon veprimet e mĂ«poshtme pĂ«r tĂ« konfigurimi Certbot pĂ«r trajtimin e certifikatave nga Let’s Encrypt nĂ« NGINX:

  • Ndalon NGINX
  • Shkarkon parametrat e rekomanduar TLS
  • Nis Certbot pĂ«r tĂ« marrĂ« certifikatat pĂ«r sitin
  • Ri-nis NGINX pĂ«r tĂ« pĂ«rdorur certifikatave
  • Konfiguron ekzekutimin e pĂ«rditshĂ«m tĂ« Certbot nĂ« 3:24 tĂ« mĂ«ngjesit pĂ«r tĂ« kontrolluar nevojĂ«n pĂ«r rinovimin e certifikatave, gjithashtu, sipas nevojĂ«s, shkarkimin e certifikatave tĂ« reja dhe pĂ«rshtatjen e NGINX.

kodi i skriptit

echo " Duke ndaluar NGINX për të vendosur 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 " Shkarkimi i parametrave të rekomanduar TLS"
  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 "Nuk mund të shkarkohet versioni më i fundit i options-ssl-nginx.conf"
fi

if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
  echo " Shkarkimi i parametrave të rekomanduar TLS DH"
  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 "Nuk mund të shkarkohet versioni më i fundit i ssl-dhparams.pem"
fi

# Nëse tls_certs_init.sh nuk është ekzekutuar më parë, hiqni certifikatat e vetë-nënshkruara
if [ ! -d "/etc/letsencrypt/accounts" ]; then
  echo " Heqja e certifikatave të vetë-nënshkruara"
  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 " Gjenerimi i certifikatave me Let's Encrypt"
  certbot certonly --standalone 
         -m "${WORDPRESS_ADMIN_EMAIL}" 
         ${CERTBOT_STAGING_FLAG} 
         --agree-tos --force-renewal --non-interactive 
         -d "${TLS_HOSTNAME}"
fi

echo " Duke nisur NGINX për të përdorur konfigurimin e ri"
service nginx start

# Shkruani crontab për rinovimin periodik të certifikateve Let's Encrypt
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
  echo " Shtimi i certbot në crontab për rinovim automatik të Let's Encrypt"
  (crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -
fi

Konfigurime shtesë për uebsajtin tuaj

Më lart kemi folur për mënyrën se si skripti ynë konfiguronte NGINX dhe NGINX Unit për të mbështetur një sit në prodhim me TLS SSL të aktivizuar. Po ashtu, në varësi të nevojave tuaja, mund të shtoni në të ardhmen:

  • MbĂ«shtetje pĂ«r Brotli, kompresim i pĂ«rmirĂ«suar nĂ« flakĂ« pĂ«r HTTPS
  • ModSecurity me rregullat pĂ«r WordPress, pĂ«r tĂ« parandaluar sulmet automatike ndaj sitit tuaj
  • Backup pĂ«r WordPress, qĂ« i pĂ«rshtatet ju
  • Mbrojtje nĂ«pĂ«rmjet AppArmor (nĂ« Ubuntu)
  • Postfix ose msmtp, nĂ« mĂ«nyrĂ« qĂ« WordPress tĂ« mund tĂ« dĂ«rgojĂ« emaile
  • Kontrolloni faqen tuaj pĂ«r tĂ« kuptuar sa trafik mund tĂ« pĂ«rballojĂ«

Për një performancë edhe më të mirë të faqes, rekomandojmë kalimin në NGINX Plus, produktin tonë komercial të nivelit korporativ, i ndërtuar mbi NGINX me burim të hapur. Abonentët e tij do të fitojnë një moduli të ngarkuar dinamikisht Brotli, si dhe (me pagesë shtesë) NGINX ModSecurity WAF. Ne gjithashtu ofrojmë NGINX App Protect, modul WAF për NGINX Plus, i bazuar në teknologjinë më të avancuar të sigurisë nga F5.

Shënim: Për mbështetje për një faqe me ngarkesë të lartë, mund të kontaktoni specialistët Southbridge. Do të sigurojmë funksionimin e shpejtë dhe të besueshëm të faqes suaj ose shërbimit nën çdo ngarkesë.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster