
Det finns mÄnga resurser för att installera WordPress, en sökning pÄ Google med nyckelorden "WordPress install" ger över en halv miljon resultat. Men bland dem finns det faktiskt vÀldigt fÄ anvÀndbara guider för hur man installerar och konfigurerar WordPress och den underliggande operativsystemet sÄ att de kan stödjas under en lÀngre tid. Kanske beror de rÀtta instÀllningarna starkt pÄ specifika behov, eller sÄ handlar det om att en detaljerad förklaring gör artikeln svÄr att lÀsa.
I den hÀr artikeln kommer vi att försöka kombinera det bÀsta av tvÄ tillvÀgagÄngssÀtt genom att tillhandahÄlla ett bash-skript för automatisk installation av WordPress pÄ Ubuntu och gÄ igenom det och förklara vad varje del gör, samt vilka kompromisser vi gjorde under dess utveckling. Om du Àr en erfaren anvÀndare kan du hoppa över texten i artikeln och helt enkelt för modifiering och anvÀndning i din miljö. Utdata frÄn skriptet ger en anpassningsbar installation av WordPress med Lets Encrypt-stöd, som körs pÄ NGINX Unit och Àr lÀmplig för industriellt bruk.
Den utvecklade arkitekturen för att distribuera WordPress med hjÀlp av NGINX Unit beskrivs i , nu kommer vi ocksÄ att ytterligare konfigurera saker som inte tÀcktes dÀr (som i mÄnga andra guider):
- WordPress CLI
- Letâs Encrypt och TLS-certifikat
- Automatiska certifikatuppdateringar
- NGINX-caching
- NGINX-komprimering
- Stöd för HTTPS och HTTP/2
- Automatisering av processen
Artikeln kommer att beskriva installationen pÄ en server dÀr bÄde statisk innehÄllsserver, PHP-behandlingsserver och databas kommer att placeras samtidigt. Installation med stöd för flera virtuella vÀrdar och tjÀnster Àr en potentiell framtida Àmne. Om du vill att vi ska skriva om nÄgot som inte finns i dessa artiklar, skriv i kommentarerna.
Krav
- Server-container ( eller ), en virtuell maskin eller en vanlig hÄrdvaruserver, med minst 512 MB RAM och Ubuntu 18.04 eller nyare installerat.
- TillgÀngliga portar 80 och 443 frÄn internet
- Ett domÀnnamn kopplat till den offentliga IP-adressen för denna server
- à tkomst med root-rÀttigheter (sudo).
Ăversikt över arkitekturen
Arkitekturen Àr densamma som tidigare beskrivet , en tre-nivÄ webapplikation. Den bestÄr av PHP-skript som körs pÄ PHP-hanteraren och statiska filer som hanteras av webbservern.

