
Et gĂ«tt vill Installatiounsmaterialien. WordPress, Google Sich no SchlĂ«sselwierder "WordPress "install" gĂ«tt ongefĂ©ier eng hallef Millioun Resultater. Ănnert hinnen ginn et awer tatsĂ€chlech ganz wĂ©ineg nĂ«tzlech Guiden fir d'Installatioun an d'Konfiguratioun. WordPress an dat zugronnleeĂ«nd Betribssystem, fir datt se iwwer eng laang ZĂ€it Ă«nnerstĂ«tzt kĂ«nne ginn. VlĂ€icht hĂ€nken dĂ©i richteg Astellungen staark vun de spezifesche Bedierfnesser of, oder vlĂ€icht lĂ€it dat dorun, datt dĂ©i detaillĂ©iert ErklĂ€rung den Artikel schwĂ©ier ze liesen mĂ©cht.
An dĂ«sem Artikel wĂ€erte mir probĂ©ieren dat Bescht aus bĂ©iden Approchen ze kombinĂ©ieren andeems mir e Bash-Skript fir automatesch Installatioun ubidden. WordPress op UbuntuMir wĂ€erten et och duerchgoen, erklĂ€ren, wat all StĂ©ck mĂ©cht a wĂ©i eng KompromĂ«sser mir bei senger EntwĂ©cklung gemaach hunn. Wann Dir en erfuerene Benotzer sidd, kĂ«nnt Dir den Text iwwersprangen an einfach ... fir Modifikatioun an Notzung an Ăren Ămfeld. D'Skriptausgab ass eng personalisĂ©iert Installatioun. WordPress mat Let's Encrypt ĂnnerstĂ«tzung, leeft op NGINX Unit a gĂ«eegent fir Produktiounsgebrauch.
Entwéckelt Architektur fir den Asaz WordPress D'Benotzung vun der NGINX Eenheet gëtt beschriwwen an , 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 ( oder ), eng virtuell Maschinn oder e regulÀre Hardwareserver mat mindestens 512 MB RAM an installéiert Ubuntu 18.04 oder méi spéit.
- 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 , 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 upgradefir 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'Haaptsystemastellungen Ă€nneren, awer direkt WordPress funktionĂ©iert vun engem normale Benotzer.
Ămfeld VerĂ€nnerlechen Astellung
Setzt dĂ©i folgend Ămfeldvariablen ier Dir de Skript leeft:
WORDPRESS_DB_PASSWORDâ Passwuert fir d'Datebank WordPressWORDPRESS_ADMIN_USERâ den Numm vum Administrateur WordPressWORDPRESS_ADMIN_PASSWORDâ Administrateurpasswuert WordPressWORDPRESS_ADMIN_EMAILâ E-Mail vum Administrateur WordPressWORDPRESS_URLâ komplett WebsĂ€it-URL WordPress, ugefaange mathttps://.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 ob dës verbonne sinn WordPress Variabelen sinn gesat, a gëtt ausgeschloss, 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"â Applikatiounsversioun WordPress CLI.WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c"â Kontrollsum vun der ausfĂŒhrbarer Datei WordPress CLI 2.4.0 (d'Versioun ass an der Variabel spezifizĂ©iert)WORDPRESS_CLI_VERSIONDe Skript an der Zeil 162 benotzt dĂ«se WĂ€ert fir ze kontrollĂ©ieren, ob dĂ©i richteg Datei erofgeluede gouf. WordPress CLI.UPLOAD_MAX_FILESIZE="16M"â dĂ©i maximal DateigrĂ©isst, dĂ©i eropgeluede ka ginn WordPressDĂ«s Astellung gĂ«tt op verschiddene Plazen benotzt, dofir ass et mĂ©i einfach, se op enger Plaz anzestellen.TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)"â den Hostnumm vum System, ofgeruff vun der Variabel WORDPRESS_URL. GĂ«tt benotzt fir dĂ©i entspriechend TLS/SSL-Zertifikater vu Let's Encrypt ze krĂ©ien, souwĂ©i fir intern VerifizĂ©ierung. WordPress.NGINX_CONF_DIR="/etc/nginx"- Wee an de Verzeechnes mat NGINX Astellungen, dorĂ«nner d'Haaptdateinginx.conf.CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}"â Wee zu de Let's Encrypt Zertifikater fir d'WebsĂ€it WordPress, kritt aus enger VariabelTLS_HOSTNAME.
Hostnumm-Zouweisung 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}"
fiFĂŒĂŒgt Hostnumm op /etc/hosts
Addition benotzt fir periodesch Aufgaben auszefĂ©ieren, erfuerdert datt WordPress konnt sech iwwer HTTP zougrĂ€ifen. Fir sĂ©cherzestellen, datt WP-Cron an allen Ămfeld richteg funktionĂ©iert, fĂŒĂŒgt de Skript eng Zeil an d'Datei bĂ€i. / etc / hun, esou WordPress kann iwwer d'Loopback-Interface op sech 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
fiInstallé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-releaseNGINX 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
fiInstalléiere vun NGINX, NGINX Unit, PHP MariaDB, Certbot (Let's Encrypt) an hir OfhÀngegkeeten
Soubal all d'Repositories derbÀigesat sinn, aktualiséiere mir d'Metadaten an installéieren d'Applikatiounen. D'Packagen, déi vum Skript installéiert ginn, enthalen och PHP-Extensiounen, déi beim Start recommandéiert ginn. WordPress.org
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-serverPHP fir d'Benotzung mat NGINX Unit konfiguréieren an WordPress
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 restartD'Astellungen vun der MariaDB-Datebank opsetzen WordPress
Mir hunn MariaDB iwwer MySQL gewielt well et méi Gemeinschaftsaktivitéit huet an och méiglech ass (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 Zougangsdaten. 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;"Programm Installatioun WordPress CLI
Op dësem Schrëtt installéiert de Skript de Programm Mat senger Hëllef kënnt Dir Astellungen konfiguréieren a verwalten WordPress ouni datt Dir Dateien manuell Ànnere musst, d'Datebank aktualiséiere musst oder Iech am Kontrollpanel aloggen musst. Et kann och benotzt ginn fir Themen an Add-ons z'installéieren an Updates duerchzeféieren. WordPress.
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
fiInstallatioun a Konfiguratioun WordPress
De Skript installéiert déi lescht Versioun WordPress ze katalogiséieren /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 derbĂ€i 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 HTTPS ass néideg fir sech unzemellen
- D'Standard URL Struktur baséiert op Ressourcen
- Déi richteg Dateisystemrechter sinn fir den Dossier agestallt. WordPress.
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}" --data-gt-translate-attributes='["title"]' 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
fiNGINX Eenheet opbauen
De Skript konfiguréiert d'NGINX Unit fir PHP auszeféieren a Weeër ze behandelen. WordPress, den PHP-Prozess-Namespace ze isoléieren an d'Performance-Astellungen ze optimiséieren. Et ginn drÀi Funktiounen, déi et wÀert sinn ze bemierken:
- Ă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 NetzDĂ«st ass nĂ©ideg fir ze ermĂ©iglechen WordPress glĂ€ichzĂ€iteg mat Endpunkten verbannen a um Internet zougĂ€nglech 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 mindestens zwee PHP-Prozesser lafen, wat wichteg ass, well WordPress mĂ©cht vill asynchron Ufroen u sech selwer, an ouni zousĂ€tzlech Prozesser wĂ€ert d'AusfĂ©ierung vu zum Beispill WP-Cron klappen. Dir kĂ«nnt dĂ«s Limitte jee no Ăre lokalen Astellungen erhĂ©ijen oder reduzĂ©ieren, well d'Astellungen, dĂ©i hei erstallt ginn, konservativ sinn. Op de meeschte Produktiounssystemer leien 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/configNGINX 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.
Skript Code
# 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;
}
EOMNGINX Kompressioun opsetzen
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 .
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;
EOMNGINX opsetzen fir WordPress
Duerno 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
- Header Astellung fir Schrëftdateien
- FĂŒĂŒgt Routing fir index.php an aner Statik.
Skript Code
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;
}
}
EOMCertbot opzestellen fir Zertifikater vu Let's Encrypt an automatesch ze erneieren
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 -
fiZousĂ€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 , verbessert On-the-Fly Kompressioun iwwer HTTPS
- Ń fir automatisĂ©iert Attacken op Ărem Site ze verhĂ«nneren
- fir WordPress, gëeegent fir Iech
- mat der Hëllef vun (um Ubuntu)
- Postfix oder msmtp un WordPress kéint e Mail schécken
- 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 , 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) . Mir bidden och , 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 . Mir garantĂ©ieren eng sĂ©ier an zouverlĂ€sseg Operatioun vun Ărer WebsĂ€it oder Service Ă«nner all Laascht.
Source: will.com
