Automatiziramo instalaciju WordPressa s NGINX Unit i Ubuntu

Automatiziramo instalaciju WordPressa s NGINX Unit i Ubuntu

Postoji mnogo materijala o instalaciji WordPressa, a pretraga na Googleu s ključnim riječima "WordPress install" prikazuje oko pola milijuna rezultata. Ipak, među njima je zapravo vrlo malo kvalitetnih vodiča koji omogućuju instalaciju i konfiguraciju WordPressa te operativnog sustava tako da budu sposobni za dugotrajnu podršku. Možda ispravne postavke uvelike ovise o specifičnim potrebama, ili je to povezano s tim što detaljno objašnjenje čini članak teškim za čitanje.

U ovom članku ćemo pokušati kombinirati najbolje od dva pristupa, pružiti bash skriptu za automatsku instalaciju WordPressa na Ubuntu, kao i proći kroz nju objašnjavajući što svaki njen dio radi, kao i o kojim smo kompromisima raspravljali prilikom njezine izrade. Ako ste iskusni korisnik — možete preskočiti tekst članka i samo uzeti skriptu za modifikaciju i korištenje u vašim okruženjima. Rezultat skripte je prilagodljiva instalacija WordPressa s podrškom za Lets Encrypt, koja radi na NGINX Unit i pogodna je za industrijsku primjenu.

Razvijena arhitektura za implementaciju WordPressa koristeći NGINX Unit opisana je u starijem članku, sada ćemo dodatno konfigurirati stvari koje tamo nisu obuhvaćene (kao i u mnogim drugim vodičima):

  • WordPress CLI
  • Lets Encrypt i TLS/SSL certifikati
  • Automatsko ažuriranje certifikata
  • NGINX keširanje
  • NGINX kompresija
  • Podrška za HTTPS i HTTP/2
  • Automatizacija procesa

U članku će biti opisana instalacija na jednom serveru, na kojem će biti smješteni poslužitelj za statički sadržaj, poslužitelj za PHP obradu i baza podataka. Instalacija s podrškom za više virtualnih hostova i usluga — potencijalna je tema za budućnost. Želite li da pišemo o nečemu što nema u ovim člancima — pišite u komentarima.

Zahtjevi

  • Server kontejner (LXC ili LXD), virtualna mašina ili obični fizički server, s najmanje 512MB radne memorije i instaliranom Ubuntuu 18.04 ili novijem.
  • Portovi 80 i 443 dostupni iz interneta
  • Domen, povezan s javnom IP adresom ovog servera
  • Pristup s root pravima (sudo).

Pregled arhitekture

Arhitektura je ista kao što je opisano ranije, trostupan web-aplikacija. Sastoji se od PHP skripti koje se izvršavaju na PHP poslužitelju i statičkih datoteka koje obrađuje web poslužitelj.

Automatiziramo instalaciju WordPressa s NGINX Unit i Ubuntu

Opšti principi

  • Mnogi naredbe za konfiguraciju u skripti su obavijene uvjetima (if) radi idempotentnosti: skriptu je moguće pokretati više puta bez rizika od promjene postavki koje su već postavljene.
  • Skripta pokušava instalirati softver iz repozitorija, tako da možete primijeniti ažuriranja sustava u jednoj naredbi (apt upgrade za Ubuntu).
  • Naredbe nastoje odrediti pokreću li se unutar kontejnera kako bi prilagodile svoje postavke u skladu s tim.
  • Da biste postavili broj pokrenutih procesa/nikada u konfiguracijama, skripta pokušava pogoditi automatske parametre postavki za rad u kontejnerima, virtualnim strojevima i 'hardverskim' poslužiteljima.
  • Kada opisujemo postavke, uvijek prvo razmišljamo o automatizaciji, koja će, nadamo se, postati temelj za izgradnju vaše vlastite infrastrukture kao koda.
  • Sve naredbe izvršavaju se od korisnika root, jer mijenjaju osnovne sistemske postavke, ali sam WordPress radi kao obični korisnik.

