ProHoster > ΠΠ»ΠΎΠ³ > Pagdumala > Pag-automate sa pag-instalar sa WordPress gamit ang NGINX Unit ug Ubuntu
Pag-automate sa pag-instalar sa WordPress gamit ang NGINX Unit ug Ubuntu
Adunay daghang mga panudlo kung giunsa ang pag-install sa WordPress, usa ka pagpangita sa Google alang sa "Pag-install sa WordPress" moabut mga tunga sa milyon nga mga resulta. Bisan pa, sa tinuud, gamay ra kaayo ang mga maayong giya sa taliwala nila, kung diin mahimo nimo i-install ug i-configure ang WordPress ug ang nagpahiping operating system aron sila adunay katakus sa pagsuporta sa taas nga panahon. Tingali ang husto nga mga setting nagsalig kaayo sa piho nga mga panginahanglan, o kini tungod sa kamatuoran nga ang usa ka detalyado nga pagpatin-aw nagpalisud sa pagbasa sa artikulo.
Niini nga artikulo, sulayan namon nga ikombinar ang labing kaayo sa duha nga kalibutan pinaagi sa paghatag usa ka bash script aron awtomatiko nga i-install ang WordPress sa Ubuntu, ingon man paglakaw pinaagi niini, pagpatin-aw kung unsa ang gibuhat sa matag piraso, ingon man ang mga pagkompromiso nga among gihimo sa pagpalambo niini. . Kung ikaw usa ka advanced user, mahimo nimong laktawan ang teksto sa artikulo ug patas kuhaa ang script alang sa pagbag-o ug paggamit sa imong mga palibot. Ang output sa script usa ka kostumbre nga pag-install sa WordPress nga adunay suporta sa Lets Encrypt, nga nagdagan sa NGINX Unit ug angay alang sa paggamit sa produksiyon.
Ang naugmad nga arkitektura alang sa pag-deploy sa WordPress gamit ang NGINX Unit gihulagway sa daan nga artikulo, karon dugangan usab namo nga i-configure ang mga butang nga wala masakop didto (sama sa daghang uban pang mga tutorial):
WordPress CLI
Atong Encrypt ug TLSSSL Certificates
Awtomatikong pagbag-o sa mga sertipiko
NGINX caching
NGINX Compression
Suporta sa HTTPS ug HTTP/2
Paghimo automation
Ihulagway sa artikulo ang pag-install sa usa ka server, nga dungan nga mag-host sa usa ka static nga server sa pagproseso, usa ka server sa pagproseso sa PHP, ug usa ka database. Ang pag-instalar nga nagsuporta sa daghang mga virtual host ug serbisyo usa ka potensyal nga hilisgutan alang sa umaabot. Kung gusto nimo nga magsulat kami bahin sa usa ka butang nga wala sa kini nga mga artikulo, isulat sa mga komento.
mga kinahanglanon
Container server (LXC o LXD), usa ka virtual machine, o usa ka regular nga iron server nga adunay labing menos 512MB nga RAM ug Ubuntu 18.04 o mas bag-o nga na-install.
Internet accessible ports 80 ug 443
Ngalan sa domain nga nalangkit sa publikong ip address niini nga server
Pag-access sa gamut (sudo).
Overview sa arkitektura
Ang arkitektura parehas sa gihulagway sa sayo pa, usa ka three-tier nga aplikasyon sa web. Naglangkob kini sa mga script sa PHP nga nagdagan sa makina sa PHP ug mga static nga file nga giproseso sa web server.
Kinatibuk-ang mga prinsipyo
Daghang mga komand sa pag-configure sa usa ka script ang giputos kung ang mga kondisyon alang sa pagka-idempotency: ang script mahimong ipadagan sa daghang beses nga walaβy peligro sa pagbag-o sa mga setting nga naa na sa lugar.
Gisulayan sa script ang pag-install sa software gikan sa mga repository, aron magamit nimo ang mga update sa sistema sa usa ka mando (apt upgrade alang sa Ubuntu).
Ang mga sugo mosulay sa pag-ila nga sila nagdagan sa usa ka sudlanan aron ilang mausab ang ilang mga setting sumala niana.
Aron mabutang ang gidaghanon sa mga proseso sa thread nga magsugod sa mga setting, ang script mosulay sa pagtag-an sa mga awtomatikong setting alang sa pagtrabaho sa mga sudlanan, virtual machine, ug hardware server.
Kung naghubit sa mga setting, kanunay namon nga gihunahuna una sa tanan ang bahin sa automation, nga, gilauman namon, mahimong sukaranan sa paghimo sa imong kaugalingon nga imprastraktura ingon code.
Ang tanan nga mga sugo gipadagan ingon nga tiggamit gamut, tungod kay gibag-o nila ang sukaranan nga mga setting sa sistema, apan direkta nga nagdagan ang WordPress ingon usa ka regular nga tiggamit.
Pag-set sa mga variable sa palibot
Ibutang ang mosunod nga mga variable sa palibot sa dili pa ipadagan ang script:
WORDPRESS_DB_PASSWORD - password sa database sa WordPress
WORDPRESS_ADMIN_USER - Ngalan sa admin sa WordPress
WORDPRESS_ADMIN_PASSWORD - Password sa admin sa WordPress
WORDPRESS_ADMIN_EMAIL - Email sa admin sa WordPress
WORDPRESS_URL mao ang bug-os nga URL sa WordPress site, sugod sa https://.
LETS_ENCRYPT_STAGING - walay sulod pinaagi sa default, apan pinaagi sa pagbutang sa bili ngadto sa 1, imong gamiton ang Let's Encrypt staging servers, nga gikinahanglan alang sa kanunay nga pagpangayo og mga sertipiko sa pagsulay sa imong mga setting, kung dili ang Let's Encrypt mahimong temporaryong babagan ang imong ip address tungod sa daghang gidaghanon sa mga hangyo .
Gisusi sa script nga kini nga mga variable nga may kalabotan sa WordPress gitakda ug mogawas kung dili.
Mga linya sa script 572-576 susiha ang bili LETS_ENCRYPT_STAGING.
Pag-set sa nakuha nga mga variable sa palibot
Ang script sa mga linya 55-61 nagtakda sa mosunod nga mga variable sa palibot, bisan sa pipila ka mga hard-coded nga bili o gamit ang usa ka bili nga nakuha gikan sa mga variable nga gibutang sa miaging seksyon:
DEBIAN_FRONTEND="noninteractive" - Gisultihan ang mga aplikasyon nga sila nagdagan sa usa ka script ug nga walaβy posibilidad sa interaksyon sa tiggamit.
WORDPRESS_CLI_VERSION="2.4.0" mao ang bersyon sa WordPress CLI nga aplikasyon.
WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" β checksum sa WordPress CLI 2.4.0 executable file (ang bersyon gipiho sa variable WORDPRESS_CLI_VERSION). Ang script sa linya 162 naggamit niini nga kantidad aron masusi nga ang tama nga WordPress CLI file na-download na.
UPLOAD_MAX_FILESIZE="16M" - ang pinakataas nga gidak-on sa file nga ma-upload sa WordPress. Kini nga setting gigamit sa daghang mga lugar, busa mas dali nga ibutang kini sa usa ka lugar.
TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" - hostname sa sistema, gikuha gikan sa WORDPRESS_URL variable. Gigamit aron makakuha ug angay nga TLS/SSL nga mga sertipiko gikan sa Let's Encrypt ingon man sa internal nga pag-verify sa WordPress.
NGINX_CONF_DIR="/etc/nginx" - agianan sa direktoryo nga adunay mga setting sa NGINX, lakip ang panguna nga file nginx.conf.
CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" β ang agianan padulong sa Let's Encrypt nga mga sertipiko para sa WordPress site, nakuha gikan sa variable TLS_HOSTNAME.
Pag-assign sa usa ka hostname sa usa ka server sa WordPress
Ang script nagtakda sa hostname sa server nga mohaum sa domain name sa site. Wala kini gikinahanglan, apan mas sayon ββββang pagpadala sa outgoing mail pinaagi sa SMTP sa dihang mag-set up sa usa ka server, nga gi-configure sa script.
code sa script
# 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
Pagdugang hostname sa /etc/hosts
Pagdugang WP-Cron gigamit sa pagpadagan sa mga regular nga buluhaton, nanginahanglan ang WordPress nga maka-access sa kaugalingon pinaagi sa HTTP. Aron masiguro nga ang WP-Cron molihok sa husto sa tanan nga mga palibot, ang script nagdugang usa ka linya sa file / Etc / panonaron ang WordPress maka-access sa kaugalingon pinaagi sa loopback interface:
code sa script
# 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
Pag-instalar sa mga himan nga gikinahanglan alang sa sunod nga mga lakang
Ang nahabilin sa script nanginahanglan pipila nga mga programa ug nagtuo nga ang mga repositoryo bag-o. Gi-update namon ang lista sa mga repositoryo, pagkahuman gi-install namon ang kinahanglan nga mga himan:
code sa script
# 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
Pagdugang NGINX Unit ug NGINX Repositories
Ang script nag-install sa NGINX Unit ug open source NGINX gikan sa opisyal nga NGINX repository aron masiguro nga ang mga bersyon nga adunay pinakabag-o nga mga patch sa seguridad ug mga pag-ayo sa bug gigamit.
Gidugang sa script ang repositoryo sa NGINX Unit ug dayon ang repositoryo sa NGINX, pagdugang sa yawe sa mga repositoryo ug mga file sa pag-configure apt, naghubit sa pag-access sa mga repositoryo pinaagi sa Internet.
Ang aktuwal nga pag-instalar sa NGINX Unit ug NGINX mahitabo sa sunod nga seksyon. Gidugangan na namo ang mga repositoryo aron dili na namo kinahanglan nga i-update ang metadata sa makadaghang higayon, nga makapapaspas sa pag-instalar.
code sa script
# 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
Pag-instalar sa NGINX, NGINX Unit, PHP MariaDB, Certbot (Let's Encrypt) ug ang ilang mga dependency
Kung madugang ang tanan nga mga repositoryo, i-update ang metadata ug i-install ang mga aplikasyon. Ang mga pakete nga gi-install sa script naglakip usab sa mga extension sa PHP nga girekomenda kung nagdagan sa WordPress.org
code sa script
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
Pag-set up sa PHP para magamit sa NGINX Unit ug WordPress
Ang script nagmugna og setting file sa direktoryo conf.d. Kini nagtakda sa pinakataas nga gidak-on sa file alang sa PHP uploads, turns sa PHP error output ngadto sa STDERR aron sila isulat ngadto sa NGINX Unit log, ug restarts sa NGINX Unit.
code sa script
# 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
Pagtino sa MariaDB Database Settings alang sa WordPress
Gipili namo ang MariaDB kay sa MySQL tungod kay kini adunay mas daghang kalihokan sa komunidad ug lagmit usab naghatag og mas maayo nga performance pinaagi sa default (tingali, ang tanan mas simple dinhi: aron ma-install ang MySQL, kinahanglan nimo nga idugang ang lain nga repositoryo, gibanabana. tighubad).
Ang script nagmugna og bag-ong database ug nagmugna og mga kredensyal aron ma-access ang WordPress pinaagi sa loopback interface:
code sa script
# 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;"
Pag-instalar sa WordPress CLI Program
Niini nga lakang, ang script nag-install sa programa WP-CLI. Uban niini, mahimo nimong i-install ug madumala ang mga setting sa WordPress nga dili kinahanglan nga mano-mano ang pag-edit sa mga file, pag-update sa database, o pagsulod sa control panel. Mahimo usab kini gamiton sa pag-instalar sa mga tema ug mga add-on ug pag-update sa WordPress.
code sa script
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
Pag-instalar ug pag-configure sa WordPress
Ang script nag-instalar sa pinakabag-o nga bersyon sa WordPress sa usa ka direktoryo /var/www/wordpressug usbon usab ang mga setting:
Ang koneksyon sa database nagtrabaho sa unix domain socket imbes sa TCP sa loopback aron maminusan ang trapiko sa TCP.
Ang WordPress nagdugang usa ka prefix https:// sa URL kung ang mga kliyente magkonektar sa NGINX sa HTTPS, ug ipadala usab ang hilit nga hostname (ingon nga gihatag sa NGINX) sa PHP. Gigamit namon ang usa ka piraso sa code aron ma-set up kini.
Ang WordPress nagkinahanglan og HTTPS alang sa pag-login
Ang default nga istruktura sa URL gibase sa mga kapanguhaan
Nagtakda sa husto nga pagtugot sa file system alang sa direktoryo sa WordPress.
code sa script
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
Pag-set up sa NGINX Unit
Ang script nag-configure sa NGINX Unit sa pagpadagan sa PHP ug pagproseso sa mga agianan sa WordPress, pagbulag sa namespace sa proseso sa PHP ug pag-optimize sa mga setting sa pasundayag. Adunay tulo ka mga bahin nga pangitaon dinhi:
Ang suporta alang sa mga namespace gitino pinaagi sa kondisyon, base sa pagsusi nga ang script nagdagan sa usa ka sudlanan. Kinahanglan kini tungod kay kadaghanan sa mga pag-setup sa sudlanan wala nagsuporta sa nested nga paglansad sa mga sudlanan.
Kung adunay suporta alang sa mga namespace, i-disable ang namespace network. Kini aron tugotan ang WordPress nga makonektar sa duha nga mga endpoint ug magamit sa web sa parehas nga oras.
Ang maximum nga gidaghanon sa mga proseso gihubit ingon sa mosunod: (Available memory para sa pagpadagan sa MariaDB ug NGINX Uniy)/(RAM limit sa PHP + 5)
Kini nga kantidad gibutang sa mga setting sa NGINX Unit.
Ang kini nga kantidad nagpasabut usab nga adunay kanunay nga labing menos duha nga mga proseso sa PHP nga nagdagan, nga hinungdanon tungod kay ang WordPress naghimo og daghang mga asynchronous nga hangyo sa kaugalingon, ug kung walaβy dugang nga mga proseso, ang pagdagan sama sa WP-Cron maguba. Mahimo nimong dugangan o pakunhuran kini nga mga limitasyon base sa imong lokal nga mga setting, tungod kay ang mga setting nga gihimo dinhi konserbatibo. Sa kadaghanan sa mga sistema sa produksiyon, ang mga setting naa sa taliwala sa 10 ug 100.
code sa script
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
Pag-set up sa NGINX
Pag-configure sa Basic NGINX Settings
Ang script nagmugna og direktoryo alang sa NGINX cache ug dayon nagmugna sa nag-unang configuration file nginx.conf. Hatagi'g pagtagad ang gidaghanon sa mga proseso sa tigdumala ug ang setting sa kinatas-ang gidak-on sa file alang sa pag-upload. Adunay usab usa ka linya nga naglakip sa compression settings file nga gihubit sa sunod nga seksyon, gisundan sa caching settings.
Ang pag-compress sa sulod dayon sa wala pa ipadala kini sa mga kliyente usa ka maayong paagi aron mapaayo ang pasundayag sa site, apan kung husto ang pag-configure sa compression. Kini nga seksyon sa script gibase sa mga setting gikan dinhi.
code sa script
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
Pag-set up sa NGINX alang sa WordPress
Sunod, ang script nagmugna og configuration file alang sa WordPress default.conf sa katalogo conf.d. Gi-configure kini dinhi:
Pag-aktibo sa mga sertipiko sa TLS nga nadawat gikan sa Let's Encrypt pinaagi sa Certbot (ang pag-set up naa sa sunod nga seksyon)
Pag-configure sa mga setting sa seguridad sa TLS base sa mga rekomendasyon gikan sa Let's Encrypt
I-enable ang caching skip requests sulod sa 1 ka oras nga default
I-disable ang pag-log sa pag-access, ingon man ang pag-log sa sayup kung wala makit-an ang file, alang sa duha nga kasagarang gihangyo nga mga file: favicon.ico ug robots.txt
Paglikay sa pag-access sa mga tinago nga mga file ug pipila ka mga file .phparon mapugngan ang ilegal nga pag-access o wala tuyoa nga pagsugod
I-disable ang pag-log sa pag-access alang sa mga static ug font nga mga file
Pagdugang routing para sa index.php ug uban pang statics.
code sa script
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
Pag-set up sa Certbot alang sa mga sertipiko gikan sa Let's Encrypt ug awtomatikong pag-renew niini
Certbot usa ka libre nga himan gikan sa Electronic Frontier Foundation (EFF) nga nagtugot kanimo nga makakuha ug awtomatiko nga magbag-o sa mga sertipiko sa TLS gikan sa Let's Encrypt. Gihimo sa script ang mosunud aron ma-configure ang Certbot aron maproseso ang mga sertipiko gikan sa Let's Encrypt sa NGINX:
Gihunong ang NGINX
Gi-download ang girekomendar nga mga setting sa TLS
Gipadagan ang Certbot aron makakuha mga sertipiko alang sa site
I-restart ang NGINX aron magamit ang mga sertipiko
Gi-configure ang Certbot nga modagan adlaw-adlaw sa 3:24 AM aron masusi kung kinahanglan ba nga bag-ohon ang mga sertipiko, ug kung kinahanglan, i-download ang mga bag-ong sertipiko ug i-restart ang NGINX.
code sa script
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
Dugang nga pag-customize sa imong site
Naghisgot kami sa taas kung giunsa ang pag-configure sa among script sa NGINX ug NGINX Unit aron magserbisyo sa usa ka site nga andam sa produksiyon nga adunay TLSSSL nga gipagana. Mahimo usab nimo, depende sa imong mga panginahanglan, makadugang sa umaabot:
suporta Brotli, gipaayo ang on-the-fly compression sa HTTPS
Postfix o msmtp aron ang WordPress makapadala ug mail
Pagsusi sa imong site aron masabtan nimo kung pila ang trapiko nga mahimo niini
Alang sa mas maayo nga performance sa site, among girekomendar ang pag-upgrade sa NGINX Plus, among komersyal, produkto nga grado sa negosyo base sa open source NGINX. Ang mga suskritor niini makadawat usa ka dinamikong gikarga nga Brotli module, ingon man (alang sa dugang nga bayad) NGINX ModSecurity WAF. Nagtanyag usab kami NGINX App Protect, usa ka WAF module para sa NGINX Plus base sa teknolohiya sa seguridad nga nanguna sa industriya gikan sa F5.
NB Alang sa suporta sa usa ka daghan kaayo nga site, mahimo nimong kontakon ang mga espesyalista habagatan nga taytayan. Among segurohon nga paspas ug kasaligan ang operasyon sa imong website o serbisyo ubos sa bisan unsang load.