WordPress instalÄ“Å”anas automatizācija, izmantojot NGINX Unit un Ubuntu

WordPress instalÄ“Å”anas automatizācija, izmantojot NGINX Unit un Ubuntu

Ir daudz apmācÄ«bas par to, kā instalēt WordPress, Google meklÄ“Å”ana ar "WordPress install" parādÄ«s aptuveni pusmiljonu rezultātu. Tomēr patiesÄ«bā starp tiem ir ļoti maz labu ceļvežu, saskaņā ar kuriem jÅ«s varat instalēt un konfigurēt WordPress un pamatā esoÅ”o operētājsistēmu, lai tās varētu atbalstÄ«t ilgu laiku. Iespējams, pareizie iestatÄ«jumi ir ļoti atkarÄ«gi no konkrētām vajadzÄ«bām, vai arÄ« tas ir saistÄ«ts ar faktu, ka detalizēts skaidrojums apgrÅ«tina raksta lasÄ«Å”anu.

Å ajā rakstā mēs centÄ«simies apvienot labāko no abām pasaulēm, nodroÅ”inot bash skriptu, lai automātiski instalētu WordPress Ubuntu, kā arÄ« izietu to cauri, izskaidrojot katras daļas darbÄ«bu, kā arÄ« kompromisus, ko pieļāvām, izstrādājot to. . Ja esat pieredzējis lietotājs, varat izlaist raksta tekstu un vienkārÅ”i paņem skriptu pārveidoÅ”anai un lietoÅ”anai jÅ«su vidē. Skripta izvade ir pielāgota WordPress instalācija ar Lets Encrypt atbalstu, kas darbojas NGINX vienÄ«bā un ir piemērota ražoÅ”anas lietoÅ”anai.

Izstrādātā arhitektÅ«ra WordPress izvietoÅ”anai, izmantojot NGINX vienÄ«bu, ir aprakstÄ«ta vecāks raksts, tagad mēs arÄ« turpmāk konfigurēsim lietas, kas tur nebija aplÅ«kotas (kā daudzās citās apmācÄ«bās):

  • WordPress CLI
  • Å ifrēsim un TLSSSL sertifikātus
  • Automātiska sertifikātu atjaunoÅ”ana
  • NGINX keÅ”atmiņa
  • NGINX kompresija
  • HTTPS un HTTP/2 atbalsts
  • Procesu automatizācija

Rakstā tiks aprakstÄ«ta instalÄ“Å”ana vienā serverÄ«, kurā vienlaikus tiks mitināts statiskās apstrādes serveris, PHP apstrādes serveris un datu bāze. Instalācija, kas atbalsta vairākus virtuālos saimniekdatorus un pakalpojumus, ir potenciāls nākotnes temats. Ja vēlaties, lai mēs rakstām par kaut ko, kas nav Å”ajos rakstos, rakstiet komentāros.

Prasības

  • Konteinera serveris (LXC vai LXD), virtuālā maŔīna vai parasts dzelzs serveris ar vismaz 512 MB RAM un instalēta Ubuntu 18.04 vai jaunāka versija.
  • Internetam pieejams ports 80 un 443
  • Domēna nosaukums, kas saistÄ«ts ar Ŕī servera publisko IP adresi
  • Saknes piekļuve (sudo).

Arhitektūras pārskats

Arhitektūra ir tāda pati kā aprakstīts pirms tam, trīs līmeņu tīmekļa lietojumprogramma. Tas sastāv no PHP skriptiem, kas darbojas PHP dzinējā, un statiskiem failiem, kurus apstrādā tīmekļa serveris.

WordPress instalÄ“Å”anas automatizācija, izmantojot NGINX Unit un Ubuntu

