
Obstaja veliko gradiv za namestitev WordPressa, iskanje po Googlu z ključnimi besedami "WordPress install" pa bo dalo okoli pol milijona rezultatov. Vendar pa dejansko med njimi ni veliko kvalitetnih vodičev, s katerimi bi lahko namestili in nastavili WordPress ter spodnjo operacijsko sistema, da bi bila sposobna dolgoročne podpore. Morda so pravilne nastavitve zelo odvisne od specifičnih potreb ali pa je to povezano s tem, da podrobna razlaga naredi članek težak za branje.
V tem članku se bomo potrudili združiti najboljše iz dveh pristopov, tako da bomo ponudili bash skripto za samodejno namestitev WordPressa na Ubuntu in jo tudi podrobno obravnavali, razlagali, kaj vsak njen del počne, ter na katere kompromise smo privolili pri njeni izdelavi. Če ste izkušen uporabnik, lahko preskočite besedilo članka in preprosto za prilagoditev in uporabo v vaših okoljih. Rezultat skripte je prilagodljiva namestitev WordPressa s podporo za Lets Encrypt, ki deluje na NGINX Unit in je primerna za industrijsko rabo.
Razvita arhitektura za razporejanje WordPressa z uporabo NGINX Unit je opisana v , zdaj bomo dodatno nastavili stvari, ki tam niso bile obravnavane (kot tudi v mnogih drugih vodičih):
- WordPress CLI
- Let’s Encrypt in TLS/SSL certifikati
- Samodejno posodabljanje certifikatov
- Caching NGINX
- Stiskanje NGINX
- Podpora za HTTPS in HTTP/2
- Avtomatizacija procesa
V članku bo opisana namestitev na enem strežniku, na katerem bosta istočasno gostita strežnik za statična priporočila, strežnik za obdelavo PHP in podatkovna baza. Namestitev s podporo za več virtualnih gostiteljev in storitev je potencialna tema za prihodnost. Želite, da napišemo o nečem, kar v teh člankih ni, pišite v komentarjih.
Zahteve
- Strežnik-kontejner ( ili ), virtualna mašina ali običajen fizični strežnik, z vsaj 512 MB RAM-a in nameščenim Ubuntu 18.04 ali novejšim.
- Dostopni iz interneta na vratih 80 in 443
- Domeno, povezano s javnim IP naslovom tega strežnika
- Dostop z root pravicami (sudo).
Pregled arhitekture
Arhitektura je enaka, kot je bilo opisano , триурівневе веб-додаток. Воно складається зі скриптів PHP, які виконуються на обробнику PHP, та статичних файлів, що обробляються веб-сервером.