Podešavanje varijabli okruženja

Postavite sljedeće varijable okruženja prije nego što pokrenete skriptu:

  • WORDPRESS_DB_PASSWORD — lozinka za WordPress bazu podataka
  • WORDPRESS_ADMIN_USER — korisničko ime administratora WordPressa
  • WORDPRESS_ADMIN_PASSWORD — lozinka administratora WordPressa
  • WORDPRESS_ADMIN_EMAIL — email administratora WordPressa
  • WORDPRESS_URL — puni URL WordPress web stranice, počinjući od https://.
  • LETS_ENCRYPT_STAGING — prazno po defaultu, ali postavljanjem vrijednosti na 1, koristit ćete staging poslužitelje Let’s Encrypt, potrebne za česte zahtjeve za certifikatima prilikom testiranja vaših postavki, inače Let’s Encrypt može privremeno blokirati vašu IP adresu zbog velike količine zahtjeva.

Skripta provjerava jesu li ove varijable povezane s WordPress-om postavljene i završava rad ako nisu.
Redci skripte 572-576 provjeravaju vrijednost LETS_ENCRYPT_STAGING.

Postavljanje izvedenih varijabli okruženja

Skripta u redcima 55-61 postavlja sljedeće varijable okruženja, ili na neku fiksnu vrijednost, ili korištenjem vrijednosti dobivenih iz varijabli postavljenih u prethodnom odjeljku:

  • DEBIAN_FRONTEND="noninteractive" — obavještava aplikacije da se pokreću u skripti i da nema mogućnosti interakcije s korisnikom.
  • WORDPRESS_CLI_VERSION="2.4.0" — verzija aplikacije WordPress CLI.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" — kontrolna suma izvršne datoteke WordPress CLI 2.4.0 (verzija se navodi u varijabli WORDPRESS_CLI_VERSION). Skript na 162. liniji koristi ovu vrijednost za provjeru da li je preuzeta ispravna datoteka WordPress CLI.
  • UPLOAD_MAX_FILESIZE="16M" — maksimalna veličina datoteke koja se može prenijeti u WordPress. Ova postavka se koristi na nekoliko mjesta, tako da je jednostavnije definirati je na jednom mjestu.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'\/' -f3)" — hostname sustava, izvučen iz varijable WORDPRESS_URL. Koristi se za dobivanje odgovarajućih TLS/SSL certifikata od Let’s Encrypt, a također i za internu provjeru WordPress-a.
  • NGINX_CONF_DIR="\/etc\/nginx" — putanja do direktorija s postavkama NGINX, uključujući glavni datoteku nginx.conf.
  • CERT_DIR="\/etc\/letsencrypt\/live\/${TLS_HOSTNAME}" — putanja do certifikata Let’s Encrypt za WordPress stranicu, dobijena iz varijable TLS_HOSTNAME.

Dodjeljivanje hostname-a WordPress serveru

Skript postavlja hostname serveru kako bi se vrijednost slagala s imenom domene stranice. To nije obavezno, ali olakšava slanje izlazne pošte putem SMTP-a kada se postavlja jedinstveni server, kako to skript postavlja.

kod skripta

# 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

Dodavanje hostname-a u \/etc\/hosts

Dodatak WP‑Cron koristi se za pokretanje periodičnih zadataka, zahtijeva da WordPress može pristupiti samom sebi putem HTTP-a. Kako bi se osiguralo da WP-Cron ispravno funkcioniše u svim okruženjima, skript dodaje liniju u datoteku /etc/hosts, kako bi WordPress mogao pristupiti samom sebi putem loopback interfejsa:

kod skripta

# 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

Instaliranje alata potrebnih za sljedeće korake

Preostali dio skripta zahtijeva neke programe i podrazumijeva da su repozitoriji ažurirani. Ažuriramo popis repozitorija, nakon čega instaliramo potrebne alate:

kod skripta

# 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

Dodavanje repozitorija NGINX Unit i NGINX

