
Er zijn veel materialen beschikbaar voor het installeren van WordPress; een zoekopdracht in Google met de zoekwoorden "WordPress install" levert ongeveer een half miljoen resultaten op. Desondanks zijn er slechts weinig goede handleidingen te vinden die uitleggen hoe je WordPress en het bijbehorende besturingssysteem kunt installeren en configureren, zodat ze langdurig kunnen worden ondersteund. Het is mogelijk dat de juiste instellingen sterk afhangen van specifieke behoeften, of dat het komt omdat een gedetailleerde uitleg het artikel moeilijk leesbaar maakt.
In dit artikel proberen we het beste van twee benaderingen te combineren, door een bash-script te bieden voor de automatische installatie van WordPress op Ubuntu, en we zullen het script doornemen om uit te leggen wat elk stukje doet, evenals welke compromissen we hebben gesloten bij de ontwikkeling. Als je een ervaren gebruiker bent, kun je de tekst van het artikel overslaan en gewoon gebruiken voor aanpassing en gebruik in jouw omgevingen. Het uitvoerresultaat van het script is een configureerbare installatie van WordPress met ondersteuning voor Lets Encrypt, die draait op NGINX Unit en geschikt is voor industriële toepassing.
De ontwikkelde architectuur voor het uitrollen van WordPress met NGINX Unit is beschreven in een , nu zullen we ook extra instellingen doornemen die daar niet zijn behandeld (zoals in veel andere handleidingen):
- WordPress CLI
- Let’s Encrypt en TLS-certificaten
- Automatische certificaatvernieuwing
- NGINX-caching
- NGINX-compressie
- Ondersteuning voor HTTPS en HTTP/2
- Automatisering van het proces
In het artikel wordt de installatie op één server beschreven, waarop tegelijkertijd een statische verwerkingsserver, een PHP-verwerkingsserver en een database worden gehost. Een installatie met ondersteuning voor meerdere virtuele hosts en services is een potentieel onderwerp voor de toekomst. Laat het ons weten in de reacties als je wilt dat we over iets schrijven dat nog niet in deze artikelen staat.
Vereisten
- Server-container ( of ), virtuele machine, of een gewone fysieke server, met minimaal 512MB RAM en met Ubuntu 18.04 of nieuwer geïnstalleerd.
- Toegankelijke poorten 80 en 443 van het internet
- Een domeinnaam die is gekoppeld aan het openbare IP-adres van deze server
- Toegang met root-rechten (sudo).
Architectuuroverzicht
De architectuur is hetzelfde als beschreven , een drievoudige webtoepassing. Deze bestaat uit PHP-scripts die worden uitgevoerd door de PHP-handler en statische bestanden die worden behandeld door de webserver.

