NGINX Unit болон Ubuntu ашиглан WordPress суулгацыг автоматжуулах

NGINX Unit болон Ubuntu ашиглан WordPress суулгацыг автоматжуулах

WordPress-ийг хэрхэн суулгах талаар олон заавар байдаг бөгөөд Google-ээс "WordPress суулгах" гэж хайвал хагас сая орчим үр дүн гарах болно. Гэсэн хэдий ч үнэн хэрэгтээ тэдний дунд маш цөөхөн сайн гарын авлага байдаг бөгөөд үүний дагуу та WordPress болон үндсэн үйлдлийн системийг суулгаж, тохируулах боломжтой бөгөөд ингэснээр тэдгээрийг удаан хугацаанд дэмжих боломжтой болно. Магадгүй зөв тохиргоо нь тодорхой хэрэгцээ шаардлагаас ихээхэн хамаардаг, эсвэл энэ нь нарийвчилсан тайлбар нь нийтлэлийг уншихад хэцүү байдагтай холбоотой юм.

Энэ нийтлэлд бид WordPress-ийг Ubuntu дээр автоматаар суулгах bash скриптээр хангаж, хэсэг бүр нь юу хийдэг, мөн үүнийг хөгжүүлэх явцад хийсэн буултуудыг тайлбарлах замаар хоёр ертөнцийн шилдэгүүдийг нэгтгэхийг хичээх болно. . Хэрэв та ахисан түвшний хэрэглэгч бол нийтлэлийн текстийг алгасаж болно скриптийг ав өөрийн орчинд өөрчлөх, ашиглахад зориулагдсан. Скриптийн гаралт нь NGINX нэгж дээр ажилладаг, үйлдвэрлэлд ашиглахад тохиромжтой, Lets Encrypt дэмжлэгтэй захиалгат WordPress суулгац юм.

NGINX нэгжийг ашиглан WordPress-ийг ашиглахад зориулсан боловсруулсан архитектурыг доор тайлбарласан болно хуучин нийтлэл, бид одоо энд тусгагдаагүй зүйлсийг цаашид тохируулах болно (бусад олон хичээлийн адил):

  • WordPress CLI
  • Шифрлэцгээе болон TLSSSL гэрчилгээ
  • Сертификатыг автоматаар сунгах
  • NGINX кэш
  • NGINX шахалт
  • HTTPS болон HTTP/2 дэмжлэг
  • Үйл явцын автоматжуулалт

Нийтлэлд статик боловсруулалтын сервер, PHP боловсруулах сервер, мэдээллийн баазыг нэгэн зэрэг байрлуулах нэг сервер дээр суулгах талаар тайлбарлах болно. Олон тооны виртуал хост болон үйлчилгээг дэмждэг суулгац нь ирээдүйн боломжит сэдэв юм. Хэрэв та эдгээр нийтлэлд байхгүй зүйлийн талаар бичихийг хүсвэл сэтгэгдэл дээр бичээрэй.

шаардлага

  • Серверийн контейнер (LXC буюу LXD), виртуал машин эсвэл дор хаяж 512MB RAM болон Ubuntu 18.04 буюу түүнээс дээш хувилбарыг суулгасан энгийн төмөр сервер.
  • Интернетэд нэвтрэх боломжтой портууд 80 ба 443
  • Энэ серверийн нийтийн IP хаягтай холбоотой домайн нэр
  • Root хандалт (sudo).

Архитектурын тойм

Архитектур нь тайлбарласантай ижил байна эрт, гурван шатлалт вэб програм. Энэ нь PHP хөдөлгүүр дээр ажилладаг PHP скриптүүд болон вэб серверээр боловсруулагддаг статик файлуудаас бүрдэнэ.

NGINX Unit болон Ubuntu ашиглан WordPress суулгацыг автоматжуулах