Vispārējie principi

  • Daudzas skripta konfigurācijas komandas ir iesaiņotas idempotences apstākļos: skriptu var palaist vairākas reizes, neriskējot mainÄ«t jau esoÅ”os iestatÄ«jumus.
  • Skripts mēģina instalēt programmatÅ«ru no krātuvēm, lai jÅ«s varētu lietot sistēmas atjauninājumus vienā komandā (apt upgrade Ubuntu).
  • Komandas mēģina noteikt, ka tās darbojas konteinerā, lai tās varētu attiecÄ«gi mainÄ«t savus iestatÄ«jumus.
  • Lai iestatÄ«jumos iestatÄ«tu iesākamo pavedienu procesu skaitu, skripts mēģina uzminēt automātiskos iestatÄ«jumus darbam konteineros, virtuālajās maŔīnās un aparatÅ«ras serveros.
  • Aprakstot iestatÄ«jumus, mēs vienmēr vispirms domājam par automatizāciju, kas, mēs ceram, kļūs par pamatu, lai izveidotu savu infrastruktÅ«ru kā kodu.
  • Visas komandas tiek izpildÄ«tas kā lietotājs sakne, jo tie maina pamata sistēmas iestatÄ«jumus, bet tieÅ”i WordPress darbojas kā parasts lietotājs.

Vides mainīgo iestatīŔana

Pirms skripta palaiŔanas iestatiet Ŕādus vides mainīgos:

  • WORDPRESS_DB_PASSWORD - WordPress datu bāzes parole
  • WORDPRESS_ADMIN_USER - WordPress administratora vārds
  • WORDPRESS_ADMIN_PASSWORD - WordPress administratora parole
  • WORDPRESS_ADMIN_EMAIL - WordPress administratora e-pasts
  • WORDPRESS_URL ir pilns WordPress vietnes URL, sākot no https://.
  • LETS_ENCRYPT_STAGING - pēc noklusējuma tukÅ”s, bet, iestatot vērtÄ«bu uz 1, jÅ«s izmantosiet Encrypt inscenÄ“Å”anas serverus, kas ir nepiecieÅ”ami bieži sertifikātu pieprasÄ«Å”anai, pārbaudot iestatÄ«jumus, pretējā gadÄ«jumā Let's Encrypt var Ä«slaicÄ«gi bloķēt jÅ«su ip adresi lielā pieprasÄ«jumu skaita dēļ. .

Skripts pārbauda, ā€‹ā€‹vai Å”ie ar WordPress saistÄ«tie mainÄ«gie ir iestatÄ«ti, un iziet, ja nē.
Skripta rindiņas 572-576 pārbauda vērtību LETS_ENCRYPT_STAGING.

Atvasināto vides mainīgo iestatīŔana

Skripts 55.ā€“61. rindiņā iestata Ŕādus vides mainÄ«gos vai nu uz kādu cieti kodētu vērtÄ«bu, vai izmantojot vērtÄ«bu, kas iegÅ«ta no iepriekŔējā sadaļā iestatÄ«tajiem mainÄ«gajiem:

  • DEBIAN_FRONTEND="noninteractive" - norāda lietojumprogrammām, ka tās darbojas skriptā un ka nav iespējama lietotāja mijiedarbÄ«ba.
  • WORDPRESS_CLI_VERSION="2.4.0" ir WordPress CLI lietojumprogrammas versija.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" ā€” WordPress CLI 2.4.0 izpildāmā faila kontrolsumma (versija ir norādÄ«ta mainÄ«gajā WORDPRESS_CLI_VERSION). Skripts 162. rindā izmanto Å”o vērtÄ«bu, lai pārbaudÄ«tu, vai ir lejupielādēts pareizais WordPress CLI fails.
  • UPLOAD_MAX_FILESIZE="16M" - maksimālais faila lielums, ko var augÅ”upielādēt programmā WordPress. Å is iestatÄ«jums tiek izmantots vairākās vietās, tāpēc to ir vieglāk iestatÄ«t vienā vietā.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" - sistēmas resursdatora nosaukums, izgÅ«ts no WORDPRESS_URL mainÄ«gā. Izmanto, lai iegÅ«tu atbilstoÅ”us TLS/SSL sertifikātus no Let's Encrypt, kā arÄ« iekŔējai WordPress verifikācijai.
  • NGINX_CONF_DIR="/etc/nginx" - ceļŔ uz direktoriju ar NGINX iestatÄ«jumiem, ieskaitot galveno failu nginx.conf.
  • CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" ā€” ceļŔ uz WordPress vietnes Let's Encrypt sertifikātiem, kas iegÅ«ti no mainÄ«gā TLS_HOSTNAME.