Skript instalira NGINX Unit i NGINX sa otvorenim kodom iz službenih repozitorija NGINX kako bi se osiguralo da su korištene verzije sa najnovijim sigurnosnim ažuriranjima i ispravkama grešaka.

Skript dodaje repozitorij NGINX Unit, a zatim — repozitorij NGINX, dodajući ključeve repozitorija i datoteke postavki apt, koje definiraju pristup repozitorijima putem interneta.

Instalacija NGINX Unit i NGINX odvija se u sljedećem odjeljku. Prvo dodajemo repozitorije kako bismo izbjegli višestruko ažuriranje metapodataka, što ubrzava instalaciju.

kod skripta

# 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

Instalacija NGINX, NGINX Unit, PHP MariaDB, Certbot (Let’s Encrypt) i njihovih ovisnosti

Kada su svi repozitoriji dodani, ažuriramo metapodatke i instaliramo aplikacije. Paketi koje skripta instalira također uključuju PHP ekstenzije preporučene prilikom instalacije WordPress.org

kod skripta

echo " Ažuriranje metapodataka repozitorija"
apt-get -qq update

# Instalirajte PHP s ovisnostima i NGINX Unit
echo " Instalacija PHP, NGINX Unit, NGINX, Certbot i 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

Konfiguracija PHP za korištenje s NGINX Unit i WordPressom

Skripta stvara datoteku s postavkama u direktoriju conf.d. Ovde se postavlja maksimalna veličina učitanih datoteka za PHP, uključuje ispis PHP grešaka u STDERR, tako da će biti zapisane u dnevnik NGINX Unit, kao i ponovno pokreće NGINX Unit.

kod skripta

# 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

Postavljanje postavki baze podataka MariaDB za WordPress

Odabrali smo MariaDB umjesto MySQL-a zbog većeg pristupa zajednice, osim toga, ona možda pruža bolju performansu prema zadanim postavkama (vjerojatno, ovde je sve jednostavnije: za instalaciju MySQL-a potrebno je dodati još jedan repozitorij, napomena prevoditelja).

Skripta stvara novu bazu podataka i kreira akreditivne podatke za pristup WordPressu putem loopback sučelja:

kod skripta

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

Instalacija WordPress CLI-a

U ovom koraku skripta instalira program WP-CLI. Uz njegovu pomoć možete instalirati i upravljati postavkama WordPress-a bez potrebe za ručnim uređivanjem datoteka, ažuriranjem baze ili prijavljivanjem na upravljačku ploču. Također, možete instalirati teme i dodatke i izvršiti ažuriranje WordPress-a.

kod skripta

if [ ! -f /usr/local/bin/wp ]; then
  # Instaliraj WordPress CLI
  echo " Instalacija WordPress CLI alata"
  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

Instalacija i konfiguracija WordPress-a

Skripta instalira najnoviju verziju WordPress-a u direktorij /var/www/wordpress, kao i mijenja postavke:

  • Povezivanje s bazom podataka radi preko unix domain socket umjesto TCP na loopback, kako bi se smanjio TCP promet.
  • WordPress dodaje prefiks https:// URL-u, ako se klijenti povezuju s NGINX-om putem HTTPS protokola, i također proslijeđuje udaljeni hostname (kako to pruža NGINX) u PHP. Primjenjujemo komadić koda za ovu konfiguraciju.
  • WordPress zahtijeva HTTPS za prijavu
  • Struktura URL-a prema zadanim postavkama temelji se na resursima
  • Postavljaju se ispravna prava na datotečnom sustavu za WordPress direktorij.

kod skripta

if [ ! -d /var/www/wordpress ]; then
  # Kreirajte WordPress direktorije
  mkdir -p /var/www/wordpress
  chown -R www-data:www-data /var/www

  # Preuzmite WordPress koristeći WordPress CLI
  echo " Instaliranje WordPress-a"
  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}'"

  # Ovaj isječak se umetne u wp-config.php datoteku kada se kreira;
  # obavještava WordPress da smo iza reverznog proxy-a i kao takav
  # omogućuje mu generiranje poveznica koristeći HTTPS
  cat > /tmp/wp_forwarded_for.php << 'EOM'