Ерөнхий зарчим

  • Скрипт дэх олон тохиргооны командууд нь идэвхгүй болох нөхцөл бүрдсэн тохиолдолд ороосон байдаг: скриптийг аль хэдийн суулгасан тохиргоог өөрчлөх эрсдэлгүйгээр олон удаа ажиллуулж болно.
  • Скрипт нь хадгалах сангаас программ хангамж суулгахыг оролддог тул та системийн шинэчлэлтийг нэг тушаалаар ашиглах боломжтой (apt upgrade Ubuntu-д зориулсан).
  • Командууд нь саванд ажиллаж байгааг илрүүлэхийг оролддог бөгөөд ингэснээр тэд тохиргоогоо өөрчлөх боломжтой.
  • Тохиргоонд эхлэх урсгалын процессын тоог тохируулахын тулд скрипт нь контейнер, виртуал машин, техник хангамжийн серверт ажиллах автомат тохиргоог таахыг оролддог.
  • Тохиргоог тайлбарлахдаа бид үргэлж автоматжуулалтын талаар хамгийн түрүүнд боддог бөгөөд энэ нь өөрийн дэд бүтцийг код болгон бий болгох үндэс суурь болно гэж найдаж байна.
  • Бүх командыг хэрэглэгчээр ажиллуулдаг эх, учир нь тэд үндсэн системийн тохиргоог өөрчилдөг боловч WordPress шууд энгийн хэрэглэгчээр ажилладаг.

Орчны хувьсагчдыг тохируулах

Скриптийг ажиллуулахын өмнө дараах орчны хувьсагчдыг тохируулна уу:

  • WORDPRESS_DB_PASSWORD - WordPress мэдээллийн сангийн нууц үг
  • WORDPRESS_ADMIN_USER - WordPress админ нэр
  • WORDPRESS_ADMIN_PASSWORD - WordPress админ нууц үг
  • WORDPRESS_ADMIN_EMAIL - WordPress админ имэйл
  • WORDPRESS_URL Энэ нь WordPress сайтын бүрэн URL-аас эхэлдэг https://.
  • LETS_ENCRYPT_STAGING - анхдагчаар хоосон боловч утгыг 1 болгосноор та тохиргоогоо шалгахдаа гэрчилгээг байнга шаардахад зайлшгүй шаардлагатай Let's Encrypt үе шатны серверүүдийг ашиглах болно, эс тэгвээс Let's Encrypt нь олон тооны хүсэлтийн улмаас таны IP хаягийг түр хааж болзошгүй. .

Скрипт нь эдгээр WordPress-тэй холбоотой хувьсагчдыг тохируулсан эсэхийг шалгаж, тохируулаагүй бол гарах болно.
Скриптийн мөр 572-576 утгыг шалгана уу LETS_ENCRYPT_STAGING.

Үүсмэл орчны хувьсагчдыг тохируулах

55-61-р мөрөнд байгаа скрипт нь дараах орчны хувьсагчдыг хатуу кодлогдсон утгаар эсвэл өмнөх хэсэгт тохируулсан хувьсагчдаас олж авсан утгыг ашиглан тохируулна:

  • DEBIAN_FRONTEND="noninteractive" - Аппликейшнүүдэд скриптээр ажиллаж байгаа бөгөөд хэрэглэгчтэй харилцах ямар ч боломж байхгүй гэдгийг хэлдэг.
  • WORDPRESS_CLI_VERSION="2.4.0" WordPress CLI програмын хувилбар юм.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" — WordPress CLI 2.4.0 гүйцэтгэгдэх файлын хяналтын нийлбэр (хувилбарыг хувьсагчаар зааж өгсөн болно) WORDPRESS_CLI_VERSION). 162-р мөрөнд байгаа скрипт нь зөв WordPress CLI файлыг татаж авсан эсэхийг шалгахын тулд энэ утгыг ашигладаг.
  • UPLOAD_MAX_FILESIZE="16M" - WordPress дээр байршуулж болох хамгийн дээд файлын хэмжээ. Энэ тохиргоог хэд хэдэн газар ашигладаг тул нэг дор тохируулах нь илүү хялбар байдаг.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" - WORDPRESS_URL хувьсагчаас авсан системийн хостын нэр. Let's Encrypt-ээс зохих TLS/SSL сертификат авах, мөн WordPress дотоод баталгаажуулалтад ашигладаг.
  • NGINX_CONF_DIR="/etc/nginx" - үндсэн файлыг оруулаад NGINX тохиргоо бүхий лавлах руу очих зам nginx.conf.
  • CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" — хувьсагчаас авсан WordPress сайтын Let's Encrypt сертификат руу очих зам TLS_HOSTNAME.

WordPress серверт хостын нэрийг оноож байна

Скрипт нь серверийн хост нэрийг сайтын домайн нэртэй тааруулахаар тохируулдаг. Энэ нь шаардлагагүй, гэхдээ скриптээр тохируулагдсаны дагуу нэг серверийг тохируулахдаа SMTP-ээр дамжуулж буй захидал илгээх нь илүү тохиромжтой.