Resursdatora nosaukuma pieŔķirŔana WordPress serverim

Skripts iestata servera saimniekdatora nosaukumu, lai tas atbilstu vietnes domēna nosaukumam. Tas nav nepiecieÅ”ams, taču ērtāk ir nosÅ«tÄ«t izejoÅ”os pastu, izmantojot SMTP, iestatot vienu serveri, kā tas ir konfigurēts skriptā.

skripta kods

# 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

Saimniekdatora nosaukuma pievienoŔana /etc/hosts

Papildinājums WP-Cron izmanto periodisku uzdevumu izpildei, ir nepiecieÅ”ams, lai WordPress varētu piekļūt, izmantojot HTTP. Lai pārliecinātos, ka WP-Cron darbojas pareizi visās vidēs, skripts failam pievieno rindiņu / Etc / hostslai WordPress varētu piekļūt, izmantojot cilpas interfeisu:

skripta kods

# 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

Nākamajām darbībām nepiecieŔamo rīku uzstādīŔana

Pārējam skriptam ir nepiecieÅ”amas dažas programmas, un tiek pieņemts, ka krātuves ir atjauninātas. Mēs atjauninām repozitoriju sarakstu, pēc tam instalējam nepiecieÅ”amos rÄ«kus:

skripta kods

# 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

NGINX vienības un NGINX krātuvju pievienoŔana

Skripts instalē NGINX Unit un atvērtā koda NGINX no oficiālajām NGINX krātuvēm, lai pārliecinātos, ka tiek izmantotas versijas ar jaunākajiem droŔības ielāpiem un kļūdu labojumiem.

Skripts pievieno NGINX vienības repozitoriju un pēc tam NGINX repozitoriju, pievienojot repozitoriju atslēgu un konfigurācijas failus apt, kas nosaka piekļuvi krātuvēm, izmantojot internetu.

Faktiskā NGINX vienÄ«bas un NGINX instalÄ“Å”ana notiek nākamajā sadaļā. Mēs iepriekÅ” pievienojam krātuves, lai mums nebÅ«tu jāatjaunina metadati vairākas reizes, tādējādi padarot instalÄ“Å”anu ātrāku.

skripta kods

# 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

NGINX, NGINX vienÄ«bas, PHP MariaDB, Certbot (Å”ifrēsim) un to atkarÄ«bu instalÄ“Å”ana

Kad visas krātuves ir pievienotas, atjauniniet metadatus un instalējiet lietojumprogrammas. Skripta instalētajās pakotnēs ir iekļauti arÄ« PHP paplaÅ”inājumi, kas ieteicami, palaižot vietni WordPress.org

skripta kods

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

PHP iestatīŔana lietoŔanai ar NGINX vienību un WordPress

Skripts direktorijā izveido iestatÄ«jumu failu conf.d. Tādējādi tiek iestatÄ«ts maksimālais PHP augÅ”upielādes faila lielums, tiek ieslēgta PHP kļūdu izvade uz STDERR, lai tās tiktu ierakstÄ«tas NGINX vienÄ«bas žurnālā, un tiek restartēta NGINX vienÄ«ba.

skripta kods

# 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

MariaDB datu bāzes iestatījumu norādīŔana pakalpojumam WordPress

Mēs esam izvēlējuÅ”ies MariaDB, nevis MySQL, jo tajā ir lielāka kopienas aktivitāte un, visticamāk, arÄ« tā bÅ«s nodroÅ”ina labāku veiktspēju pēc noklusējuma (iespējams, Å”eit viss ir vienkārŔāk: lai instalētu MySQL, jums jāpievieno vēl viens repozitorijs, apm. tulks).

Skripts izveido jaunu datu bāzi un izveido akreditācijas datus, lai piekļūtu WordPress, izmantojot cilpas interfeisu:

skripta kods

# 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;"

WordPress CLI programmas instalēŔana

Å ajā darbÄ«bā skripts instalē programmu WP-CLI. Izmantojot to, varat instalēt un pārvaldÄ«t WordPress iestatÄ«jumus, neveicot manuālu failu rediģēŔanu, datu bāzes atjaunināŔanu vai vadÄ«bas paneļa ievadÄ«Å”anu. To var izmantot arÄ« motÄ«vu un papildinājumu instalÄ“Å”anai un WordPress atjaunināŔanai.

