Automatiséieren WordPress Installatioun mat NGINX Eenheet an Ubuntu
Et gi vill Tutorials wéi Dir WordPress installéiere kënnt, eng Google Sich no "WordPress install" wäert ongeféier eng hallef Millioun Resultater ginn. Wéi och ëmmer, et gi ganz wéineg gutt Guiden ënnert hinnen, no deenen Dir WordPress an de Basisbetribssystem installéiere kënnt an konfiguréieren sou datt se fäeg sinn fir eng laang Zäit z'ënnerstëtzen. Vläicht sinn déi richteg Astellunge ganz ofhängeg vu spezifesche Besoinen, oder dat ass wéinst der Tatsaach datt eng detailléiert Erklärung den Artikel schwéier ze liesen mécht.
An dësem Artikel wäerte mir probéieren dat Bescht vu béide Welten ze kombinéieren andeems Dir e Bash Skript ubitt fir WordPress automatesch op Ubuntu z'installéieren, souwéi duerch et ze goen, z'erklären wat all Stéck mécht, souwéi d'Kompromisser déi mir gemaach hunn an der Entwécklung . Wann Dir en fortgeschrattene Benotzer sidd, kënnt Dir den Text vum Artikel iwwersprangen a just de Skript huelen fir Ännerung a Gebrauch an Ären Ëmfeld. D'Ausgab vum Skript ass eng personaliséiert WordPress Installatioun mat Lets Encrypt Support, Lafen op NGINX Unit a gëeegent fir Produktiounsgebrauch.
Déi entwéckelt Architektur fir WordPress z'installéieren mat der NGINX Eenheet gëtt an eeleren Artikel, elo wäerte mir och weider Saachen konfiguréieren déi net do waren (wéi a villen aneren Tutorials):
WordPress CLI
Loosst eis verschlësselen an TLSSSL Certificaten
Automatesch Erneierung vun Certificaten
NGINX Cache
NGINX Kompressioun
HTTPS an HTTP/2 Ënnerstëtzung
Prozess Automatisatioun
Den Artikel wäert d'Installatioun op engem Server beschreiwen, deen gläichzäiteg e statesche Veraarbechtungsserver, e PHP-Veraarbechtungsserver an eng Datebank héiert. Eng Installatioun déi verschidde virtuell Hosten a Servicer ënnerstëtzt ass e potenziellt Thema fir d'Zukunft. Wann Dir wëllt datt mir iwwer eppes schreiwen wat net an dësen Artikelen ass, schreift an de Kommentaren.
Ufuerderunge
Container Server (LXC oder LXD), eng virtuell Maschinn, oder e reguläre Eisenserver mat mindestens 512MB RAM an Ubuntu 18.04 oder méi nei installéiert.
Internet zougänglech Ports 80 an 443
Domain Numm assoziéiert mat der ëffentlecher IP Adress vun dësem Server
Root Zougang (sudo).
Architektur Iwwersiicht
D'Architektur ass déiselwecht wéi beschriwwen virdrun, eng dräistäckeg Webapplikatioun. Et besteet aus PHP Scripten déi um PHP-Motor lafen a statesch Dateien déi vum Webserver veraarbecht ginn.
Generelle Prinzipien
Vill Konfiguratiounsbefehl an engem Skript sinn agewéckelt wann Konditioune fir Idempotenz: de Skript kann e puer Mol lafen ouni de Risiko fir Astellungen z'änneren déi scho sinn.
De Skript probéiert Software vu Repositories z'installéieren, sou datt Dir Systemupdates an engem Kommando benotze kënnt (apt upgrade fir Ubuntu).
Kommandoen probéieren z'entdecken datt se an engem Container lafen, sou datt se hir Astellungen deementspriechend änneren.
Fir d'Zuel vun de Fuedemprozesser ze setzen fir an den Astellungen unzefänken, probéiert de Skript déi automatesch Astellunge ze roden fir a Containeren, virtuelle Maschinnen an Hardwareserveren ze schaffen.
Wann mir Astellunge beschreiwen, denken mir ëmmer fir d'éischt un d'Automatisatioun, déi, mir hoffen, d'Basis gëtt fir Är eege Infrastruktur als Code ze kreéieren.
All Kommandoe ginn als Benotzer ausgeführt root, well se d'Basis System Astellunge änneren, awer direkt WordPress leeft als normale Benotzer.
Ëmfeld Verännerlechen Astellung
Setzt déi folgend Ëmfeldvariablen ier Dir de Skript leeft:
WORDPRESS_URL ass déi komplett URL vum WordPress Site, ab https://.
LETS_ENCRYPT_STAGING - Par défaut eidel, awer andeems Dir de Wäert op 1 setzt, benotzt Dir d'Let's Encrypt Staging Server, déi néideg sinn fir dacks Zertifikater ze froen wann Dir Är Astellungen testen, soss kann Let's Encrypt Är IP Adress temporär blockéieren wéinst enger grousser Unzuel vun Ufroen .
De Skript kontrolléiert datt dës WordPress-verwandte Variablen agestallt sinn an erausgoen wann net.
Skript Linnen 572-576 kontrolléieren de Wäert LETS_ENCRYPT_STAGING.
Astellung ofgeleet Ëmfeld Variablen
De Skript op Linnen 55-61 setzt déi folgend Ëmfeldvariablen, entweder op e puer haart kodéierte Wäert oder benotzt e Wäert, deen aus de Variabelen an der viregter Sektioun gesat gëtt:
DEBIAN_FRONTEND="noninteractive" - Erzielt Uwendungen datt se an engem Skript lafen an datt et keng Méiglechkeet vu Benotzerinteraktioun ass.
WORDPRESS_CLI_VERSION="2.4.0" ass d'Versioun vun der WordPress CLI Applikatioun.
WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" - Checksum vun der WordPress CLI 2.4.0 ausführbar Datei (d'Versioun gëtt an der Variabel spezifizéiert WORDPRESS_CLI_VERSION). De Skript op der Linn 162 benotzt dëse Wäert fir ze kontrolléieren ob déi richteg WordPress CLI Datei erofgeluede gouf.
UPLOAD_MAX_FILESIZE="16M" - déi maximal Dateigréisst déi op WordPress eropgeluede ka ginn. Dës Astellung gëtt op e puer Plazen benotzt, sou datt et méi einfach ass op enger Plaz ze setzen.
TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" - Hostnumm vum System, aus der WORDPRESS_URL Variabel zréckgezunn. Benotzt fir entspriechend TLS / SSL Zertifikater vu Let's Encrypt souwéi intern WordPress Verifikatioun ze kréien.
NGINX_CONF_DIR="/etc/nginx" - Wee an de Verzeechnes mat NGINX Astellungen, dorënner d'Haaptdatei nginx.conf.
CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" - de Wee op d'Let's Encrypt Certificaten fir de WordPress Site, kritt vun der Variabel TLS_HOSTNAME.
Gitt e Hostnumm un e WordPress Server
De Skript setzt den Hostnumm vum Server fir dem Domain Numm vum Site ze passen. Dëst ass net erfuerderlech, awer et ass méi bequem fir erausginn Mail iwwer SMTP ze schécken wann Dir en eenzege Server opstellt, wéi vum Skript konfiguréiert.
Skript Code
# 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
Füügt Hostnumm op /etc/hosts
Addition WP-Cron benotzt fir periodesch Aufgaben ze lafen, erfuerdert WordPress fir sech selwer iwwer HTTP zouzegräifen. Fir sécherzestellen datt WP-Cron an all Ëmfeld korrekt funktionnéiert, füügt de Skript eng Zeil an d'Datei / etc / hunsou datt WordPress sech selwer iwwer de Loopback Interface ka zougräifen:
Skript Code
# 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
Installéiert déi néideg Tools fir déi nächst Schrëtt
De Rescht vum Skript brauch e puer Programmer an iwwerhëlt datt d'Repositories aktuell sinn. Mir aktualiséieren d'Lëscht vun de Repositories, duerno installéiere mir déi néideg Tools:
Skript Code
# 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
NGINX Eenheet an NGINX Repositories derbäi
De Skript installéiert NGINX Eenheet an Open Source NGINX vun den offiziellen NGINX Repositories fir sécherzestellen datt d'Versioune mat de leschte Sécherheetspatches a Bugfixes benotzt ginn.
De Skript füügt den NGINX Unit Repository an dann den NGINX Repository derbäi, addéiere de Repositories Schlëssel a Konfiguratiounsdateien apt, Zougang zu Repositories iwwer Internet definéieren.
Déi aktuell Installatioun vun NGINX Eenheet an NGINX geschitt an der nächster Sektioun. Mir fügen d'Repositories vir, sou datt mir d'Metadaten net e puer Mol musse aktualiséieren, wat d'Installatioun méi séier mécht.
Skript Code
# 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
Installéiere vun NGINX, NGINX Unit, PHP MariaDB, Certbot (Let's Encrypt) an hir Ofhängegkeeten
Wann all d'Repositories bäigefüügt sinn, aktualiséieren d'Metadaten an installéiert d'Applikatiounen. D'Packagen, déi vum Skript installéiert sinn, enthalen och d'PHP-Extensiounen recommandéiert wann Dir WordPress.org leeft
Skript Code
echo " Updating repository metadata"
apt-get -qq update
# Install PHP with dependencies and NGINX Unit
echo " Installing PHP, NGINX Unit, NGINX, Certbot, and 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
PHP opsetzen fir mat NGINX Eenheet a WordPress ze benotzen
De Skript erstellt eng Astellungsdatei am Verzeechnes conf.d. Dëst setzt déi maximal Dateigréisst fir PHP-Uploads, schalt PHP-Fehlerausgang op STDERR un, sou datt se an den NGINX Unit Log geschriwwe ginn an d'NGINX Unit nei starten.
Skript Code
# 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
MariaDB Datebank Astellunge fir WordPress spezifizéieren
Mir hunn MariaDB iwwer MySQL gewielt well et méi Gemeinschaftsaktivitéit huet an och méiglech ass stellt besser Leeschtung Par défaut (wahrscheinlech ass alles méi einfach hei: fir MySQL z'installéieren, musst Dir en anere Repository derbäi, ca. Iwwersetzer).
De Skript erstellt eng nei Datebank a erstellt Umeldungsinformatiounen fir Zougang zu WordPress iwwer d'Loopback Interface:
Skript Code
# 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;"
Installéiere vum WordPress CLI Programm
Op dësem Schrëtt installéiert de Skript de Programm WP-CLI. Mat et kënnt Dir WordPress Astellungen installéieren a verwalten ouni manuell Dateien z'änneren, d'Datebank ze aktualiséieren oder d'Kontrollpanel anzeginn. Et kann och benotzt ginn fir Themen an Add-ons z'installéieren an WordPress ze aktualiséieren.
Skript Code
if [ ! -f /usr/local/bin/wp ]; then
# Install the WordPress CLI
echo " Installing the WordPress CLI tool"
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
WordPress installéieren an konfiguréieren
De Skript installéiert déi lescht Versioun vu WordPress an engem Verzeechnes /var/www/wordpressan ännert och d'Astellungen:
D'Datebankverbindung funktionnéiert iwwer Unix Domain Socket anstatt TCP op Loopback fir den TCP Traffic ze reduzéieren.
WordPress füügt e Präfix https:// op d'URL wann d'Clientë mat NGINX iwwer HTTPS verbannen, a schéckt och den Fernhostnumm (wéi vum NGINX geliwwert) op PHP. Mir benotzen e Stéck Code fir dëst opzestellen.
WordPress brauch HTTPS fir Login
D'Standard URL Struktur baséiert op Ressourcen
Setzt déi richteg Permissiounen am Dateiesystem fir de WordPress Verzeechnes.
Skript Code
if [ ! -d /var/www/wordpress ]; then
# Create WordPress directories
mkdir -p /var/www/wordpress
chown -R www-data:www-data /var/www
# Download WordPress using the WordPress CLI
echo " Installing 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}""
# This snippet is injected into the wp-config.php file when it is created;
# it informs WordPress that we are behind a reverse proxy and as such
# allows it to generate links using HTTPS
cat > /tmp/wp_forwarded_for.php << 'EOM'
/* Turn HTTPS 'on' if HTTP_X_FORWARDED_PROTO matches '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
# Create WordPress configuration
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
# Install 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
# Set permalink structure to a sensible default that isn't in the UI
su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data
# Remove sample file because it is cruft and could be a security problem
rm /var/www/wordpress/wp-config-sample.php
# Ensure that WordPress permissions are correct
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
NGINX Eenheet opbauen
De Skript konfiguréiert d'NGINX Eenheet fir PHP auszeféieren an WordPress Weeër ze veraarbechten, de PHP-Prozessnameraum ze isoléieren an d'Performance-Astellungen ze optimiséieren. Et ginn dräi Features fir hei nozekucken:
Ënnerstëtzung fir Nummraim gëtt duerch Konditioun festgeluegt, baséiert op der Kontroll datt de Skript an engem Container leeft. Dëst ass néideg well déi meescht Container Setups net nestéiert Start vu Container ënnerstëtzen.
Wann et Ënnerstëtzung fir Nummraim gëtt, deaktivéiert den Nummraum Netz. Dëst ass fir WordPress z'erméiglechen mat béiden Endpunkter ze verbannen a gläichzäiteg um Internet verfügbar ze sinn.
Déi maximal Unzuel vu Prozesser ass wéi follegt definéiert: (Verfügbar Erënnerung fir MariaDB an NGINX Uniy ze lafen) / (RAM Limit an PHP + 5)
Dëse Wäert gëtt an den NGINX Eenheet Astellunge festgeluecht.
Dëse Wäert implizéiert och datt et ëmmer op d'mannst zwee PHP Prozesser lafen, wat wichteg ass well WordPress vill asynchronen Ufroe fir sech selwer mécht, an ouni zousätzlech Prozesser lafen zB WP-Cron wäert briechen. Dir wëllt dës Limiten op Basis vun Äre lokalen Astellungen erhéijen oder erofsetzen, well d'Astellungen déi hei erstallt sinn konservativ sinn. Op de meeschte Produktiounssystemer sinn d'Astellungen tëscht 10 an 100.
Skript Code
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 " Calculated the maximum number of PHP processes as ${MAX_PHP_PROCESSES}. You may want to tune this value due to variations in your configuration. It is not unusual to see values between 10-100 in production configurations."
echo " Configuring NGINX Unit to use PHP and WordPress"
cat > /tmp/wordpress.json << EOM
{
"settings": {
"http": {
"header_read_timeout": 30,
"body_read_timeout": 30,
"send_timeout": 30,
"idle_timeout": 180,
"max_body_size": $(numfmt --from=iec ${UPLOAD_MAX_FILESIZE})
}
},
"listeners": {
"127.0.0.1:8080": {
"pass": "routes/wordpress"
}
},
"routes": {
"wordpress": [
{
"match": {
"uri": [
"*.php",
"*.php/*",
"/wp-admin/"
]
},
"action": {
"pass": "applications/wordpress/direct"
}
},
{
"action": {
"share": "/var/www/wordpress",
"fallback": {
"pass": "applications/wordpress/index"
}
}
}
]
},
"applications": {
"wordpress": {
"type": "php",
"user": "www-data",
"group": "www-data",
"processes": {
"max": ${MAX_PHP_PROCESSES},
"spare": 1
},
"isolation": {
${NAMESPACES}
},
"targets": {
"direct": {
"root": "/var/www/wordpress/"
},
"index": {
"root": "/var/www/wordpress/",
"script": "index.php"
}
}
}
}
}
EOM
curl -X PUT --data-binary @/tmp/wordpress.json --unix-socket /run/control.unit.sock http://localhost/config
NGINX opsetzen
Basis NGINX Astellunge konfiguréieren
De Skript erstellt e Verzeechnes fir den NGINX Cache an erstellt dann d'Haaptkonfiguratiounsdatei nginx.conf. Opgepasst op d'Zuel vun den Handlerprozesser an d'Astellung vun der maximaler Dateigréisst fir den Eroplueden. Et gëtt och eng Zeil déi d'Kompressiounsastellungsdatei enthält, déi an der nächster Sektioun definéiert ass, gefollegt vun den Cache-Astellungen.
D'Kompressioun vum Inhalt op der Flucht ier se un d'Clientë geschéckt gëtt ass e super Wee fir d'Performance vum Site ze verbesseren, awer nëmmen wann d'Kompressioun richteg konfiguréiert ass. Dës Sektioun vum Skript baséiert op Astellungen vun hei.
Skript Code
cat > ${NGINX_CONF_DIR}/gzip_compression.conf << 'EOM'
# Credit: https://github.com/h5bp/server-configs-nginx/
# ----------------------------------------------------------------------
# | Compression |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Enable gzip compression.
# Default: off
gzip on;
# Compression level (1-9).
# 5 is a perfect compromise between size and CPU usage, offering about 75%
# reduction for most ASCII files (almost identical to level 9).
# Default: 1
gzip_comp_level 6;
# Don't compress anything that's already small and unlikely to shrink much if at
# all (the default is 20 bytes, which is bad as that usually leads to larger
# files after gzipping).
# Default: 20
gzip_min_length 256;
# Compress data even for clients that are connecting to us via proxies,
# identified by the "Via" header (required for CloudFront).
# Default: off
gzip_proxied any;
# Tell proxies to cache both the gzipped and regular version of a resource
# whenever the client's Accept-Encoding capabilities header varies;
# Avoids the issue where a non-gzip capable client (which is extremely rare
# today) would display gibberish if their proxy gave them the gzipped version.
# Default: off
gzip_vary on;
# Compress all output labeled with one of the following MIME-types.
# `text/html` is always compressed by gzip module.
# Default: 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
NGINX fir WordPress opsetzen
Als nächst erstellt de Skript eng Konfiguratiounsdatei fir WordPress default.conf am Katalog conf.d. Et ass hei konfiguréiert:
TLS Zertifikater aktivéieren, déi vu Let's Encrypt iwwer Certbot kritt goufen (et opzestellen ass an der nächster Sektioun)
TLS Sécherheetsastellungen konfiguréieren baséiert op Empfehlungen vu Let's Encrypt
Aktivéiert Caching Skip Ufroe fir 1 Stonn Standard
Deaktivéiert den Zougangsprotokoll, souwéi d'Fehlerprotokoller wann d'Datei net fonnt gëtt, fir zwee gemeinsam ugefrote Dateien: favicon.ico an robots.txt
Verhënnert Zougang zu verstoppte Dateien an e puer Dateien .phpillegalen Zougang oder ongewollten Start ze verhënneren
Deaktivéiert Zougangsprotokoll fir statesch a Schrëftdateien
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 used by Certbot for 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/;
# Let's Encrypt configuration
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;
}
# Deny all attempts to access hidden files such as .htaccess, .htpasswd,
# .DS_Store (Mac)
# Keep logging the requests to parse later (or to pass to firewall utilities
# such as fail2ban)
location ~ /. {
deny all;
}
# Deny access to any files with a .php extension in the uploads directory;
# works in subdirectory installs and also in multi-site network.
# Keep logging the requests to parse later (or to pass to firewall utilities
# such as fail2ban).
location ~* /(?:uploads|files)/.*.php$ {
deny all;
}
# WordPress: deny access to wp-content, wp-includes PHP files
location ~* ^/(?:wp-content|wp-includes)/.*.php$ {
deny all;
}
# Deny public access to wp-config.php
location ~* wp-config.php {
deny all;
}
# Do not log access for static assets, media
location ~* .(?:css(.map)?|js(.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
access_log off;
}
location ~* .(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
add_header Access-Control-Allow-Origin "*";
access_log off;
}
location / {
try_files $uri @index_php;
}
location @index_php {
proxy_socket_keepalive on;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://unit_php_upstream;
}
location ~* .php$ {
proxy_socket_keepalive on;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
try_files $uri =404;
proxy_pass http://unit_php_upstream;
}
}
EOM
Certbot opzestellen fir Zertifikater vu Let's Encrypt an automatesch ze erneieren
certbot ass e gratis Tool vun der Electronic Frontier Foundation (EFF) dat Iech erlaabt TLS Zertifikater vu Let's Encrypt ze kréien an automatesch ze erneieren. De Skript mécht déi folgend fir Certbot ze konfiguréieren fir Zertifikater vu Let's Encrypt an NGINX ze veraarbecht:
Stoppen NGINX
Downloads recommandéiert TLS Astellungen
Leeft Certbot fir Certificaten fir de Site ze kréien
Neistart NGINX fir Certificaten ze benotzen
Configuréiert Certbot fir all Dag um 3:24 AM ze lafen fir z'iwwerpréiwen ob Zertifikater mussen erneiert ginn, a wann néideg, nei Zertifikater eroflueden an NGINX nei starten.
Skript Code
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
Zousätzlech Personnalisatioun vun Ärem Site
Mir hunn uewen geschwat wéi eise Skript NGINX an NGINX Unit konfiguréiert fir e Produktiounsfäerdeg Site mat TLSSSL aktivéiert ze déngen. Dir kënnt och, ofhängeg vun Äre Besoinen, an Zukunft addéieren:
ënnerstëtzen Brotli, verbessert On-the-Fly Kompressioun iwwer HTTPS
Postfix oder msmtp sou datt WordPress E-Mail schécken kann
Iwwerpréift Äre Site fir datt Dir verstitt wéi vill Traffic et kann handhaben
Fir nach besser Site Leeschtung, Mir recommandéieren Upgrade ze NGINX Plus, eise kommerziellen, Enterprise-grade Produkt baséiert op Open Source NGINX. Seng Abonnente kréien en dynamesch gelueden Brotli Modul, souwéi (fir eng zousätzlech Tax) NGINX ModSecurity WAF. Mir bidden och NGINX App Protect, e WAF-Modul fir NGINX Plus baséiert op industrieféierend Sécherheetstechnologie vu F5.
NB Fir Ënnerstëtzung vun engem héich gelueden Site, kënnt Dir d'Spezialisten kontaktéieren Southbridge. Mir garantéieren eng séier an zouverlässeg Operatioun vun Ärer Websäit oder Service ënner all Laascht.