скрипт код

# 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

/etc/hosts-д хостын нэрийг нэмж байна

Нэмэлт WP-Cron Тогтмол даалгавруудыг гүйцэтгэхэд ашигладаг тул WordPress-ээс HTTP-ээр дамжуулан өөртөө хандах боломжтой байхыг шаарддаг. WP-Cron бүх орчинд зөв ажиллаж байгаа эсэхийг шалгахын тулд скрипт нь файлд мөр нэмнэ / etc / hosts -г үзнэ үүИнгэснээр WordPress нь давталтын интерфэйсээр дамжуулан өөртөө хандах боломжтой болно:

скрипт код

# 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

Дараагийн алхмуудад шаардлагатай багаж хэрэгслийг суурилуулах

Үлдсэн скриптэд зарим програм хэрэгтэй бөгөөд хадгалах сангууд шинэчлэгдсэн гэж үздэг. Бид хадгалах сангийн жагсаалтыг шинэчилж, дараа нь шаардлагатай хэрэгслүүдийг суулгана.

скрипт код

# 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 нэгж болон NGINX репозиторуудыг нэмж байна

Скрипт нь NGINX Unit болон нээлттэй эхийн NGINX-ийг албан ёсны NGINX репозитороос суулгаж, хамгийн сүүлийн үеийн аюулгүй байдлын засварууд болон алдааны засваруудтай хувилбаруудыг ашиглаж байгаа эсэхийг шалгадаг.

Скрипт нь NGINX Unit репозиторыг, дараа нь NGINX репозиторыг нэмж, хадгалах сангийн түлхүүр болон тохиргооны файлуудыг нэмнэ. apt, Интернэтээр дамжуулан агуулах руу нэвтрэх эрхийг тодорхойлох.

NGINX Unit болон NGINX-ийн бодит суурилуулалтыг дараагийн хэсэгт хийнэ. Бид репозиторуудыг урьдчилан нэмдэг тул мета өгөгдлийг олон удаа шинэчлэх шаардлагагүй бөгөөд энэ нь суулгацыг илүү хурдан болгодог.

скрипт код

# 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 Unit, PHP MariaDB, Certbot (Let's Encrypt) болон тэдгээрийн хамаарлыг суулгаж байна

Бүх репозиторуудыг нэмсний дараа мета өгөгдлийг шинэчилж, програмуудыг суулгана уу. Скриптээр суулгасан багцууд нь WordPress.org-г ажиллуулахад санал болгож буй PHP өргөтгөлүүдийг агуулдаг

скрипт код

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

NGINX Unit болон WordPress дээр ашиглах PHP-г тохируулж байна

Скрипт нь директор дотор тохиргооны файл үүсгэдэг шүүмжил. Энэ нь PHP-д байршуулах файлын хамгийн дээд хэмжээг тогтоож, PHP алдааны гаралтыг STDERR руу асааж, NGINX нэгжийн бүртгэлд бичиж, NGINX нэгжийг дахин эхлүүлнэ.

скрипт код

# 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

WordPress-д зориулсан MariaDB мэдээллийн сангийн тохиргоог зааж өгч байна

Бид MariaDB-г MySQL-ээс илүү олон нийтийн үйл ажиллагаатай, бас байх магадлалтай тул сонгосон анхдагчаар илүү сайн гүйцэтгэлийг хангадаг (Магадгүй энд бүх зүйл илүү хялбар байдаг: MySQL-г суулгахын тулд та өөр репозитор нэмэх хэрэгтэй, ойролцоогоор. орчуулагч).

Скрипт нь шинэ мэдээллийн сан үүсгэж, давталтын интерфэйсээр дамжуулан WordPress руу нэвтрэх итгэмжлэлүүдийг үүсгэдэг:

скрипт код

# 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 програмыг суулгаж байна

Энэ үе шатанд скрипт програмыг суулгана Ажлын хэсэг CLI. Үүний тусламжтайгаар та гараар файл засварлах, мэдээллийн баазыг шинэчлэх, хяналтын самбар руу орохгүйгээр WordPress тохиргоог суулгаж, удирдах боломжтой. Энэ нь мөн загвар болон нэмэлтүүдийг суулгах, WordPress-ийг шинэчлэхэд ашиглаж болно.

скрипт код

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-г суулгах, тохируулах

