
Existuje množstvo materiálov na inštaláciu WordPressu, vyhľadávanie na Google pomocou kľúčových slov "WordPress inštalácia" poskytne približne pol milióna výsledkov. Avšak, v skutočnosti je medzi nimi veľmi málo užitočných príručiek, podľa ktorých je možné nainštalovať a nastaviť WordPress a podkladový operačný systém tak, aby boli schopné dlhodobej podpory. Možno, že správne nastavenia závisia silne od konkrétnych požiadaviek, alebo to súvisí s tým, že podrobné vysvetlenie robí článok ťažkým na čítanie.
V tomto článku sa pokúsime spojiť to najlepšie z oboch prístupov, poskytneme bash skript pre automatickú inštaláciu WordPressu na Ubuntu a tiež si ho prejdeme, vysvetľujúc, čo robí každý jeho kúsok a aké kompromisy sme pri jeho vývoji urobili. Ak ste skúsený používateľ, môžete preskočiť text článku a jednoducho na úpravy a použitie vo vašich prostrediach. Výsledkom skriptu je prispôsobiteľná inštalácia WordPressu so podporou Let's Encrypt, fungujúca na NGINX Unit a vhodná na priemyselné nasadenie.
Vyvinutá architektúra pre nasadenie WordPressu pomocou NGINX Unit je opísaná v teraz tiež dodatočne nastavíme veci, ktoré neboli pokryté (ako v mnohých iných návodov):
- WordPress CLI
- Let's Encrypt a certifikáty TLS/SSL
- Automatické obnovenie certifikátov
- NGINX caching
- NGINX kompresia
- Podpora HTTPS a HTTP/2
- Automatizácia procesu
V článku bude popísaná inštalácia na jednom serveri, na ktorom budú umiestnené súčasne server na spracovanie statických súborov, server na spracovanie PHP a databáza. Inštalácia s podporou viacerých virtuálnych hostiteľov a služieb je potenciálna téma na budúce. Chcete, aby sme napísali o niečom, čo nie je v týchto článkoch — napíšte nám do komentárov.
Požiadavky
- Kontajnerový server ( alebo ), virtuálny stroj, alebo bežný fyzický server, s minimálne 512 MB RAM a nainštalovaným Ubuntu 18.04 alebo novším.
- Prístupné z internetu porty 80 a 443
- Doménové meno priradené k verejnej IP adrese tohto servera
- Prístup s právami root (sudo).
Prehľad architektúry
Architektúra je rovnaká, ako bolo opísané , trojúrovňová webová aplikácia. Skladá sa zo skriptov PHP, ktoré sa vykonávajú na PHP spracovateľovi, a statických súborov, ktoré spracováva webový server.