skripta kods

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

WordPress instalēŔana un konfigurēŔana

Skripts direktorijā instalē jaunāko WordPress versiju /var/www/wordpressun arī maina iestatījumus:

  • Datu bāzes savienojums darbojas, izmantojot unix domēna ligzdu, nevis TCP atpakaļcilpas režīmā, lai samazinātu TCP trafiku.
  • WordPress pievieno prefiksu https:// uz URL, ja klienti izveido savienojumu ar NGINX, izmantojot HTTPS, un arÄ« nosÅ«ta attālo resursdatora nosaukumu (kā nodroÅ”ina NGINX) uz PHP. Mēs izmantojam koda fragmentu, lai to iestatÄ«tu.
  • Lai pieteiktos, WordPress ir nepiecieÅ”ams HTTPS
  • Noklusējuma URL struktÅ«ra ir balstÄ«ta uz resursiem
  • Iestata pareizās WordPress direktorija failu sistēmas atļaujas.

skripta kods

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

Notiek NGINX vienības iestatīŔana

Skripts konfigurē NGINX vienību, lai palaistu PHP un apstrādātu WordPress ceļus, izolējot PHP procesa nosaukumvietu un optimizējot veiktspējas iestatījumus. Šeit ir jāņem vērā trīs funkcijas:

  • Atbalstu nosaukumvietām nosaka nosacÄ«jumi, pamatojoties uz pārbaudi, vai skripts darbojas konteinerā. Tas ir nepiecieÅ”ams, jo lielākā daļa konteineru iestatÄ«jumu neatbalsta konteineru ligzdotu palaiÅ”anu.
  • Ja ir atbalsts nosaukumvietām, atspējojiet nosaukumvietu tÄ«kls. Tas ir paredzēts, lai WordPress varētu izveidot savienojumu ar abiem galapunktiem un vienlaikus bÅ«t pieejamam tÄ«meklÄ«.
  • Maksimālais procesu skaits ir definēts Ŕādi: (Pieejamā atmiņa, lai palaistu MariaDB un NGINX Uniy)/(RAM ierobežojums PHP + 5)
    Šī vērtība ir iestatīta NGINX vienības iestatījumos.

Å Ä« vērtÄ«ba arÄ« nozÄ«mē, ka vienmēr darbojas vismaz divi PHP procesi, kas ir svarÄ«gi, jo WordPress veic daudz asinhronu pieprasÄ«jumu sev, un bez papildu procesiem, piemēram, WP-Cron palaiÅ”ana pārtrÅ«ks. Iespējams, vēlēsities palielināt vai samazināt Å”os ierobežojumus, pamatojoties uz vietējiem iestatÄ«jumiem, jo ā€‹ā€‹Å”eit izveidotie iestatÄ«jumi ir konservatÄ«vi. Lielākajā daļā ražoÅ”anas sistēmu iestatÄ«jumi ir no 10 lÄ«dz 100.

skripta kods

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

Notiek NGINX iestatīŔana

NGINX pamata iestatījumu konfigurēŔana

Skripts izveido direktoriju NGINX keÅ”atmiņai un pēc tam izveido galveno konfigurācijas failu nginx.conf. Pievērsiet uzmanÄ«bu apdarinātāja procesu skaitam un maksimālā augÅ”upielādes faila lieluma iestatÄ«Å”anai. Ir arÄ« rinda, kas ietver nākamajā sadaļā definēto saspieÅ”anas iestatÄ«jumu failu, kam seko keÅ”atmiņas iestatÄ«jumi.

skripta kods

# 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

NGINX kompresijas iestatīŔana

Satura saspieÅ”ana lidojumā pirms tā nosÅ«tÄ«Å”anas klientiem ir lielisks veids, kā uzlabot vietnes veiktspēju, taču tikai tad, ja saspieÅ”ana ir pareizi konfigurēta. Å Ä« skripta sadaļa ir balstÄ«ta uz iestatÄ«jumiem tātad.

skripta kods

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

NGINX iestatīŔana pakalpojumam WordPress

