NGINX Unit және Ubuntu көмегімен WordPress орнатуды автоматтандыру

NGINX Unit және Ubuntu көмегімен WordPress орнатуды автоматтандыру

WordPress орнату туралы көптеген оқулықтар бар, Google-дан «WordPress орнату» деп іздеу жарты миллионға жуық нәтиже береді. Дегенмен, шын мәнінде, олардың арасында өте аз жақсы нұсқаулықтар бар, оларға сәйкес WordPress және негізгі операциялық жүйені ұзақ уақыт бойы қолдау көрсетуге қабілетті етіп орнатуға және конфигурациялауға болады. Мүмкін дұрыс параметрлер нақты қажеттіліктерге байланысты болуы мүмкін немесе бұл егжей-тегжейлі түсініктеме мақаланы оқуды қиындататындығына байланысты.

Бұл мақалада біз WordPress-ті Ubuntu жүйесіне автоматты түрде орнату үшін bash сценарийін ұсына отырып, екі дүниенің де ең жақсысын біріктіруге тырысамыз және біз оны қарастырамыз, әр бөліктің не істейтінін және дизайнда жасаған тиімділіктерді түсіндіреміз. ол. Егер сіз тәжірибелі пайдаланушы болсаңыз, мақаланың мәтінін өткізіп жібере аласыз және жай ғана сценарийді алыңыз орталарыңызда өзгерту және пайдалану үшін. Сценарийдің нәтижесі - NGINX құрылғысында жұмыс істейтін және өнеркәсіптік пайдалануға жарамды Lets Encrypt қолдауы бар теңшелетін WordPress қондырғысы.

NGINX Unit көмегімен WordPress-ті орналастыруға арналған әзірленген архитектура мына бөлімде сипатталған ескі мақала, біз енді онда қарастырылмаған нәрселерді одан әрі конфигурациялаймыз (көптеген басқа оқулықтардағы сияқты):

  • WordPress CLI
  • Шифрлайық және TLSSSL сертификаттары
  • Сертификатты автоматты түрде жаңарту
  • NGINX кэштеу
  • NGINX қысу
  • HTTPS және HTTP/2 қолдауы
  • Процесті автоматтандыру

Мақалада статикалық өңдеу сервері, PHP өңдеу сервері және дерекқор бір уақытта орналасатын бір сервердегі орнату сипатталады. Бірнеше виртуалды хосттар мен қызметтерді қолдайтын орнату болашақтағы ықтимал тақырып болып табылады. Егер сіз осы мақалаларда жоқ нәрсе туралы жазғанымызды қаласаңыз, түсініктемелерде жазыңыз.

талаптар

  • Сервер контейнері (LXC немесе LXD), виртуалды машина немесе кемінде 512 Мбайт жедел жады және Ubuntu 18.04 немесе одан да соңғы нұсқасы орнатылған кәдімгі аппараттық сервер.
  • Интернетке қол жетімді порттар 80 және 443
  • Осы сервердің жалпы IP мекенжайымен байланысты домен атауы
  • Түбірлік қатынас (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 / hostsWordPress кері интерфейс арқылы өзіне қол жеткізе алады:

сценарий коды

# 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 репозитарийлерінен NGINX Unit және ашық бастапқы NGINX орнатады.

Сценарий NGINX Unit репозиторийін, содан кейін NGINX репозиторийін қосады, репозитарий кілтін және конфигурация файлдарын қосады. apt, Интернет арқылы репозиторийлерге қол жеткізуді анықтау.

NGINX бірлігі мен 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 орнату

Сценарий каталогта параметрлер файлын жасайды conf.d. Бұл 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 дерекқорының параметрлерін көрсету

Біз MySQL-ге қарағанда MariaDB-ті таңдадық, өйткені оның қауымдастық белсенділігі көп және де мүмкін әдепкі бойынша жақсырақ өнімділікті қамтамасыз етеді (Мүмкін, мұнда бәрі оңайырақ: 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 бағдарламасын орнату

Бұл қадамда сценарий бағдарламаны орнатады WP-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 құрылғысын орнату

Сценарий PHP процесінің аттар кеңістігін оқшаулап, өнімділік параметрлерін оңтайландыра отырып, PHP іске қосу және WordPress жолдарын өңдеу үшін NGINX бірлігін конфигурациялайды. Мұнда назар аудару керек үш мүмкіндік бар:

  • Атау кеңістігіне қолдау сценарийдің контейнерде жұмыс істеп тұрғанын тексеруге негізделген шарт бойынша анықталады. Бұл қажет, себебі көптеген контейнер орнатулары контейнерлерді кірістірілген іске қосуды қолдамайды.
  • Егер аттар кеңістігіне қолдау болса, аттар кеңістігін өшіріңіз желі. Бұл 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 каталогта conf.d. Ол мына жерде конфигурацияланған:

  • Let's Encrypt арқылы Certbot арқылы алынған TLS сертификаттарын белсендіру (оны орнату келесі бөлімде болады)
  • 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 орнату және оларды автоматты түрде жаңарту

Certbot Let's Encrypt жүйесінен TLS сертификаттарын алуға және автоматты түрде жаңартуға мүмкіндік беретін Electronic Frontier Foundation (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

Сайтыңызды қосымша теңшеу

Жоғарыда біз TLSSSL қосылған өндіріске дайын сайтқа қызмет көрсету үшін NGINX және NGINX бірлігін сценарий қалай конфигурациялайтыны туралы айттық. Сондай-ақ, қажеттіліктеріңізге байланысты болашақта мыналарды қосуға болады:

  • Қолдау Бротли, 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