Všeobecné princípy
- Mnohé príkazy na nastavenie v skripte sú obalené v podmienkach (if) pre idempotentnosť: skript je možné spustiť niekoľkokrát bez rizika zmeny nastavení, ktoré už boli pripravené.
- Skript sa snaží inštalovať softvér z repozitárov, takže môžete aplikovať aktualizácie systému jedným príkazom (
apt upgradepre Ubuntu). - Príkazy sa snažia určiť, že sa spúšťajú v kontejnery, aby zmenili svoje nastavenia príslušne.
- Aby sme určili počet spúšťaných procesov/vlákien v nastaveniach, skript sa pokúša uhádnuť automatické parametre nastavenia pre prácu v kontajneroch, virtuálnych strojoch a „hardvérových“ serveroch.
- Pri popisovaní nastavení vždy myslíme najprv na automatizáciu, ktorá sa, ako dúfame, stane základom pre vytvorenie vašej vlastnej infraštruktúry ako kódu.
- Všetky príkazy sa spúšťajú od používateľa root, pretože menia základné systémové nastavenia, ale samotný WordPress beží ako bežný používateľ.
Nastavenie premenných prostredia
Pred spustením skriptu nastavte nasledujúce premenné prostredia:
WORDPRESS_DB_PASSWORD— heslo k databáze WordPressWORDPRESS_ADMIN_USER— meno administrátora WordPressWORDPRESS_ADMIN_PASSWORD— heslo administrátora WordPressWORDPRESS_ADMIN_EMAIL— email administrátora WordPressWORDPRESS_URL— úplný URL webu WordPress, začínajúci shttps://.LETS_ENCRYPT_STAGING— predvolene prázdny, ale ak nastavíte hodnotu na 1, použijete staging servery Let’s Encrypt, ktoré sú potrebné na časté požiadanie certifikátov pri testovaní vašich nastavení, inak môže Let’s Encrypt dočasne zablokovať vašu ip adresu kvôli veľkému počtu požiadaviek.
Skript kontroluje, či sú tieto premenné súvisiace s WordPress nastavené, a ukončí prácu, ak nie sú.
Riadky skriptu 572-576 kontrolujú hodnotu LETS_ENCRYPT_STAGING.
Nastavenie odvozených premenných prostredia
Skript v riadkoch 55-61 nastavuje nasledujúce premenné prostredia, buď na nejakú pevne stanovenú hodnotu, alebo s použitím hodnoty získanej z premenných nastavených v predchádzajúcej časti:
DEBIAN_FRONTEND="noninteractive"— oznamuje aplikáciám, že sú spúšťané v skripte a nie je možné interagovať s používateľom.WORDPRESS_CLI_VERSION="2.4.0"— verzia aplikácie WordPress CLI.WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c"— kontrolná suma spustiteľného súboru WordPress CLI 2.4.0 (verzia sa uvádza v premennéWORDPRESS_CLI_VERSION). Skript na 162. riadku používa túto hodnotu na overenie, že bol stiahnutý správny súbor WordPress CLI.UPLOAD_MAX_FILESIZE="16M"— maximálna veľkosť súboru, ktorý môže byť nahraný do WordPress. Toto nastavenie sa používa na viacerých miestach, takže je jednoduchšie ho nastaviť na jednom mieste.TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'\/ ' -f3)"— hostname systému, ktorý sa extrahuje z premennej WORDPRESS_URL. Používa sa na získanie príslušných TLS/SSL certifikátov od Let’s Encrypt, ako aj na vnútorné overenie WordPress.NGINX_CONF_DIR="\/etc\/nginx"— cesta k adresáru s nastaveniami NGINX, vrátane hlavného súborunginx.conf.CERT_DIR="\/etc\/letsencrypt\/live\/${TLS_HOSTNAME}"— cesta k certifikátom Let’s Encrypt pre webovú stránku WordPress, získaná z premennejTLS_HOSTNAME.
Priradenie hostname WordPress serveru
Skript nastavuje hostname serveru, aby hodnota zodpovedala domenovému menu webu. To nie je povinné, ale je to pohodlnejšie pri odosielaní odchádzajúcej pošty cez SMTP pri nastavení jediného servera, ako to nastavuje skript.
kód skriptu
# 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}"
fiPridanie hostname do\/etc\/hosts
Doplnok sa používa na spúšťanie periodických úloh, vyžaduje, aby WordPress mohol získať prístup sám k sebe cez HTTP. Aby sa zabezpečilo, že WP-Cron funguje správne vo všetkých prostrediach, skript pridáva riadok do súboru /etc/hosts, takže WordPress môže získať prístup sám k sebe cez rozhranie loopback:
kód skriptu
# 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
fiInštalácia nástrojov potrebných pre ďalšie kroky
Zvyšná časť skriptu potrebujú niektoré programy a predpokladá sa, že repozitáre sú aktuálne. Aktualizujeme zoznam repozitárov a potom nainštalujeme potrebné nástroje:
kód skriptu
# 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-releasePridanie repozitárov NGINX Unit a NGINX
Skript inštaluje NGINX Unit a NGINX s otvoreným zdrojom z oficiálnych repozitárov NGINX, aby sa zabezpečilo, že sa používajú verzie s najnovšími aktualizáciami zabezpečenia a opravami chýb.
Skript pridáva repozitár NGINX Unit a potom - repozitár NGINX, pričom pridáva kľúč repozitárov a súbory nastavení apt, určené na poskytovanie prístupu k repozitárom cez internet.
Skutočná inštalácia NGINX Unit a NGINX prebieha v nasledujúcej sekcii. Najprv pridávame repozitáre, aby sme nemuseli niekoľkokrát aktualizovať metadáta, čo urýchľuje inštaláciu.
kód skriptu
# 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
fiInštalácia NGINX, NGINX Unit, PHP MariaDB, Certbot (Let’s Encrypt) a ich závislostí
Akonáhle sú všetky repozitáre pridané, aktualizujeme metadáta a inštalujeme aplikácie. Balíky inštalované skriptom tiež zahŕňajú odporúčané rozšírenia PHP pri spúšťaní WordPress.org
kód skriptu
echo " Aktualizácia metadát repozitára"
apt-get -qq update
# Inštalácia PHP so závislosťami a NGINX Unit
echo " Inštalácia PHP, NGINX Unit, NGINX, Certbot a 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-serverNastavenie PHP na použitie s NGINX Unit a WordPress
Skript vytvára konfiguračný súbor v adresári conf.d. Tu sa nastavuje maximálna veľkosť nahrávaných súborov pre PHP, zapína sa výstup chýb PHP do STDERR, aby sa zaznamenávali do denníka NGINX Unit, a reštartuje sa NGINX Unit.
kód skriptu
# 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 restartNastavenie databázových parametrov MariaDB pre WordPress
Vybrali sme MariaDB miesto MySQL, pretože má väčšiu komunítu a okrem toho (pravdepodobne, je to tu jednoduchšie: na inštaláciu MySQL treba pridať ďalší repozitár, pozn. prekladateľa).
Skript vytvára novú databázu a vytvára prihlasovacie údaje pre prístup k WordPress cez rozhranie loopback:
kód skriptu
# 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;"Inštalácia WordPress CLI
V tomto kroku skript inštaluje program . S jeho pomocou môžete inštalovať a spravovať nastavenia WordPress bez nutnosti manuálneho úpravy súborov, aktualizácie databázy alebo prihlásenia sa do administračnej oblasti. Taktiež s jeho pomocou môžete inštalovať témy a zásuvné moduly a vykonať aktualizáciu WordPress.
kód skriptu
if [ ! -f /usr/local/bin/wp ]; then
# Inštalácia WordPress CLI
echo " Inštalácia nástroja 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
fiInštalácia a konfigurácia WordPress
Skript inštaluje najnovšiu verziu WordPress do adresára /var/www/wordpress, a taktiež mení nastavenia:
- Pripojenie k databáze funguje cez unix domain socket miesto TCP na loopback, aby sa znížil TCP traffic.
- WordPress pridáva prefix https:// na URL, ak sa klienti pripájajú k NGINX cez protokol HTTPS a tiež odosiela vzdialený hostname (ako to poskytuje NGINX) do PHP. Používame kúsok kódu na jeho nastavenie.
- WordPress potrebuje HTTPS na prihlásenie
- Štruktúra URL je predvolene založená na zdrojoch
- Sú nastavené správne práva na súborovom systéme pre adresár WordPress.
kód skriptu
if [ ! -d /var/www/wordpress ]; then
# Vytvorenie adresárov pre WordPress
mkdir -p /var/www/wordpress
chown -R www-data:www-data /var/www
# Stiahnutie WordPress pomocou WordPress CLI
echo " Inštalujem WordPress"
su -s /bin/sh -c 'wp --path=/var/www/wordpress core download' www-data
WP_CONFIG_CREATE_CMD="wp --path=/var/www/wordpress config create --extra-php --dbname=wordpress --dbuser=wordpress --dbhost="localhost:/var/run/mysqld/mysqld.sock" --dbpass="${WORDPRESS_DB_PASSWORD}""
# Tento úryvok sa vkladá do súboru wp-config.php, keď sa vytvára;
# informuje WordPress, že sme za reverzným proxy a preto
# umožňuje generovať odkazy pomocou HTTPS
cat > /tmp/wp_forwarded_for.php << 'EOM'
/* Zapne HTTPS, ak HTTP_X_FORWARDED_PROTO zodpovedá '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
# Vytvorenie konfigurácie WordPressu
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
# Inštalácia WordPressu
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
# Nastavenie štruktúry permalinkov na rozumný predvolený formát, ktorý nie je v UI
su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data
# Odstránenie ukážkového súboru, pretože je to zbytočné a mohlo by to byť bezpečnostným problémom
rm /var/www/wordpress/wp-config-sample.php
# Zabezpečenie správnych oprávnení WordPressu
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
fiNastavenie NGINX Unit
Skript nastavuje NGINX Unit na spúšťanie PHP a spracovanie ciest WordPress, izoluje priestor názvov procesov PHP a optimalizuje nastavenia výkonu. Existujú tri funkcie, na ktoré by ste mali venovať pozornosť:
- Podpora priestorov názvov je definovaná podmienkou a je založená na kontrole spúšťania skriptu v kontajneri. Je to potrebné, pretože väčšina nastavení kontajnerov nepodporuje vnorené spúšťanie kontajnerov.
- Ak je podpora priestorov názvov, deaktivuje sa priestor názvov network. Je to potrebné na to, aby WordPress mohol zároveň pristupovať k koncovým bodom a byť dostupný na internete.
- Maximálny počet procesov sa určuje nasledovne: (Dostupná pamäť pre spustené MariaDB a NGINX Uniy) / (limit na operačnú pamäť v PHP + 5)
Táto hodnota sa nastavuje v konfiguráciách NGINX Unit.
Taktiež táto hodnota predpokladá, že sú vždy spustené aspoň dva procesy PHP, čo je dôležité, pretože WordPress vykonáva veľa asynchrónnych požiadaviek sám na seba. Bez dodatočných procesov spustenie, napríklad WP-Cron, zlyhá. Možno budete chcieť zvýšiť alebo znížiť tieto limity na základe vašich lokálnych nastavení, pretože tu vytvorené nastavenia sú konzervatívne. Na väčšine produkčných systémov sú nastavenia medzi 10 a 100.
kód skriptu
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 " Vypočítaný maximálny počet PHP procesov je ${MAX_PHP_PROCESSES}. Možno budete chcieť túto hodnotu doladiť kvôli variáciám vo vašej konfigurácii. Nie je nezvyčajné vidieť hodnoty medzi 10-100 v produkčných konfiguráciách."
echo " Konfigurácia NGINX Unit na použitie PHP a 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/configKonfigurácia NGINX
Konfigurácia základných parametrov NGINX
Skript vytvorí adresár pre cache NGINX a potom vytvorí základný konfiguračný súbor nginx.conf. Všimnite si počet spracovateľských procesov a zadanie maximálnej veľkosti súboru na nahrávanie. Taktiež je tu riadok, ktorý pripája súbor nastavení kompresie, definovaný v nasledujúcej časti, a ďalej nasledujú nastavenia cache.
kód skriptu
# 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;
}
EOMNastavenie kompresie NGINX
Kompresia obsahu naživo pred jeho odoslaním klientom je skvelý spôsob, ako zlepšiť výkon stránok, ale iba ak je kompresia správne nastavena. Táto časť skriptu je založená na nastaveniach .
kód skriptu
cat > ${NGINX_CONF_DIR}\/gzip_compression.conf << 'EOM'
# Kredit: https://github.com/h5bp/server-configs-nginx/
# ----------------------------------------------------------------------
# | Kompresia |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Povoliť gzip kompresiu.
# Predvolené: vypnuté
gzip on;
# Úroveň kompresie (1-9).
# 5 je dokonalý kompromis medzi veľkosťou a zaťažením CPU, ponúkajúci približne 75%
# zníženie pre väčšinu ASCII súborov (takmer identické s úrovňou 9).
# Predvolené: 1
gzip_comp_level 6;
# Nekomprimovať nič, čo je už malé a pravdepodobne sa neuskutoční veľa, ak vôbec
# (predvolené je 20 bajtov, čo je zlé, pretože to obvykle vedie k väčším
# súborom po gzippingu).
# Predvolené: 20
gzip_min_length 256;
# Komprimovať dáta aj pre klientov, ktorí sa k nám pripájajú cez proxy,
# identifikované hlavičkou „Via“ (vyžaduje sa pre CloudFront).
# Predvolené: vypnuté
gzip_proxied any;
# Povedz proxy, aby cachovali ako gzipped, tak aj pravidelnú verziu zdroja,
# kedykoľvek sa hlavička klientovej akceptácie kompresie líši;
# Zabraňuje problému, kde klient, ktorý nie je schopný gzip (čo je dnes mimoriadne zriedkavé)
# by zobrazil nezmysly, ak by ich proxy poskytlo gzipped verziu.
# Predvolené: vypnuté
gzip_vary on;
# Komprimovať všetok výstup označený jednou z nasledujúcich MIME typov.
# `text\/html` je vždy komprimovaný gzip modulom.
# Predvolené: 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;
EOMNastavenie NGINX pre WordPress
Ďalej skript vytvorí konfiguračný súbor pre WordPress default.conf v adresári conf.d. Tu sa nastavuje:
- Aktivácia certifikátov TLS získaných od Let’s Encrypt cez Certbot (jeho nastavenie bude v ďalšej časti)
- Nastavenie bezpečnostných parametrov TLS založené na odporúčaniach od Let’s Encrypt
- Pripojenie cache pre preskočené požiadavky na 1 hodinu predvolene
- Vypnutie prístupového a chybového záznamu, ak súbor neexistuje, pre dva často požadované súbory: favicon.ico a robots.txt
- Zákaz prístupu k skrytým súborom a niektorým súborom .php, aby sa predišlo nelegálnemu prístupu alebo náhodnému spusteniu
- Vypnutie protokolovania prístupu pre statické súbory a fonty
- Nastavenie hlavičky pre fonty
- Pridanie smerovania pre index.php a iné statické súbory.
kód skriptu
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-vyzva používaná Certbotom pre 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\/;
# Konfigurácia 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;
}
# Odmietnutie všetkých pokusov o prístup k skrytým súborom ako .htaccess, .htpasswd,
# .DS_Store (Mac)
# Uchovávať protokolovanie požiadaviek na neskoršie spracovanie (alebo na odovzdanie firewallovým nástrojom
# ako fail2ban)
location ~ \/. {
deny all;
}
# Odmietnuť prístup k súborom s príponou .php v adresári nahrávania;
# funguje v inštaláciách podadresára a aj v multi-site sieti.
# Uchovávať protokolovanie požiadaviek na neskoršie spracovanie (alebo na odovzdanie firewallovým nástrojom
# ako fail2ban).
location ~* \/(?:uploads|files)\/.php$ {
deny all;
}
# WordPress: odmietnuť prístup k PHP súborom wp-content, wp-includes
location ~* ^\/(?:wp-content|wp-includes)\/.php$ {
deny all;
}
# Odmietnuť verejný prístup k wp-config.php
location ~* wp-config.php {
deny all;
}
# Nezaznamenávať prístup k statickým súborom, médiám
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;
}
}
EOMNastavenie Certbot pre certifikáty od Let’s Encrypt a ich automatické predlžovanie
je bezplatný nástroj od Electronic Frontier Foundation (EFF), ktorý umožňuje získavať a automaticky aktualizovať certifikáty TLS od Let’s Encrypt. Skript vykonáva nasledujúce úkony, ktoré vedú k nastaveniu Certbot na spracúvanie certifikátov od Let’s Encrypt v NGINX:
- Zastaví NGINX
- Stiahne odporúčané parametre TLS
- Spustí Certbot, aby získal certifikáty pre stránku
- Reštartuje NGINX, aby mohol používať certifikáty
- Nastaví každodenné spúšťanie Certbot o 3:24 ráno na kontrolu potreby aktualizácie certifikátov a, ak je potrebné, stiahne nové certifikáty a reštartuje NGINX.
kód skriptu
echo " Zastavujem NGINX, aby sa nastavili certifikáty 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 " Stiahnutie odporúčaných parametrov 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 "Nepodarilo sa stiahnuť najnovšie options-ssl-nginx.conf"
fi
if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
echo " Stiahnutie odporúčaných TLS DH parametrov"
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 "Nepodarilo sa stiahnuť najnovšie ssl-dhparams.pem"
fi
# Ak skript tls_certs_init.sh ešte nebol spustený, odstráňte samopodpísané certifikáty
if [ ! -d "/etc/letsencrypt/accounts" ]; then
echo " Odstraňujem samopodpísané certifikáty"
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 " Generovanie certifikátov s Let's Encrypt"
certbot certonly --standalone
-m "${WORDPRESS_ADMIN_EMAIL}"
${CERTBOT_STAGING_FLAG}
--agree-tos --force-renewal --non-interactive
-d "${TLS_HOSTNAME}"
fi
echo " Spúšťam NGINX, aby sa použila nová konfigurácia"
service nginx start
# Zapísať crontab na pravidelnú obnovu certifikátu Let's Encrypt
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
echo " Pridávam certbot do crontabu pre automatickú obnovu Let's Encrypt"
(crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -
fiDodatočné nastavenie vašej stránky
Vyššie uvedené sme hovorili o tom, ako náš skript nastavuje NGINX a NGINX Unit na obsluhu stránky pripravené na používanie s aktivovaným TLS SSL. Môžete tiež, v závislosti od vašich potrieb, pridať v budúcnosti:
- Podporu , vylepšené kompresie na leto po HTTPS
- s , aby sa zabránilo automatickým útokom na vašu stránku
- pre WordPress, ktoré vám vyhovujú
- s pomocou (na Ubuntu)
- Postfix alebo msmtp, aby WordPress mohol posielať e-maily
- Kontroly vašej stránky, aby ste pochopili, koľko prevádzky môže vydržať
Pre ešte lepší výkon stránky odporúčame prechod na , náš komerčný produkt podnikovej úrovne založený na NGINX s otvoreným zdrojovým kódom. Jeho predplatitelia získajú dynamicky načítavateľný modul Brotli a (za príplatok) . Taktiež ponúkame , WAF modul pre NGINX Plus založený na technológii vedúcej v oblasti bezpečnosti od F5.
N.B. O pomoc s vysokonáročnou stránkou sa môžete obrátiť na odborníkov . Zabezpečíme rýchlu a spoľahlivú prevádzku vašej stránky alebo služby pod akoukoľvek záťažou.
Zdroj: habr.com