/* Uključite HTTPS 'uključeno' ako HTTP_X_FORWARDED_PROTO odgovara '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

  # Kreirajte WordPress konfiguraciju
  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

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

  # Postavite strukturu permalinks-a na razumnu zadanu vrijednost koja nije u UI-u
  su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data

  # Uklonite uzorak datoteku jer je to nepotrebno i može predstavljati sigurnosni problem
  rm /var/www/wordpress/wp-config-sample.php

  # Osigurajte da su WordPress dozvole ispravne
  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

Konfiguracija NGINX Unita

Skripta postavlja NGINX Unit za pokretanje PHP-a i obradu WordPress putanja, izolirajući imensko područje PHP procesa i optimizirajući postavke performansi. Ovdje su tri funkcije na koje treba obratiti pažnju:

  • Podrška za imenska područja određuje se na temelju uvjeta, temelji se na provjeri pokretanja skripte unutar kontejnera. To je potrebno, jer većina postavki kontejnera ne podržava ugniježdeno pokretanje kontejnera.
  • Ako postoji podrška za imenska područja, isključuje se imensko područje mreža. To je potrebno kako bi WordPress mogao istovremeno povezati i s endpoints i biti dostupan na internetu.
  • Maksimalan broj procesa određuje se na sljedeći način: (Dostupna memorija za pokrenute MariaDB i NGINX Uniy)/(ograničenje radne memorije u PHP-u + 5)
    Ova vrijednost se postavlja u postavkama NGINX Unita.

Ova vrijednost podrazumijeva da uvijek postoji barem dva pokrenuta PHP procesa, što je važno jer WordPress vrši mnogo asinkronih zahtjeva prema sebi, a bez dodatnih procesa izvršavanje, na primjer, WP-Crona, neće raditi. Možda ćete htjeti povećati ili smanjiti ova ograničenja, ovisno o vašim lokalnim postavkama, jer su postavke ovdje konzervativne. Na većini proizvodnih sustava postavke se kreću između 10 i 100.

kod skripta

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 " Izračunato maksimalno broj PHP procesa kao ${MAX_PHP_PROCESSES}. Možda biste htjeli prilagoditi ovu vrijednost zbog varijacija u vašoj konfiguraciji. Nije neobično vidjeti vrijednosti između 10-100 u proizvodnim konfiguracijama."

echo " Konfiguriranje NGINX Unita za korištenje PHP-a i WordPress-a"
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

Podešavanje NGINX-a

Postavljanje osnovnih parametara NGINX-a

Skript stvara direktorij za NGINX predmemoriju, a zatim stvara osnovnu datoteku konfiguracije nginx.conf. Obratite pažnju na broj procesa-obrtnika i postavite maksimalnu veličinu datoteke za učitavanje. Također postoji redak koji povezuje datoteku za postavke kompresije, određenu u sljedećem odjeljku, a zatim slijede postavke keširanja.

kod skripta

# 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

Postavka kompresije NGINX

Kompresija sadržaja u hodu prije slanja klijentima odličan je način za poboljšanje performansi web stranice, ali samo ako je kompresija ispravno postavljena. Ovaj odjeljak skripte temelji se na postavkama odavde.

kod skripta

cat > ${NGINX_CONF_DIR}\/gzip_compression.conf << 'EOM'
# Zasluga: https:\/\/github.com\/h5bp\/server-configs-nginx\/
# ----------------------------------------------------------------------
# | Kompresija                                                        |
# ----------------------------------------------------------------------
# https:\/\/nginx.org\/en\/docs\/http\/ngx_http_gzip_module.html
# Omogućite gzip kompresiju.
# Zadano: isključeno
gzip on;
# Razina kompresije (1-9).
# 5 je savršen kompromis između veličine i korištenja CPU-a, nudeći oko 75%
# smanjenja za većinu ASCII datoteka (gotovo identično razini 9).
# Zadano: 1
gzip_comp_level 6;
# Ne komprimirajte ništa što je već malo i malo je vjerojatno da će se smanjiti ako uopće (zadano je 20 bajtova, što je loše jer obično dovodi do većih
# datoteka nakon gzippinga).
# Zadano: 20
gzip_min_length 256;
# Komprimirajte podatke čak i za klijente koji se povezuju s nama putem proxyja,
# identifikovanih kroz zaglavlje "Via" (potrebno za CloudFront).
# Zadano: isključeno
gzip_proxied any;
# Recite proxyjima da keširaju i gzipped i redovnu verziju resursa
# kada varira zaglavlje klijenta "Accept-Encoding";
# Izbjegava problem gdje klijenti koji ne podržavaju gzip (što je izuzetno rijetko
# danas) prikazuju neprikladan tekst ako im njihov proxy da gzipped verziju.
# Zadano: isključeno
gzip_vary on;
# Komprimirajte sav izlaz označen jednim od sljedećih MIME-tipa.
# `text\/html` se uvijek komprimira preko gzip modula.
# Zadano: 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

Postavka NGINX za WordPress

Dalje, skripta stvara datoteku za postavke za WordPress default.conf u direktoriju conf.d. Ovdje se podešava:

  • Aktivacija TLS certifikata dobivenih putem Let’s Encrypt putem Certbota (njegova postavka bit će u sljedećem dijelu)
  • Postavljanje sigurnosnih TLS parametara temelji se na preporukama Let’s Encrypt
  • Povezivanje keširanja za ponavljajuće zahtjeve na 1 sat po zadanim postavkama
  • Onemogućavanje zapisivanja pristupa, kao i zapisivanja grešaka, ako datoteka nije pronađena, za dva često tražena datoteke: favicon.ico i robots.txt
  • Onemogućavanje pristupa skrivenim datotekama i nekim drugim datotekama .php, kako bi se spriječio neovlašteni pristup ili nenamjerno pokretanje
  • Isključivanje logiranja pristupa za statiku i datoteke s fontovima
  • Postavljanje zaglavlja Access-Control-Allow-Origin za datoteke s fontovima
  • Dodavanje rutiranja za index.php i ostalu statiku.

kod skripta

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 koji koristi Certbot za 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\/;
    # Konfiguracija za 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;
    # 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;
    }

    # Onemogućiti sve pokušaje pristupa skrivenim datotekama poput .htaccess, .htpasswd,
    # .DS_Store (Mac)
    # Držite logove zahtjeva za kasnije analiziranje (ili za prosljeđivanje firewall alatima
    # poput fail2ban)
    location ~ \/. {
        deny all;
    }
    # Onemogućiti pristup bilo kojim datotekama s ekstenzijom .php u direktoriju za upload;
    # radi u instalacijama s poddirektorijima i također u višekorisničkoj mreži.
    # Držite logove zahtjeva za kasnije analiziranje (ili za prosljeđivanje firewall alatima
    # poput fail2ban).
    location ~* \/(?:uploads|files)\/.*.php$ {
        deny all;
    }
    # WordPress: onemogućiti pristup PHP datotekama u wp-content, wp-includes
    location ~* ^\/(?:wp-content|wp-includes)\/.*.php$ {
        deny all;
    }
    # Onemogućiti javni pristup wp-config.php
    location ~* wp-config.php {
        deny all;
    }
    # Ne logirati pristup za statičke resurse, medije
    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

Postavljanje Certbota za certifikate od Let’s Encrypt i njihovo automatsko obnavljanje

Certbot — besplatan alat od Electronic Frontier Foundation (EFF) koji omogućava dobivanje i automatsko ažuriranje TLS certifikata od Let’s Encrypt. Skripta izvršava sljedeće radnje, koje dovode do postavljanja Certbota za obradu certifikata od Let’s Encrypt u NGINX-u:

  • Stopira NGINX
  • Preuzima preporučene TLS parametre
  • Pokreće Certbot kako bi dobio certifikate za web stranicu
  • Ponovno pokreće NGINX kako bi koristio certifikate
  • Postavlja dnevno pokretanje Certbota u 3:24 ujutro za provjeru potrebe za obnavljanjem certifikata, te, po potrebi, preuzimanje novih certifikata i ponovno pokretanje NGINX-a.

kod skripta

echo " Stopping NGINX in order to set up Let's Encrypt"
service nginx stop

mkdir -p /var/www/certbot
chown www-data:www-data /var/www/certbot
chmod g+s /var/www/certbot

if [ ! -f ${NGINX_CONF_DIR}/options-ssl-nginx.conf ]; then
  echo " Downloading recommended TLS parameters"
  curl --retry 6 -Ls -z "Tue, 14 Apr 2020 16:36:07 GMT" 
    -o "${NGINX_CONF_DIR}/options-ssl-nginx.conf" 
    "https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf" 
    || echo "Couldn't download latest options-ssl-nginx.conf"
fi

if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
  echo " Downloading recommended TLS DH parameters"
  curl --retry 6 -Ls -z "Tue, 14 Apr 2020 16:49:18 GMT" 
    -o "${NGINX_CONF_DIR}/ssl-dhparams.pem" 
    "https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem" 
    || echo "Couldn't download latest ssl-dhparams.pem"
fi

# If tls_certs_init.sh hasn't been run before, remove the self-signed certs
if [ ! -d "/etc/letsencrypt/accounts" ]; then
  echo " Removing self-signed certificates"
  rm -rf "${CERT_DIR}"
fi

if [ "" = "${LETS_ENCRYPT_STAGING:-}" ] || [ "0" = "${LETS_ENCRYPT_STAGING}" ]; then
  CERTBOT_STAGING_FLAG=""
else
  CERTBOT_STAGING_FLAG="--staging"
fi

if [ ! -f "${CERT_DIR}/fullchain.pem" ]; then
  echo " Generating certificates with Let's Encrypt"
  certbot certonly --standalone 
         -m "${WORDPRESS_ADMIN_EMAIL}" 
         ${CERTBOT_STAGING_FLAG} 
         --agree-tos --force-renewal --non-interactive 
         -d "${TLS_HOSTNAME}"
fi

echo " Starting NGINX in order to use new configuration"
service nginx start

# Write crontab for periodic Let's Encrypt cert renewal
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
  echo " Adding certbot to crontab for automatic Let's Encrypt renewal"
  (crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -
fi

Dodatno postavljanje vaše web stranice

Gore smo opisali kako naš skript postavlja NGINX i NGINX Unit za posluživanje web stranice spremne za industrijske potrebe s uključenim TLS SSL-om. Također možete, ovisno o vašim potrebama, dodati u budućnosti:

  • Podršku Brotli, poboljšano komprimiranje u hodu preko HTTPS-a
  • ModSecurity s s pravilima za WordPress, kako biste spriječili automatske napade na vašu web stranicu
  • Sigurnosna kopija za WordPress, koji vam odgovara
  • Zaštitu pomoću AppArmor (na Ubuntu)
  • Postfix ili msmtp, kako bi WordPress mogao slati e-poštu
  • Provjere vaše web stranice kako biste razumjeli koliko prometa može izdržati

Za još bolju učinkovitost web stranice preporučujemo da nadogradite na NGINX Plus, naš komercijalni proizvod korporativnog nivoa, temeljen na NGINX-u s otvorenim kodom. Njegovi pretplatnici dobit će dinamički učitani modul Brotli, kao i (uz dodatnu naknadu) NGINX ModSecurity WAF. Također nudimo NGINX App Protect, WAF modul za NGINX Plus, temeljen na tehnologiji tržišnog lidera u sigurnosti od F5.

Napomena. Za podršku visokopropusnoj web stranici možete se obratiti stručnjacima Southbridge. Osigurat ćemo brzu i pouzdanu funkcionalnost vaše web stranice ili usluge pod bilo kojom opterećenjem.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster