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.

Pag-automate sa pag-instalar sa WordPress gamit ang NGINX Unit ug Ubuntu

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.

code sa script

# 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;
}
EOM

Pag-set up sa NGINX compression

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
  • Pagpahimutang sa ulohan Access-Control-Allow-Origin alang sa mga file sa font
  • 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
  • Mod Seguridad с mga lagda alang sa wordpressaron mapugngan ang mga awtomatikong pag-atake sa imong site
  • Pag-backup alang sa WordPress nga angay kanimo
  • Panalipod sa panabang AppArmor (sa Ubuntu)
  • 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.

Source: www.habr.com