Скрипт нь WordPress-ийн хамгийн сүүлийн хувилбарыг директорт суулгадаг /var/www/wordpressмөн тохиргоог өөрчилнө:

  • Өгөгдлийн сангийн холболт нь TCP урсгалыг багасгахын тулд давталт дээрх TCP-ийн оронд unix домайн залгуур дээр ажилладаг.
  • WordPress угтвар нэмдэг https:// Хэрэв үйлчлүүлэгчид HTTPS-ээр NGINX-тэй холбогдож, мөн алсын хостын нэрийг (NGINX-с өгсөн) PHP руу илгээдэг бол URL руу оруулна. Үүнийг тохируулахын тулд бид код ашигладаг.
  • WordPress-д нэвтрэхийн тулд HTTPS хэрэгтэй
  • Анхдагч URL бүтэц нь нөөц дээр суурилдаг
  • WordPress лавлах файлын системд зөв зөвшөөрлийг тохируулна.

скрипт код

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

NGINX нэгжийг тохируулж байна

Скрипт нь NGINX нэгжийг PHP ажиллуулах, WordPress зам боловсруулах, PHP процессын нэрийн орон зайг тусгаарлаж, гүйцэтгэлийн тохиргоог оновчтой болгохоор тохируулдаг. Энд анхаарах ёстой гурван шинж чанар байна:

  • Нэрийн орон зайн дэмжлэг нь скрипт нь саванд ажиллаж байгаа эсэхийг шалгах үндсэн дээр нөхцөлөөр тодорхойлогддог. Ихэнх чингэлэгийн тохиргоо нь савыг үүрлэсэн хөөргөхийг дэмждэггүй тул энэ нь зайлшгүй шаардлагатай.
  • Хэрэв нэрийн талбарт дэмжлэг байгаа бол нэрийн орон зайг идэвхгүй болго сүлжээ. Энэ нь WordPress-ийг хоёр төгсгөлийн цэгүүдтэй холбож, вэб дээр нэгэн зэрэг ашиглах боломжийг олгох зорилготой юм.
  • Процессын хамгийн их тоог дараах байдлаар тодорхойлно. (MariaDB болон NGINX Uniy-г ажиллуулах боломжтой санах ой)/(PHP + 5 дахь RAM-ийн хязгаар)
    Энэ утгыг NGINX нэгжийн тохиргоонд тохируулсан.

Энэ утга нь мөн үргэлж дор хаяж хоёр PHP процесс ажиллаж байгааг илтгэж байгаа бөгөөд энэ нь WordPress өөрөө өөртөө маш олон асинхрон хүсэлт гаргадаг тул WP-Cron гэх мэт нэмэлт процессуудыг ажиллуулахгүйгээр ажиллах нь чухал юм. Энд үүсгэсэн тохиргоонууд нь консерватив байдаг тул та дотоод тохиргоондоо тулгуурлан эдгээр хязгаарыг нэмэгдүүлэх эсвэл багасгахыг хүсч болно. Ихэнх үйлдвэрлэлийн системүүдийн тохиргоо нь 10-аас 100 хооронд байдаг.

скрипт код

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

NGINX-г тохируулж байна

NGINX-ийн үндсэн тохиргоог хийж байна

Скрипт нь NGINX кэшэд зориулсан лавлах үүсгээд дараа нь үндсэн тохиргооны файлыг үүсгэдэг nginx.conf. Хянагч процессын тоо болон байршуулах файлын дээд хэмжээг тохируулахад анхаарлаа хандуулаарай. Мөн дараагийн хэсэгт тодорхойлсон шахалтын тохиргооны файл, дараа нь кэшийн тохиргоог агуулсан мөр байна.

скрипт код

# 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 шахалтыг тохируулж байна

Контентыг үйлчлүүлэгчид рүү илгээхийн өмнө шууд шахах нь сайтын гүйцэтгэлийг сайжруулах гайхалтай арга боловч зөвхөн шахалтыг зөв тохируулсан тохиолдолд л болно. Скриптийн энэ хэсэг нь тохиргоон дээр суурилдаг Эндээс.

скрипт код

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

WordPress-д зориулсан NGINX-г тохируулж байна