AllmÀnna principer
- MÄnga kommandon för konfiguration i skriptet Àr omslutna i villkor (if) för idempotens: skriptet kan köras flera gÄnger utan risk för att Àndra instÀllningar som redan Àr klara.
- Skriptet försöker installera programvara frÄn repositoryn, sÄ att du kan anvÀnda systemuppdateringar med ett enda kommando (
apt upgradeför Ubuntu). - Kommandona försöker avgöra om de körs i en container för att Àndra sina instÀllningar pÄ lÀmpligt sÀtt.
- För att stĂ€lla in antalet processer/trĂ„dar som ska köras i instĂ€llningarna försöker skriptet gissa automatiska konfigurationsparametrar för att arbeta i containrar, virtuella maskiner och âfysiskaâ servrar.
- NÀr vi beskriver instÀllningar tÀnker vi alltid först pÄ automatisering, som vi hoppas kommer att ligga till grund för skapandet av din egen infrastruktur som kod.
- Alla kommandon körs av anvÀndare root, eftersom de Àndrar grundlÀggande systeminstÀllningar, men WordPress körs direkt av en vanlig anvÀndare.
InstÀllning av miljövariabler
StÀll in följande miljövariabler innan du kör skriptet:
WORDPRESS_DB_PASSWORDâ lösenordet för WordPress-databasenWORDPRESS_ADMIN_USERâ anvĂ€ndarnamn för WordPress-administratörenWORDPRESS_ADMIN_PASSWORDâ lösenord för WordPress-administratörenWORDPRESS_ADMIN_EMAILâ e-postadress för WordPress-administratörenWORDPRESS_URLâ fullstĂ€ndig URL för WordPress-webbplatsen, som börjar medhttps://.LETS_ENCRYPT_STAGINGâ som Ă€r tomt som standard, men genom att stĂ€lla in vĂ€rdet till 1 kommer du att anvĂ€nda Letâs Encrypts staging-servrar, vilket Ă€r nödvĂ€ndigt för att ofta begĂ€ra certifikat nĂ€r du testar dina instĂ€llningar, annars kan Letâs Encrypt tillfĂ€lligt blockera din IP-adress pĂ„ grund av ett stort antal förfrĂ„gningar.
Skriptet kontrollerar att dessa relaterade WordPress-variabler Àr instÀllda och avslutar om de inte Àr det.
Raderna 572-576 i skriptet kontrollerar vÀrdet LETS_ENCRYPT_STAGING.
InstÀllning av hÀrledda miljövariabler
Skriptet pÄ raderna 55-61 stÀller in följande miljövariabler, antingen till ett visst fast vÀrde eller med hjÀlp av ett vÀrde som hÀmtats frÄn variabler som stÀllts in i föregÄende avsnitt:
DEBIAN_FRONTEND="noninteractive"â informerar applikationerna om att de startas i skriptet och att anvĂ€ndarkontakt inte Ă€r möjlig.WORDPRESS_CLI_VERSION="2.4.0"â version av WordPress CLI.WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c"â kontrollsumma för körbar fil WordPress CLI 2.4.0 (versionen anges i variabelnWORDPRESS_CLI_VERSION). Skriptet pĂ„ rad 162 anvĂ€nder detta vĂ€rde för att kontrollera att rĂ€tt fil WordPress CLI har laddats ner.UPLOAD_MAX_FILESIZE="16M"â den maximala filstorleken som kan laddas upp till WordPress. Denna instĂ€llning anvĂ€nds pĂ„ flera stĂ€llen, sĂ„ det Ă€r enklare att definiera den pĂ„ ett stĂ€lle.TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'\/ -f3)"â vĂ€rdnamn för systemet, utvinner frĂ„n variabeln WORDPRESS_URL. AnvĂ€nds för att fĂ„ motsvarande TLS/SSL-certifikat frĂ„n Letâs Encrypt, samt för intern kontroll av WordPress.NGINX_CONF_DIR="\/etc\/nginx"â sökvĂ€g till katalogen med NGINX-instĂ€llningar, inklusive huvudfilennginx.conf.CERT_DIR="\/etc\/letsencrypt\/live\/${TLS_HOSTNAME}"â sökvĂ€gen till Letâs Encrypt-certifikat för WordPress-webbplatsen, hĂ€mtat frĂ„n variabelnTLS_HOSTNAME.
Tilldelning av vÀrdnamn till WordPress-servern
Skriptet stÀller in serverns vÀrdnamn sÄ att vÀrdet motsvarar webbplatsens domÀnnamn. Detta Àr inte nödvÀndigt, men det Àr enklare att skicka utgÄende e-post via SMTP nÀr man konfigurerar en enda server, som det stÀlls in av skriptet.
skriptkod
# 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}"
fiLÀgga till vÀrdnamn i \/etc\/hosts
TillÀgg anvÀnds för att köra periodiska uppgifter, krÀver att WordPress kan nÄ sig sjÀlv via HTTP. För att sÀkerstÀlla att WP-Cron fungerar korrekt i alla miljöer, lÀgger skriptet till en rad i filen /etc/hosts, sÄ att WordPress kan nÄ sig sjÀlv via loopback-grÀnssnittet:
skriptkod
# 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
fiInstallation av verktyg som krÀvs för efterföljande steg
Den ÄterstÄende delen av skriptet behöver vissa program och förutsÀtter att lagren Àr aktuella. Vi uppdaterar listan över lagren, och installerar sedan de nödvÀndiga verktygen:
skriptkod
# 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-releaseLĂ€gg till NGINX Unit och NGINX-lager
Skriptet installerar NGINX Unit och NGINX frÄn de officiella NGINX-lagerna för att sÀkerstÀlla att versioner med de senaste sÀkerhetsuppdateringarna och bugfixarna anvÀnds.
Skriptet lÀgger till NGINX Unit-lagret, följt av NGINX-lagret, genom att lÀgga till nyckeln för lagren och konfigurationsfilerna apt, som anger tillgÄng till lagren via internet.
Den faktiska installationen av NGINX Unit och NGINX sker i nÀsta avsnitt. Vi lÀgger till repositoryn i förvÀg för att slippa uppdatera metadata flera gÄnger, vilket gör installationen snabbare.
skriptkod
# 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
fiInstallation av NGINX, NGINX Unit, PHP MariaDB, Certbot (Letâs Encrypt) och deras beroenden
SÄ snart alla repositoryn har lagts till, uppdaterar vi metadata och installerar applikationerna. Paketen som installeras av skriptet inkluderar ocksÄ PHP-tillÀgg som rekommenderas vid installationen av WordPress.org
skriptkod
echo " Uppdaterar repositorymetadata"
apt-get -qq update
# Installera PHP med beroenden och NGINX Unit
echo " Installerar PHP, NGINX Unit, NGINX, Certbot och 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-serverKonfigurera PHP för anvÀndning med NGINX Unit och WordPress
Skriptet skapar en konfigurationsfil i katalogen conf.d. HÀr anges den maximala filstorleken för uppladdningar till PHP, PHP-felmeddelanden aktiveras i STDERR sÄ att de registreras i NGINX Unit-loggen, och NGINX Unit startas om.
skriptkod
# 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 restartInstÀllning av databasinstÀllningar för MariaDB för WordPress
Vi valde MariaDB istÀllet för MySQL eftersom den har ett större samhÀllsengagemang, dessutom kan den (troligtvis Àr det enklare: för att installera MySQL mÄste vi lÀgga till ytterligare ett repository, anm. översÀttare).
Skriptet skapar en ny databas och skapar inloggningsuppgifter för Ätkomst till WordPress via loopback-grÀnssnittet:
skriptkod
# 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;"Installation av WordPress CLI
I det hÀr steget installerar skriptet programmet . Med detta kan du installera och hantera WordPress-instÀllningar utan att behöva redigera filer manuellt, uppdatera databasen eller logga in pÄ kontrollpanelen. Du kan ocksÄ installera teman och tillÀgg samt utföra WordPress-uppdateringar.
skriptkod
if [ ! -f /usr/local/bin/wp ]; then
# Installera WordPress CLI
echo " Installerar WordPress CLI-verktyget"
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
fiInstallation och konfiguration av WordPress
Skriptet installerar den senaste versionen av WordPress i katalogen /var/www/wordpress, och Àndrar Àven instÀllningarna:
- Anslutningen till databasen fungerar via unix-domÀnsocket istÀllet för TCP pÄ loopback för att minska TCP-trafiken.
- WordPress lÀgger till prefix https:// till URL: om kunder ansluter till NGINX via HTTPS-protokollet, samt skickar den fjÀrrhostname (som tillhandahÄlls av NGINX) till PHP. Vi anvÀnder en kodsnutt för att konfigurera detta.
- WordPress krÀver HTTPS för inloggning
- Standard URL-struktur baseras pÄ resurser
- RÀtt behörigheter sÀtts pÄ filsystemet för WordPress-katalogen.
skriptkod
if [ ! -d /var/www/wordpress ]; then
# Skapa WordPress-kataloger
mkdir -p /var/www/wordpress
chown -R www-data:www-data /var/www
# Ladda ner WordPress med WordPress CLI
echo "Installerar 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}'"
# Denna kodsnutt injiceras i wp-config.php-filen nÀr den skapas;
# den informerar WordPress att vi Àr bakom en omvÀnd proxy och pÄ sÄ sÀtt
# gör det möjligt för den att generera lÀnkar med HTTPS
cat > /tmp/wp_forwarded_for.php << 'EOM'
/* Aktivera HTTPS om HTTP_X_FORWARDED_PROTO matchar '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
# Skapa WordPress-konfiguration
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
# Installera 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
# SĂ€tt permalink-struktur till en vettig standard som inte finns i UI
su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data
# Ta bort exempelarkivet eftersom det Àr skrÀp och kan vara ett sÀkerhetsproblem
rm /var/www/wordpress/wp-config-sample.php
# Se till att WordPress-behörigheterna Àr korrekta
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
fiKonfiguration av NGINX Unit
Skriptet konfigurerar NGINX Unit för att köra PHP och hantera vÀgar i WordPress, isolera namnrymden för PHP-processerna och optimera prestanda. Det finns tre funktioner att notera:
- Stöd för namnrymder definieras av ett villkor, baserat pÄ att skrapet körs i en container. Detta Àr nödvÀndigt eftersom de flesta containerinstÀllningar inte stödjer inbÀddade containeranrop.
- Om namnrymdsstöd finns, inaktiveras namnrymden nÀtverk. Detta Àr nödvÀndigt för att möjliggöra att WordPress ansluter bÄde till endpoints och Àr tillgÀngligt pÄ internet.
- Det maximala antalet processer bestÀms enligt följande: (TillgÀngligt minne för körda MariaDB och NGINX Uniy)/(grÀns för RAM i PHP + 5)
Detta vÀrde anges i NGINX Unit-instÀllningarna.
Detta vÀrde innebÀr ocksÄ att det alltid finns minst tvÄ körda PHP-processer, vilket Àr viktigt eftersom WordPress gör mÄnga asynkrona anrop till sig sjÀlv, och utan ytterligare processer kommer det till exempel, WP-Cron, att sluta fungera. Du kanske vill öka eller minska dessa grÀnser baserat pÄ dina lokala instÀllningar, eftersom de instÀllningar som skapats hÀr Àr konservativa. I de flesta produktionssystem ligger instÀllningarna mellan 10 och 100.
skriptkod
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 " BerÀknade det maximala antalet PHP-processer som ${MAX_PHP_PROCESSES}. Du kanske vill justera detta vÀrde pÄ grund av variationer i din konfiguration. Det Àr inte ovanligt att se vÀrden mellan 10-100 i produktionskonfigurationer."
echo " Konfigurerar NGINX Unit för att anvÀnda PHP och 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/configKonfiguration av NGINX
InstÀllning av NGINX:s grundlÀggande parametrar
Skriptet skapar en katalog för NGINX-cache och dÀrefter skapar det huvudkonfigurationsfilen nginx.confObservera antalet processhanterare och ange den maximala storleken för uppladdningar. Det finns ocksÄ en rad som ansluter en fil för komprimeringsinstÀllningar, som definieras i nÀsta avsnitt, följt av cache-instÀllningar.
skriptkod
# 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;
}
EOMKonfigurering av NGINX-komprimering
Att komprimera innehÄll i realtid innan det skickas till kunderna Àr ett utmÀrkt sÀtt att förbÀttra webbplatsens prestanda, men endast om komprimeringen Àr korrekt instÀlld. Det hÀr avsnittet av skriptet Àr baserat pÄ instÀllningarna. .
skriptkod
cat > ${NGINX_CONF_DIR}/gzip_compression.conf << 'EOM'
# Kredit: https://github.com/h5bp/server-configs-nginx/
# ----------------------------------------------------------------------
# | Komprimering |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Aktivera gzip-komprimering.
# Standard: av
gzip on;
# KomprimeringsnivÄ (1-9).
# 5 Àr en perfekt kompromiss mellan storlek och CPU-anvÀndning, vilket ger cirka 75%
# minskning för de flesta ASCII-filer (nÀstan identisk med nivÄ 9).
# Standard: 1
gzip_comp_level 6;
# Komprimera inte nÄgot som redan Àr litet och osannolikt att krympa mycket om
# överhuvudtaget (standard Àr 20 byte, vilket Àr dÄligt dÄ det vanligtvis leder till större
# filer efter gzipping).
# Standard: 20
gzip_min_length 256;
# Komprimera data Àven för klienter som ansluter till oss via proxys,
# identifierade av "Via"-huvudet (obligatoriskt för CloudFront).
# Standard: av
gzip_proxied any;
# BerÀtta för proxys att cacha bÄde den gzippade och vanliga versionen av en resurs
# nÀr som helst klientens Accept-Encoding kapabiliteter huvud varierar;
# Undviker problemet dÀr en icke-gzip-förmögen klient (vilket Àr extremt sÀllsynt
# idag) skulle visa nonsens om deras proxy gav dem den gzippade versionen.
# Standard: av
gzip_vary on;
# Komprimera all utdata mÀrkt med en av följande MIME-typer.
# `text/html` komprimeras alltid av gzip-modulen.
# Standard: 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;
EOMKonfigurering av NGINX för WordPress
DÀrefter skapar skriptet en konfigurationsfil för WordPress default.conf i katalogen conf.dHÀr konfigureras:
- Aktivering av TLS-certifikat erhĂ„llna frĂ„n Letâs Encrypt via Certbot (dess konfiguration kommer att finnas i nĂ€sta avsnitt)
- InstĂ€llning av sĂ€kerhetsparametrar för TLS, baserat pĂ„ rekommendationer frĂ„n Letâs Encrypt
- Aktivering av caching för förbigÄngna förfrÄgningar i 1 timme som standard
- Inaktivering av Ätkomstloggning samt fel-loggning, om filen inte hittas, för tvÄ vanliga begÀrda filer: favicon.ico och robots.txt
- Förbjud tillgÄng till dolda filer och vissa filer .php, för att förhindra obehörig Ätkomst eller oavsiktlig körning
- Inaktivera Ätkomstloggning för statiska resurser och typarchiv
- Ange rubrik för typarchiv
- LÀgg till routing för index.php och andra statiska resurser.
skriptkod
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-utmaning som anvÀnds av Certbot för 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-konfiguration
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-cache
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;
}
# Förbjuda alla försök att komma Ät dolda filer som .htaccess, .htpasswd,
# .DS_Store (Mac)
# BehÄll loggning av begÀrningar för senare (eller för att vidarebefordra till brandvÀggsverktyg
# som fail2ban)
location ~ \/. {
deny all;
}
# Förbjuda Ätkomst till alla filer med en .php-tillÀgg i uppladdningskatalogen;
# fungerar i underkataloginstallations och Àven i fleranvÀndarnÀtverk.
# BehÄll loggning av begÀrningar för senare (eller för att vidarebefordra till brandvÀggsverktyg
# som fail2ban).
location ~* \/(?:uploads|files)\/.*.php$ {
deny all;
}
# WordPress: förbjuda Ätkomst till wp-content, wp-includes PHP-filer
location ~* ^\/(?:wp-content|wp-includes)\/.*.php$ {
deny all;
}
# Förbjuda offentlig Ätkomst till wp-config.php
location ~* wp-config.php {
deny all;
}
# Logga inte Ätkomst för statiska tillgÄngar, 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;
}
}
EOMInstĂ€llning av Certbot för certifikat frĂ„n Letâs Encrypt och automatisk förnyelse
Ă€r ett gratis verktyg frĂ„n Electronic Frontier Foundation (EFF) som gör det möjligt att fĂ„ och automatiskt uppdatera TLS-certifikat frĂ„n Letâs Encrypt. Skriptet utför följande Ă„tgĂ€rder för att konfigurera Certbot för hantering av certifikat frĂ„n Letâs Encrypt i NGINX:
- Stoppar NGINX
- Laddar ner rekommenderade TLS-instÀllningar
- Startar Certbot för att fÄ certifikat för webbplatsen
- Startar om NGINX för att anvÀnda certifikaten
- Konfigurerar daglig körning av Certbot klockan 03:24 för att kontrollera behovet av att förnya certifikat, samt om nödvÀndigt, hÀmta nya certifikat och starta om NGINX.
skriptkod
echo " Stoppar NGINX för att stÀlla in 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 " Laddar ner rekommenderade TLS-instÀllningar"
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 "Kunde inte ladda ner senaste options-ssl-nginx.conf"
fi
if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
echo " Laddar ner rekommenderade TLS DH-instÀllningar"
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 "Kunde inte ladda ner senaste ssl-dhparams.pem"
fi
# Om tls_certs_init.sh inte har körts tidigare, ta bort de sjÀlvsignerade certifikaten
if [ ! -d "/etc/letsencrypt/accounts" ]; then
echo " Tar bort sjÀlvsignerade certifikat"
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 " Genererar certifikat med Let's Encrypt"
certbot certonly --standalone
-m "${WORDPRESS_ADMIN_EMAIL}"
${CERTBOT_STAGING_FLAG}
--agree-tos --force-renewal --non-interactive
-d "${TLS_HOSTNAME}"
fi
echo " Startar NGINX för att anvÀnda ny konfiguration"
service nginx start
# Skriver crontab för periodisk förnyelse av Let's Encrypt certifikat
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
echo " LÀgger till certbot i crontab för automatisk förnyelse av Let's Encrypt"
(crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -
fiYtterligare instÀllning av din webbplats
Vi har ovan beskrivit hur vÄrt skript konfigurerar NGINX och NGINX Unit för att driva en webbplats som Àr redo för industriell anvÀndning med aktiverad TLS/SSL. Du kan ocksÄ, beroende pÄ dina behov, lÀgga till i framtiden:
- Stöd för , förbÀttrad komprimering i realtid över HTTPS
- med , för att förhindra automatiska attacker mot din webbplats
- för WordPress, som passar dig
- med hjÀlp av (pÄ Ubuntu)
- Postfix eller msmtp sÄ att WordPress kan skicka e-post
- Kontroller av din webbplats sÄ att du förstÄr hur mycket trafik den kan hantera
För Ànnu bÀttre webbprestanda rekommenderar vi att du uppgraderar till , vÄr kommersiella företagsprodukt baserad pÄ den öppna kÀllkoden NGINX. Prenumeranter fÄr en dynamiskt laddad Brotli-modul samt (mot extra kostnad) . Vi erbjuder Àven , WAF-modul för NGINX Plus, baserad pÄ branschledande sÀkerhetsteknik frÄn F5.
N.B. För support av högtrafikerade webbplatser kan du kontakta specialister . Vi sÀkerstÀller snabb och pÄlitlig drift av din webbplats eller tjÀnst under alla belastningar.
KĂ€lla: habr.com