Algemene principes
- Veel configuratiecommando's in het script zijn omgeven door voorwaarden (if) voor idempotentie: het script kan meerdere keren worden uitgevoerd zonder het risico dat instellingen die al gereed zijn, worden gewijzigd.
- Het script probeert software uit repositories te installeren, zodat je systeemupdates in één commando kunt toepassen (
apt upgradevoor Ubuntu). - De commando's proberen te detecteren of ze in een container worden uitgevoerd om hun instellingen dienovereenkomstig aan te passen.
- Om het aantal uit te voeren processen/threads in de instellingen op te geven, probeert het script automatische configureerparameters te raden voor gebruik in containers, virtuele machines en 'dedicated' servers.
- Bij het beschrijven van de instellingen denken we altijd eerst aan automatisering, die hopelijk de basis zal vormen voor het creëren van jouw eigen infrastructuur als code.
- Alle commando's worden uitgevoerd als gebruiker root, omdat ze de belangrijkste systeeminstellingen wijzigen, maar WordPress zelf draait onder een standaard gebruiker.
Instelling van omgevingsvariabelen
Stel de volgende omgevingsvariabelen in voordat je het script uitvoert:
WORDPRESS_DB_PASSWORD— het wachtwoord voor de WordPress-databaseWORDPRESS_ADMIN_USER— de naam van de WordPress-beheerderWORDPRESS_ADMIN_PASSWORD— het wachtwoord van de WordPress-beheerderWORDPRESS_ADMIN_EMAIL— de e-mail van de WordPress-beheerderWORDPRESS_URL— de volledige URL van de WordPress-site, beginnend methttps://.LETS_ENCRYPT_STAGING— standaard leeg, maar door het op 1 te zetten, gebruik je de staging-servers van Let’s Encrypt, die nodig zijn voor het frequent aanvragen van certificaten tijdens het testproces van jouw instellingen, anders kan Let’s Encrypt tijdelijk je IP-adres blokkeren vanwege een groot aantal verzoeken.
Het script controleert of deze aan WordPress gerelateerde variabelen zijn ingesteld en beëindigt de uitvoering als dat niet het geval is.
De regels van het script 572-576 controleren de waarde LETS_ENCRYPT_STAGING.
Instelling van afgeleide omgevingsvariabelen
Het script op regels 55-61 stelt de volgende omgevingsvariabelen in, hetzij op een enkele vaste waarde, hetzij door toepassing van waarde verkregen vanuit de variabelen die in de vorige sectie zijn ingesteld:
DEBIAN_FRONTEND="noninteractive"— laat applicaties weten dat ze worden uitgevoerd in een script en dat interactie met de gebruiker niet mogelijk is.WORDPRESS_CLI_VERSION="2.4.0"— versie van de WordPress CLI-applicatie.WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c"— controlegetal van het uitvoerbare bestand WordPress CLI 2.4.0 (de versie wordt vermeld in de variabeleWORDPRESS_CLI_VERSION). Het script op regel 162 gebruikt deze waarde om te controleren of het correcte WordPress CLI-bestand is gedownload.UPLOAD_MAX_FILESIZE="16M"— de maximale bestandsgrootte die kan worden geüpload in WordPress. Deze instelling wordt op verschillende plaatsen gebruikt, dus het is makkelijker om deze op één plek in te stellen.TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'\/ ' -f3)"— hostname van het systeem, geëxtraheerd uit de variabele WORDPRESS_URL. Dit wordt gebruikt om de bijbehorende TLS/SSL-certificaten van Let’s Encrypt te verkrijgen, evenals voor interne verificatie van WordPress.NGINX_CONF_DIR="\/etc\/nginx"— pad naar de map met NGINX-instelling, inclusief het hoofd bestandnginx.conf.CERT_DIR="\/etc\/letsencrypt\/live\/${TLS_HOSTNAME}"— pad naar de Let’s Encrypt-certificaten voor de WordPress-site, verkregen uit de variabeleTLS_HOSTNAME.
Toewijzing van hostname aan de WordPress-server
Het script stelt de hostname van de server in zodat de waarde overeenkomt met de domeinnaam van de site. Dit is niet verplicht, maar het vergemakkelijkt het verzenden van uitgaande e-mails via SMTP wanneer een enkele server wordt ingesteld, zoals in het script wordt ingesteld.
scriptcode
# 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}"
fiHostname toevoegen aan \/etc\/hosts
Aanvulling wordt gebruikt om periodieke taken uit te voeren, vereist dat WordPress toegang heeft tot zichzelf via HTTP. Om ervoor te zorgen dat WP-Cron correct werkt in alle omgevingen, voegt het script een regel toe aan het bestand /etc/hosts, zodat WordPress toegang tot zichzelf kan krijgen via de loopback-interface:
scriptcode
# 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
fiInstallen van de vereiste tools voor de volgende stappen
De rest van het script heeft enkele programma's nodig en gaat ervan uit dat de repositories up-to-date zijn. We werken de lijst met repositories bij, waarna we de benodigde tools installeren:
scriptcode
# 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-releaseToevoegen van de NGINX Unit en NGINX repositories
Het script installeert NGINX Unit en NGINX met open source uit de officiële NGINX-repositories om ervoor te zorgen dat de versies met de laatste beveiligingsupdates en bugfixes worden gebruikt.
Het script voegt de NGINX Unit-repository toe en vervolgens de NGINX-repository, en voegt de repository-sleutels en configuratiebestanden toe apt, die toegang tot de repositories via internet instellen.
De daadwerkelijke installatie van NGINX Unit en NGINX vindt plaats in het volgende gedeelte. We voegen vooraf repositories toe om te voorkomen dat we de metadata meerdere keren bijwerken, wat de installatie versnelt.
scriptcode
# 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
fiInstallatie van NGINX, NGINX Unit, PHP MariaDB, Certbot (Let’s Encrypt) en hun afhankelijkheden
Zodra alle repositories zijn toegevoegd, vernieuwen we de metadata en installeren we de applicaties. De pakketten die door het script worden geïnstalleerd, bevatten ook de aanbevolen PHP-extensies voor WordPress.org.
scriptcode
echo " Bijwerken van repository metadata"
apt-get -qq update
# Installeer PHP met afhankelijkheden en NGINX Unit
echo " Installeren van PHP, NGINX Unit, NGINX, Certbot en 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-serverConfiguratie van PHP voor gebruik met NGINX Unit en WordPress
Het script maakt een configuratiebestand aan in de map conf.d. Hier worden de maximale uploadgrootte voor bestanden in PHP ingesteld, wordt foutuitvoer van PHP in STDERR ingeschakeld, zodat deze in het NGINX Unit-logboek worden geregistreerd, en wordt NGINX Unit opnieuw gestart.
scriptcode
# 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 restartDatabase-instellingen voor MariaDB voor WordPress instellen
We hebben voor MariaDB gekozen in plaats van MySQL, omdat het een actiever gemeenschap heeft, bovendien kan het (waarschijnlijk is het hier eenvoudiger: om MySQL te installeren, moet een extra repository worden toegevoegd, opmerking van de vertaler).
Het script maakt een nieuwe database aan en creëert inloggegevens voor toegang tot WordPress via de loopback-interface:
scriptcode
# 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;"Installatie van het WordPress CLI-programma
In deze stap installeert het script het programma . Hiermee kun je WordPress-instellingen installeren en beheren zonder handmatig bestanden te bewerken, de database bij te werken of in het controlepaneel in te loggen. Ook kun je ermee thema's en plugins installeren en WordPress-updates uitvoeren.
scriptcode
if [ ! -f /usr/local/bin/wp ]; then
# Installeer de WordPress CLI
echo " De WordPress CLI-tool installeren"
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
fiInstallatie en configuratie van WordPress
Het script installeert de laatste versie van WordPress in de map /var/www/wordpress, en wijzigt ook de instellingen:
- De verbinding met de database verloopt via een unix domain socket in plaats van TCP op loopback, om TCP-verkeer te verminderen.
- WordPress voegt een prefix toe https:// Bij URL's, wanneer klanten verbinding maken met NGINX via het HTTPS-protocol, wordt ook de externe hostname (zoals NGINX deze verstrekt) naar PHP gestuurd. We passen een stukje code toe om dit in te stellen.
- WordPress heeft HTTPS nodig voor inloggen.
- De URL-structuur is standaard gebaseerd op bronnen.
- De juiste rechten worden ingesteld op het bestandssysteem voor de WordPress-directory.
scriptcode
if [ ! -d /var/www/wordpress ]; then
# Maak WordPress-directory's aan
mkdir -p /var/www/wordpress
chown -R www-data:www-data /var/www
# Download WordPress met behulp van de WordPress CLI
echo " WordPress aan het installeren"
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}""
# Dit fragment wordt ingevoegd in het wp-config.php-bestand wanneer het wordt aangemaakt;
# het informeert WordPress dat we achter een reverse proxy zitten en zo
# kan het links genereren met HTTPS
cat > /tmp/wp_forwarded_for.php << 'EOM'
/* Zet HTTPS 'aan' als HTTP_X_FORWARDED_PROTO overeenkomt met '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
# Maak de WordPress-configuratie aan
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
# Installeer 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
# Stel de permalinkstructuur in op een redelijke standaard die niet in de UI staat
su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data
# Verwijder het voorbeeldbestand omdat dit rommel is en een beveiligingsprobleem kan zijn
rm /var/www/wordpress/wp-config-sample.php
# Zorg ervoor dat de WordPress-rechten correct zijn
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
fiConfiguratie van NGINX Unit
Het script configureert NGINX Unit om PHP uit te voeren en WordPress-paden te verwerken, waarbij de naamruimtes van de PHP-processen worden geïsoleerd en de prestatie-instellingen worden geoptimaliseerd. Er zijn drie functies waar je op moet letten:
- Ondersteuning voor naamruimtes wordt bepaald door een voorwaarde, gebaseerd op het controleren of het script binnen een container draait. Dit is nodig omdat de meeste containerinstellingen geneste containeruitvoering niet ondersteunen.
- Als er ondersteuning is voor naamruimtes, wordt de naamruimte uitgeschakeld. netwerk. Dit is nodig om WordPress in staat te stellen tegelijkertijd verbinding te maken met endpoints en toegankelijk te zijn op het internet.
- Het maximale aantal processen wordt als volgt bepaald: (Beschikbare geheugen voor draaiende MariaDB en NGINX Uniy) / (limiet voor RAM in PHP + 5)
Deze waarde wordt ingesteld in de instellingen van NGINX Unit.
Deze waarde impliceert ook dat er altijd minimaal twee draaiende PHP-processen zijn, wat belangrijk is, omdat WordPress veel asynchrone verzoeken naar zichzelf doet. Zonder extra processen zal bijvoorbeeld WP-Cron falen. U wilt deze limieten mogelijk verhogen of verlagen op basis van uw lokale instellingen, aangezien de hier gemaakte instellingen conservatief zijn. Op de meeste productiesystemen liggen de instellingen tussen 10 en 100.
scriptcode
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 " Het maximale aantal PHP-processen is berekend als ${MAX_PHP_PROCESSES}. U wilt deze waarde mogelijk aanpassen vanwege variaties in uw configuratie. Het is niet ongewoon om waarden tussen 10-100 te zien in productieconfiguraties."
echo " NGINX Unit configureren om PHP en WordPress te gebruiken"
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/configConfiguratie van NGINX
Instelling van de basisparameters van NGINX
Het script maakt een map voor de NGINX-cache en vervolgens het hoofdconfiguratiebestand. nginx.conf. Let op het aantal verwerkingsprocessen en stel de maximale bestandsgrootte voor uploads in. Er is ook een regel waarop het bestand met compressie-instellingen wordt verbonden, dat in het volgende gedeelte wordt gedefinieerd, gevolgd door cache-instellingen.
scriptcode
# 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;
}
EOMConfiguratie van NGINX-compressie
Inhoud on-demand comprimeren voordat deze naar klanten wordt verzonden, is een uitstekende manier om de prestaties van de website te verbeteren, maar alleen als de compressie correct is ingesteld. Deze sectie van het script is gebaseerd op de instellingen .
scriptcode
cat > ${NGINX_CONF_DIR}\/gzip_compression.conf << 'EOM'
# Credit: https://github.com/h5bp/server-configs-nginx/
# ----------------------------------------------------------------------
# | Compressie |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Schakel gzip-compressie in.
# Standaard: uit
gzip on;
# Compressieniveau (1-9).
# 5 is een perfecte compromis tussen grootte en CPU-gebruik, met ongeveer 75%
# vermindering voor de meeste ASCII-bestanden (bijna identiek aan niveau 9).
# Standaard: 1
gzip_comp_level 6;
# Comprimeer niets dat al klein is en waarschijnlijk niet veel verder zal krimpen als al
# (de standaard is 20 bytes, wat slecht is, omdat dit meestal leads tot grotere
# bestanden na gzipping).
# Standaard: 20
gzip_min_length 256;
# Comprimeer gegevens zelfs voor cliënten die via proxy met ons verbinden,
# geïdentificeerd door de "Via"-header (vereist voor CloudFront).
# Standaard: uit
gzip_proxied any;
# Vertel proxies om zowel de gezipte als de reguliere versie van een bron te cachen
# telkens als de Accept-Encoding-capaciteitheader van de cliënt varieert;
# Vermijdt het probleem waarbij een niet-gzip-geschikte cliënt (wat extreem zeldzaam is
# vandaag de dag) onzin zou weergeven als hun proxy hen de gezipte versie gaf.
# Standaard: uit
gzip_vary on;
# Comprimeer alle uitvoer gelabeld met een van de volgende MIME-types.
# `text\/html` wordt altijd gecomprimeerd door het gzip-module.
# Standaard: 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;
EOMConfiguratie van NGINX voor WordPress
Daarna creëert het script een configuratiebestand voor WordPress default.conf in de catalogus conf.d. Hier wordt ingesteld:
- Activatie van TLS-certificaten verkregen van Let’s Encrypt via Certbot (deze configuratie zal in het volgende gedeelte worden behandeld)
- Configuratie van TLS-beveiligingsparameters, gebaseerd op aanbevelingen van Let’s Encrypt
- Activatie van cache voor gemiste aanvragen voor 1 uur standaard
- Deactivering van toeganglogging en ook foutlogging als het bestand niet is gevonden, voor twee algemene opgevraagde bestanden: favicon.ico en robots.txt
- Toegang tot verborgen bestanden en bepaalde bestanden verbieden .php, om ongeoorloofde toegang of onbedoelde uitvoering te voorkomen
- Toegang logging uitschakelen voor statische en lettertypebestanden
- Header instellen voor lettertypebestanden
- Routing toevoegen voor index.php en andere statische bestanden.
scriptcode
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-uitdaging gebruikt door Certbot voor 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 configuratie
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 stapeling
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;
}
# Weiger alle pogingen om verborgen bestanden zoals .htaccess, .htpasswd,
# .DS_Store (Mac)
# Houd logging van verzoeken aan voor latere analyse (of om door te geven aan firewall-tools
# zoals fail2ban)
location ~ \/. {
deny all;
}
# Weiger toegang tot bestanden met een .php extensie in de uploads-directory;
# werkt in subdirectory-installaties en ook in multi-site netwerken.
# Houd logging van verzoeken aan voor latere analyse (of om door te geven aan firewall-tools
# zoals fail2ban).
location ~* \/(?:uploads|files)\/.php$ {
deny all;
}
# WordPress: weiger toegang tot wp-content, wp-includes PHP-bestanden
location ~* ^\/(?:wp-content|wp-includes)\/.php$ {
deny all;
}
# Weiger openbare toegang tot wp-config.php
location ~* wp-config.php {
deny all;
}
# Log geen toegang voor statische bronnen, 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;
}
}
EOMConfiguratie van Certbot voor certificaten van Let’s Encrypt en automatische vernieuwing
— een gratis tool van de Electronic Frontier Foundation (EFF), waarmee TLS-certificaten van Let’s Encrypt kunnen worden verkregen en automatisch bijgewerkt. Het script voert de volgende acties uit om Certbot in te stellen voor het beheren van certificaten van Let’s Encrypt in NGINX:
- Stop NGINX
- Download aanbevolen TLS-instellingen
- Start Certbot om certificaten voor de site te verkrijgen
- Herstart NGINX om de certificaten te gebruiken
- Stelt dagelijks Certbot in om om 3:24 's nachts te controleren of certificaten moeten worden vernieuwd, en downloadt indien nodig nieuwe certificaten en herstart NGINX.
scriptcode
echo " NGINX stoppen om Let's Encrypt in te stellen"
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 " Aanbevolen TLS-instellingen downloaden"
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 "Kon de nieuwste options-ssl-nginx.conf niet downloaden"
fi
if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
echo " Aanbevolen TLS DH-parameters downloaden"
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 "Kon de nieuwste ssl-dhparams.pem niet downloaden"
fi
# Als tls_certs_init.sh nog niet eerder is uitgevoerd, verwijder de zelfondertekende certificaten
if [ ! -d "/etc/letsencrypt/accounts" ]; then
echo " Zelfondertekende certificaten verwijderen"
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 " Certificaten genereren met Let's Encrypt"
certbot certonly --standalone
-m "${WORDPRESS_ADMIN_EMAIL}"
${CERTBOT_STAGING_FLAG}
--agree-tos --force-renewal --non-interactive
-d "${TLS_HOSTNAME}"
fi
echo " NGINX starten om de nieuwe configuratie te gebruiken"
service nginx start
# Schrijf crontab voor periodieke verlenging van Let's Encrypt-certificaten
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
echo " Certbot aan crontab toevoegen voor automatische verlenging van Let's Encrypt"
(crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -
fiAanvullende configuratie van uw website
We hebben hierboven uitgelegd hoe ons script NGINX en NGINX Unit configureert om een productieklare website met ingeschakelde TLS/SSL te bedienen. U kunt in de toekomst, afhankelijk van uw behoeften, ook het volgende toevoegen:
- Ondersteuning , verbeterde on-the-fly compressie via HTTPS
- met , om automatische aanvallen op uw site te voorkomen
- voor WordPress, die voor u geschikt zijn
- met behulp van (op Ubuntu)
- Postfix of msmtp, zodat WordPress e-mail kan verzenden
- Controle van uw website, zodat u begrijpt hoeveel verkeer deze kan verwerken
Voor nog betere prestaties van uw website raden we aan om te upgraden naar , ons commerciële product van ondernemingsniveau, gebaseerd op open-source NGINX. Abonnees krijgen een dynamisch laadmodule Brotli, evenals (tegen een extra vergoeding) . We bieden ook , een WAF-module voor NGINX Plus, gebaseerd op toonaangevende beveiligingstechnologie van F5.
N.B. Voor ondersteuning van uw hoogbelaste website kunt u contact opnemen met onze specialisten . Wij zorgen voor een snelle en betrouwbare werking van uw website of dienst onder elke belasting.
Bron: habr.com