Pēc tam skripts izveido WordPress konfigurācijas failu default.conf katalogā conf.d. Tas ir konfigurēts Å”eit:

  • TLS sertifikātu aktivizÄ“Å”ana, kas saņemti no Let's Encrypt, izmantojot Certbot (tā iestatÄ«Å”ana bÅ«s nākamajā sadaļā)
  • TLS droŔības iestatÄ«jumu konfigurÄ“Å”ana, pamatojoties uz Let's Encrypt ieteikumiem
  • Pēc noklusējuma iespējot izlaiÅ”anas pieprasÄ«jumu saglabāŔanu keÅ”atmiņā uz 1 stundu
  • Atspējot piekļuves reÄ£istrÄ“Å”anu, kā arÄ« kļūdu reÄ£istrÄ“Å”anu, ja fails nav atrasts, diviem bieži pieprasÄ«tajiem failiem: favicon.ico un robots.txt
  • Novērst piekļuvi slēptiem failiem un dažiem failiem phplai novērstu nelikumÄ«gu piekļuvi vai netÄ«Å”u iedarbināŔanu
  • Atspējot piekļuves reÄ£istrÄ“Å”anu statiskajiem un fontu failiem
  • Galvenes iestatÄ«jums Access-Control-Allow-Origin fontu failiem
  • MarÅ”rutÄ“Å”anas pievienoÅ”ana indeksam.php un citai statikai.

skripta kods

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

Certbot iestatīŔana sertifikātiem no Let's Encrypt un to automātiska atjaunoŔana

Certbot ir Electronic Frontier Foundation (EFF) bezmaksas rÄ«ks, kas ļauj iegÅ«t un automātiski atjaunot TLS sertifikātus no Let's Encrypt. Skripts veic Ŕādas darbÄ«bas, lai konfigurētu Certbot apstrādāt sertifikātus no Let's Encrypt NGINX:

  • Aptur NGINX
  • Lejupielādē ieteicamos TLS iestatÄ«jumus
  • Palaiž Certbot, lai iegÅ«tu vietnes sertifikātus
  • Restartē NGINX, lai izmantotu sertifikātus
  • Konfigurē Certbot, lai tā darbotos katru dienu plkst. 3:24, lai pārbaudÄ«tu, vai sertifikāti ir jāatjauno, un, ja nepiecieÅ”ams, lejupielādētu jaunus sertifikātus un restartētu NGINX.

skripta kods

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

Jūsu vietnes papildu pielāgoŔana

IepriekÅ” mēs runājām par to, kā mÅ«su skripts konfigurē NGINX un NGINX vienÄ«bu, lai tā apkalpotu ražoÅ”anai gatavu vietni ar iespējotu TLSSSL. AtkarÄ«bā no savām vajadzÄ«bām varat arÄ« turpmāk pievienot:

  • atbalsts Brotli, uzlabota saspieÅ”ana lidojuma laikā, izmantojot HTTPS
  • ModSecurity с WordPress noteikumilai novērstu automatizētus uzbrukumus jÅ«su vietnei
  • rezerves WordPress, kas jums ir piemērots
  • AizsardzÄ«ba via AppArmor (uz Ubuntu)
  • Postfix vai msmtp, lai WordPress varētu nosÅ«tÄ«t pastu
  • Vietnes pārbaude, lai saprastu, cik lielu trafiku tā spēj apstrādāt

Lai nodroÅ”inātu vēl labāku vietnes veiktspēju, iesakām jaunināt uz NGINX Plus, mÅ«su komerciālais, uzņēmuma lÄ«meņa produkts, kura pamatā ir atvērtā koda NGINX. Tā abonenti saņems dinamiski ielādētu Brotli moduli, kā arÄ« (par papildus samaksu) NGINX ModSecurity WAF. Mēs arÄ« piedāvājam NGINX App Protect, WAF modulis NGINX Plus, kas balstÄ«ts uz nozarē vadoÅ”o droŔības tehnoloÄ£iju no F5.

NB Lai atbalstÄ«tu ļoti noslogotu vietni, varat sazināties ar ekspertiem Southbridge. Mēs nodroÅ”ināsim ātru un uzticamu JÅ«su mājas lapas vai pakalpojuma darbÄ«bu pie jebkuras slodzes.

Avots: www.habr.com