Дараа нь скрипт нь WordPress-ийн тохиргооны файлыг үүсгэдэг default.conf каталогид шүүмжил. Үүнийг энд тохируулсан:

  • Let's Encrypt-ээс хүлээн авсан TLS сертификатуудыг Certbot-ээр идэвхжүүлж байна (түүний тохиргоог дараагийн хэсэгт хийх болно)
  • Let's Encrypt-ийн зөвлөмжид үндэслэн TLS аюулгүй байдлын тохиргоог хийж байна
  • Өгөгдмөлөөр 1 цагийн турш алгасах хүсэлтийг кэш хийхийг идэвхжүүлнэ
  • favicon.ico болон robots.txt гэсэн хоёр нийтлэг файлын хувьд хандалтын бүртгэл, түүнчлэн файл олдоогүй бол алдааны бүртгэлийг идэвхгүй болгох
  • Нууцлагдмал файлууд болон зарим файлуудад хандахаас сэргийлнэ .phpхууль бус хандалт эсвэл санамсаргүй эхлэхээс урьдчилан сэргийлэх
  • Статик болон фонт файлуудын хандалтын бүртгэлийг идэвхгүй болгох
  • Толгойн тохиргоо Хандалт-Хяналт-Зөвшөөрөх-Гарал үүсэл фонтын файлуудын хувьд
  • index.php болон бусад статикуудад чиглүүлэлт нэмж байна.

скрипт код

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

Let's Encrypt-ийн гэрчилгээнд Certbot-г тохируулж, автоматаар шинэчилж байна

Сербот нь Let's Encrypt-ээс TLS гэрчилгээ авах, автоматаар шинэчлэх боломжийг олгодог Цахим хилийн сангийн (EFF) үнэгүй хэрэгсэл юм. Скрипт нь NGINX-д Let's Encrypt-ийн гэрчилгээг боловсруулахын тулд Certbot-ийг тохируулахын тулд дараах зүйлсийг хийдэг:

  • NGINX-ийг зогсооно
  • Санал болгож буй TLS тохиргоог татаж авдаг
  • Сайтын гэрчилгээ авахын тулд Certbot ажиллуулдаг
  • Сертификат ашиглахын тулд NGINX-г дахин эхлүүлнэ
  • Сертификатуудыг шинэчлэх шаардлагатай эсэхийг шалгахын тулд Certbot-г өдөр бүр 3:24 цагт ажиллуулахаар тохируулж, шаардлагатай бол шинэ сертификатуудыг татаж аваад NGINX-г дахин эхлүүлнэ.

скрипт код

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

Таны сайтын нэмэлт тохируулга

Манай скрипт нь NGINX болон NGINX нэгжийг TLSSSL-г идэвхжүүлсэн үйлдвэрлэлд бэлэн сайтад үйлчлэхээр хэрхэн тохируулдаг талаар бид дээр ярьсан. Та мөн өөрийн хэрэгцээ шаардлагаас хамааран ирээдүйд нэмж болно:

  • дэмжлэг үзүүлэх Brotli, HTTPS дээр шууд шахалтыг сайжруулсан
  • Модны аюулгүй байдал с wordpress-ийн дүрэмтаны сайтад автомат халдлагаас урьдчилан сэргийлэх
  • Нөөцлөх танд тохирсон WordPress-д зориулсан
  • Хамгаалалт тусламжтайгаар AppArmor (Ubuntu дээр)
  • Postfix эсвэл msmtp нь WordPress шуудан илгээх боломжтой
  • Таны сайтыг шалгаж үзэхийн тулд энэ нь хэр их урсгалыг даван туулж болохыг ойлгох болно

Сайтын гүйцэтгэлийг сайжруулахын тулд бид үүнийг шинэчлэхийг зөвлөж байна NGINX Plus, нээлттэй эхийн NGINX дээр суурилсан манай арилжааны, аж ахуйн нэгжийн түвшний бүтээгдэхүүн. Түүний захиалагчид динамик ачаалалтай Brotli модулийг хүлээн авахаас гадна (нэмэлт төлбөртэй) авах болно. NGINX ModSecurity WAF. Бид бас санал болгож байна NGINX App Protect, NGINX Plus-д зориулсан WAF модуль нь F5-ийн салбарт тэргүүлэгч аюулгүй байдлын технологид суурилсан.

NB Өндөр ачаалалтай сайтыг дэмжихийн тулд та мэргэжилтнүүдтэй холбоо барьж болно Саутбридж. Бид таны вэб сайт, үйлчилгээг ямар ч ачаалалд хурдан, найдвартай ажиллагааг хангах болно.

Эх сурвалж: www.habr.com