Загальні принципи
- Багато команд для налаштування в скрипті обгорнуті в умови (if) для ідемпотентності: скрипт можна запускати кілька разів без ризику зміни налаштувань, які вже готові.
- Скрипт намагається встановлювати ПЗ з репозиторіїв, так що ви можете застосовувати оновлення системи в одну команду (
apt upgradeдля Ubuntu). - Команди намагаються визначити, що вони запускаються в контейнері, щоб змінити відповідно свої налаштування.
- Щоб задати число запущених процесів/потоків у налаштуваннях, скрипт намагається вгадати автоматичні параметри налаштування для роботи в контейнерах, віртуальних машинах, «залізних» серверах.
- При описанні налаштувань завжди думаємо в першу чергу про автоматизацію, яка, як ми сподіваємося, стане основою для створення вашої власної інфраструктури як коду.
- Усі команди запускаються від користувача root, оскільки вони змінюють основні системні налаштування, але безпосередньо WordPress працює від звичайного користувача.
Встановлення змінних середовища
Встановіть наступні змінні середовища перед запуском скрипта:
WORDPRESS_DB_PASSWORD— пароль до бази даних WordPressWORDPRESS_ADMIN_USER— ім'я адміністратора WordPressWORDPRESS_ADMIN_PASSWORD— пароль адміністратора WordPressWORDPRESS_ADMIN_EMAIL— email адміністратора WordPressWORDPRESS_URL— повний URL сайту WordPress, починаючи зhttps://.LETS_ENCRYPT_STAGING— пустий за замовчуванням, але, встановивши значення в 1, ви будете використовувати staging сервери Let’s Encrypt, необхідні для частого запиту сертифікатів при тестуванні ваших налаштувань, інакше Let’s Encrypt може тимчасово заблокувати вашу IP-адресу через велику кількість запитів.
Скрипт перевіряє, що ці змінні, пов'язані з WordPress, виставлені, і завершує роботу, якщо ні.
Рядки скрипта 572-576 перевіряють значення LETS_ENCRYPT_STAGING.
Встановлення похідних змінних середовища
Скрипт у рядках 55-61 виставляє наступні змінні середовища, або в деяке жорстко задане значення, або з використанням значення, отриманого з змінних, встановлених у попередньому розділі:
DEBIAN_FRONTEND="noninteractive"— obveščanje aplikacij, da se zaženejo v skripti in da ni možnosti interakcije z uporabnikom.WORDPRESS_CLI_VERSION="2.4.0"— različica aplikacije WordPress CLI.WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c"— kontrolna vsota izvršne datoteke WordPress CLI 2.4.0 (različica je navedena v spremenljivkiWORDPRESS_CLI_VERSION). Skript na 162. vrstici to vrednost uporablja za preverjanje, ali je bila prenesena pravilna datoteka WordPress CLI.UPLOAD_MAX_FILESIZE="16M"— največja velikost datoteke, ki jo je mogoče naložiti v WordPress. Ta nastavitve se uporablja na več mestih, zato je lažje nastaviti jo na enem mestu.TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'\/ -f3)"— ime gostitelja sistema, pridobljeno iz spremenljivke WORDPRESS_URL. Uporablja se za pridobitev ustreznih TLS/SSL certifikatov od Let’s Encrypt, prav tako pa za interno preverjanje WordPressa.NGINX_CONF_DIR="\/etc\/nginx"— pot do imenika s konfiguracijami NGINX, vključno z glavno datotekonginx.conf.CERT_DIR="\/etc\/letsencrypt\/live\/${TLS_HOSTNAME}"— pot do certifikatov Let’s Encrypt za spletno mesto WordPress, pridobljeno iz spremenljivkeTLS_HOSTNAME.
Nastavitev imena gostitelja za WordPress strežnik
Skript nastavi ime gostitelja strežniku, da se vrednost ujema z domeno spletnega mesta. To ni obvezno, a naredi pošiljanje izhodne pošte preko SMTP lažje pri nastavitvi enega samega strežnika, kot je nastavljen s skriptom.
koda 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}"
fiDodajanje imena gostitelja v \/etc\/hosts
Dodatek se uporablja za izvajanje periodičnih nalog in zahteva, da WordPress dostopa sam sebe prek HTTP. Da bi zagotovili, da WP-Cron deluje pravilno v vseh okoljih, skript doda vrstico v datoteko /etc/hosts, tako da lahko WordPress dostopa sam sebi prek vmesnika loopback:
koda 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
fiNamestitev potrebnih orodij za naslednje korake
Preostali del skripta zahteva nekatere programe in predpostavlja, da so repozitoriji posodobljeni. Posodobimo seznam repozitorijev, po čemer namestimo potrebna orodja:
koda 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-releaseDodajanje repozitorijev NGINX Unit in NGINX
Skript namesti NGINX Unit in NGINX iz uradnih repozitorijev NGINX, da se prepriča, da so uporabljene različice z najnovejšimi varnostnimi posodobitvami in popravki napak.
Skript doda repozitorij NGINX Unit, nato — repozitorij NGINX, dodaja ključe repozitorijev in datoteke nastavitev apt, ki določajo dostop do repozitorijev prek interneta.
Prava namestitev NGINX Unit in NGINX poteka v naslednjem razdelku. Vnaprej dodamo repozitorije, da ne bomo večkrat posodabljali metapodatkov, kar namestitev pospeši.
koda 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
fiNamestitev NGINX, NGINX Unit, PHP MariaDB, Certbot (Let’s Encrypt) in njihovih odvisnosti
Ko so vsi repozitoriji dodani, posodobimo metapodatke in namestimo aplikacije. Paketi, ki jih skripta namesti, vključujejo tudi priporočena PHP razširitev za zagon WordPress.org.
koda skripta
echo " Posodabljam metapodatke repozitorija"
apt-get -qq update
# Namestitev PHP s odvisnostmi in NGINX Unit
echo " Namestitev PHP, NGINX Unit, NGINX, Certbot in 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-serverNastavitev PHP za uporabo z NGINX Unit in WordPress
Skripta ustvari konfiguracijsko datoteko v imeniku conf.d. Tukaj določamo največjo velikost nalaganih datotek za PHP, vklopimo izpis napak PHP v STDERR, tako da bodo zapisane v dnevnik NGINX Unit, prav tako pa ponovno zaženemo NGINX Unit.
koda 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 restartNastavitev podatkovne baze MariaDB za WordPress
Izbrali smo MariaDB namesto MySQL, ker ima več aktivne skupnosti, poleg tega pa (Verjetno je tu vse enostavnejše: za namestitev MySQL je potrebno dodati še en repozitorij, op. prevajalca).
Skripta ustvari novo podatkovno bazo in ustvari poverilnice za dostop WordPress preko loopback vmesnika:
koda 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;"Namestitev programa WordPress CLI
V tem koraku skripta namesti program . Z njegovo pomočjo lahko namestite in upravljate nastavitve WordPress brez potrebe po ročnem urejanju datotek, posodabljanju baze ali prijavi v upravljalsko ploščo. Z njegovo pomočjo lahko tudi namestite teme in dodatke ter izvedete posodobitev WordPressa.
koda skripta
if [ ! -f /usr/local/bin/wp ]; then
# Namestitev orodja WordPress CLI
echo " Namestitev orodja 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
fiNamestitev in nastavitev WordPress
Skripta namesti najnovejšo različico WordPressa v imenik /var/www/wordpress, prav tako pa spremeni nastavitve:
- Povezava s podatkovno bazo deluje preko unix domennega vtičnika namesto TCP na loopback, da se zmanjša TCP promet.
- WordPress doda predpono https:// za URL, ako se klijenti povezuju sa NGINX-om putem HTTPS protokola i šalje udaljeni hostname (kako ga NGINX pruža) u PHP. Primjenjujemo komad koda kako bismo to postavili.
- WordPress zahteva HTTPS za prijavu
- Struktura URL-a se po defaultu oslanja na resurse
- Postavljaju se ispravna prava na datotečnom sistemu za WordPress direktorij.
koda skripta
if [ ! -d /var/www/wordpress ]; then
# Kreiraj WordPress direktorije
mkdir -p /var/www/wordpress
chown -R www-data:www-data /var/www
# Preuzmi 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 deo se ubacuje u wp-config.php datoteku kada se kreira;
# informiše WordPress da smo iza reverznog proksija i kao takav
# omogućava mu da generiše linkove koristeći HTTPS
cat > /tmp/wp_forwarded_for.php << 'EOM'
/* Uključite HTTPS 'on' 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
# Kreiraj 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 trajnih linkova na razuman podrazumevani koji nije u UI
su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data
# Uklonite uzorak datoteku jer predstavlja smeće i može biti bezbednosni problem
rm /var/www/wordpress/wp-config-sample.php
# Osigurajte da su WordPress prava ispravna
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
fiPodešavanje NGINX Unit
Skripta podešava NGINX Unit za pokretanje PHP-a i obradu WordPress puteva, izolirajući prostor imena PHP procesa i optimizujući postavke performansi. Postoje tri funkcije na koje treba obratiti pažnju:
- Podrška za prostore imena se definiše uslovom, zasniva se na proveri pokretanja skripte u kontejneru. Ovo je potrebno jer većina podešavanja kontejnera ne podržava ugnježdene kontejneri.
- Ako postoji podrška za prostore imena, prostor imena se isključuje mreža. Ovo je potrebno kako bi WordPress mogao istovremeno da se povezuje i sa endpoint-ima i da bude dostupan na internetu.
- Največje število procesov se določi na naslednji način: (Razpoložljiva pomnilnika za zagnane MariaDB in NGINX Unit) / (omejitev pomnilnika v PHP + 5)
Ta vrednost se nastavi v nastavitvah NGINX Unit.
Ta vrednost prav tako predvideva, da sta vedno zagonjena vsaj dva procesa PHP, kar je pomembno, ker WordPress izvaja veliko asinhronih poizvedb na samo sebe, in brez dodatnih procesov se lahko zagon, na primer, WP-Cron, pokvari. Morda boste želeli povečati ali zmanjšati te omejitve glede na vaše lokalne nastavitve, saj so tukaj nastavljene vrednosti konzervativne. Na večini produktivnih sistemov se nastavitve gibljejo med 10 in 100.
koda 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čunano največje število procesov PHP je ${MAX_PHP_PROCESSES}. Morda boste želeli prilagoditi to vrednost zaradi razlik v vaši konfiguraciji. Ni nenavadno videti vrednosti med 10 in 100 v produkcijskih konfiguracijah."
echo " Konfiguracija NGINX Unit za uporabo PHP in 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/configKonfiguracija NGINX
Nastavitev osnovnih parametrov NGINX
Skripta ustvari mapo za predpomnilnik NGINX, nato pa ustvari osnovno datoteko nastavitev nginx.confUpoštevajte število procesorjev in dodelite največjo velikost datoteke za prenos. Obstaja tudi vrstica, v kateri je povezan datoteka za nastavitev stiskanja, določena v naslednjem razdelku, nato pa sledijo nastavitve predpomnjenja.
koda 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;
}
EOMNastavitev stiskanja NGINX
Stiskanje vsebine v realnem času pred pošiljanjem strankam je odličen način za izboljšanje zmogljivosti spletnega mesta, če je stiskanje pravilno nastavljeno. Ta del skripte temelji na nastavitvah .
koda skripta
cat > ${NGINX_CONF_DIR}/gzip_compression.conf << 'EOM'
# Kredit: https://github.com/h5bp/server-configs-nginx/
# ----------------------------------------------------------------------
# | Stiskanje |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Omogoči gzip stiskanje.
# Privzeto: izklopljeno
gzip on;
# Raven stiskanja (1-9).
# 5 je odlična srednja točka med velikostjo in uporabo CPU, ki ponuja približno 75%
# zmanjšanje za večino ASCII datotek (skoraj identično ravni 9).
# Privzeto: 1
gzip_comp_level 6;
# Ne stiskajte ničesar, kar je že majhno in malo verjetno, da se bo še bolj zmanjšalo,
# (privzeto je 20 bajtov, kar je slabo, saj običajno vodi do večjih
# datotek po gZIP-iranju).
# Privzeto: 20
gzip_min_length 256;
# Stisnite podatke tudi za stranke, ki se povezujejo z nami prek proxy-jev,
# identificiranih z glavo "Via" (potrebno za CloudFront).
# Privzeto: izklopljeno
gzip_proxied any;
# Poveste proxyjem, naj shranijo tako gzipped kot navadno različico vira
# kadarkoli se glava zmožnosti sprejemanja kodiranja stranke spreminja;
# preprečuje težavo, kjer bi stranka, ki ne podpira gzip (kar je danes izjemno redko)
# prikazala nejasnosti, če bi jim njihov proxy posredoval gzipped različico.
# Privzeto: izklopljeno
gzip_vary on;
# Stisnite vse izhode, označene z eno od naslednjih MIME-tipov.
# `text/html` je vedno stisnjen z gzip modulom.
# Privzeto: 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;
EOMNastavitev NGINX za WordPress
Nato skripta ustvari datoteko za nastavitev za WordPress default.conf v imeniku conf.d. Tukaj se nastavi:
- Aktivacija TLS certifikatov, pridobljenih od Let's Encrypt prek Certbota (njegova nastavitev bo v naslednjem razdelku)
- Nastavitev varnostnih parametrov TLS, ki temelji na priporočilih Let's Encrypt
- Povezovanje predpomnjenja preskočenih poizvedb za 1 uro po privzetku
- Onemogočanje beleženja dostopa in beleženja napak, če datoteka ni bila najdena, za dve pogosto zahtevani datoteki: favicon.ico in robots.txt
- Prepoved dostopa do skritih datotek in nekaterih datotek .php, da bi se spriječio neovlašteni pristup ili nenamjerno pokretanje
- Isključivanje zapisivanja pristupa za statičke resurse i datoteke fontova
- Postavljanje zaglavlja za datoteke fontova
- Dodavanje usmjeravanja za index.php i ostale statičke resurse.
koda 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 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;
}
# Zabraniti sve pokušaje pristupa skrivenim datotekama kao što su .htaccess, .htpasswd,
# .DS_Store (Mac)
# Nastaviti bilježenje zahtjeva za kasnije analiziranje (ili proslijediti firewall alatima
# kao što je fail2ban)
location ~ \/. {
deny all;
}
# Zabraniti pristup svim datotekama s ekstenzijom .php u direktoriju za prijenos;
# radi u instalacijama poddirektorija i također u višezadaćnim mrežama.
# Nastaviti bilježenje zahtjeva za kasnije analiziranje (ili proslijediti firewall alatima
# kao što je fail2ban).
location ~* \/(?:uploads|files)\/.*.php$ {
deny all;
}
# WordPress: zabraniti pristup PHP datotekama wp-content, wp-includes
location ~* ^\/(?:wp-content|wp-includes)\/.*.php$ {
deny all;
}
# Zabraniti javni pristup wp-config.php
location ~* wp-config.php {
deny all;
}
# Ne bilježiti 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;
}
}
EOMKonfiguracija Certbota za certifikate od Let's Encrypt i njihovo automatsko obnavljanje
je besplatan alat od Electronic Frontier Foundation (EFF) koji omogućava dobijanje i automatsko ažuriranje TLS certifikata od Let's Encrypt. Skripta izvodi sledeće radnje koje dovode do podešavanja Certbota za obradu certifikata od Let's Encrypt u NGINX-u:
- Stopira NGINX
- Preuzima preporučene TLS parametre
- Pokreće Certbot da dobije certifikate za sajt
- Ponovo pokreće NGINX da koristi certifikate
- Podešava svakodnevno pokretanje Certbota u 3:24 ujutru za proveru potrebe za obnavljanjem certifikata, kao i, kada je potrebno, preuzimanje novih certifikata i ponovnu uslugu NGINX-a.
koda 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 -
fiDodatna podešavanja vašeg sajta
Ono što smo prethodno opisali je kako naš skript podešava NGINX i NGINX Unit za servisiranje sajta spremnog za proizvodnju sa omogućenim TLSSSL. Takođe možete, u zavisnosti od vaših potreba, dodati u budućnosti:
- Podršku , unapređeno kompresiju u realnom vremenu preko HTTPS-a
- z , da sprečite automatske napade na vaš sajt
- za WordPress, koja su vam odgovarajuća
- s pomočjo (na Ubuntu)
- Postfix ali msmtp, da WordPress lahko pošilja e-pošto
- Preverjanje vaše spletne strani, da razumete, koliko prometa lahko prenese
Za še boljšo zmogljivost spletne strani priporočamo nadgradnjo na , naš komercialni izdelek na ravni podjetja, temelječ na NGINX z odprto kodo. Naročniki prejmejo dinamično nalagalni modul Brotli, ter (za dodatno plačilo) . Ponujamo tudi , modul WAF za NGINX Plus, zasnovan na industrijski vodilni tehnologiji varnosti podjetja F5.
N.B. Za podporo visokoadministrativnim spletnim mestom se lahko obrnete na strokovnjake . Zagotovili bomo hitro in zanesljivo delovanje vaše spletne strani ali storitve pod vsakršnim obremenitvijo.
Izvor: habr.com
