
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 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 , 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 ( ili ), 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 , 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.

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 upgradeza 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 podatakaWORDPRESS_ADMIN_USER— korisničko ime administratora WordPressaWORDPRESS_ADMIN_PASSWORD— lozinka administratora WordPressaWORDPRESS_ADMIN_EMAIL— email administratora WordPressaWORDPRESS_URL— puni URL WordPress web stranice, počinjući odhttps://.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 varijabliWORDPRESS_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 datotekunginx.conf.CERT_DIR="\/etc\/letsencrypt\/live\/${TLS_HOSTNAME}"— putanja do certifikata Let’s Encrypt za WordPress stranicu, dobijena iz varijableTLS_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}"
fiDodavanje hostname-a u \/etc\/hosts
Dodatak 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
fiInstaliranje 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-releaseDodavanje 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
fiInstalacija 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-serverKonfiguracija 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 restartPostavljanje postavki baze podataka MariaDB za WordPress
Odabrali smo MariaDB umjesto MySQL-a zbog većeg pristupa zajednice, osim toga, ona možda (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 . 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
fiInstalacija 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
fiKonfiguracija 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/configPodeš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;
}
EOMPostavka 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 .
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;
EOMPostavka 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 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;
}
}
EOMPostavljanje Certbota za certifikate od Let’s Encrypt i njihovo automatsko obnavljanje
— 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 -
fiDodatno 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 , poboljšano komprimiranje u hodu preko HTTPS-a
- s , kako biste spriječili automatske napade na vašu web stranicu
- za WordPress, koji vam odgovara
- pomoću (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 , 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) . Također nudimo , 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 . Osigurat ćemo brzu i pouzdanu funkcionalnost vaše web stranice ili usluge pod bilo kojom opterećenjem.
Izvor: habr.com
