АвтоматизируСм установку WordPress с NGINX Unit ΠΈ Ubuntu

АвтоматизируСм установку WordPress с NGINX Unit ΠΈ Ubuntu

Π•ΡΡ‚ΡŒ мноТСство ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² ΠΏΠΎ установкС WordPress, поиск Π² Google ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словам "WordPress install" выдаст порядка ΠΏΠΎΠ»ΡƒΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Но Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ фактичСски срСди Π½ΠΈΡ… вСсьма ΠΌΠ°Π»ΠΎ Π³ΠΎΠ΄Π½Ρ‹Ρ… руководств, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ WordPress ΠΈ Π½ΠΈΠΆΠ΅Π»Π΅ΠΆΠ°Ρ‰ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ способны ΠΊ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ настройки сильно зависят ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… потрСбностСй, ΠΈΠ»ΠΈ ΠΆΠ΅ это связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ объяснСниС Π΄Π΅Π»Π°Π΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒΡŽ тяТСлой для чтСния.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ постараСмся ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ², прСдоставляя скрипт Π½Π° bash для автоматичСской установки WordPress Π½Π° Ubuntu, Π° Ρ‚Π°ΠΊΠΆΠ΅ пройдСмся ΠΏΠΎ Π½Π΅ΠΌΡƒ, поясняя, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π΅Π³ΠΎ кусочСк, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ компромиссы ΠΌΡ‹ пошли ΠΏΡ€ΠΈ Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. Если Π²Ρ‹ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ β€” ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ тСкст ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΈ просто Π²Π·ΡΡ‚ΡŒ скрипт для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ использования Π² Π²Π°ΡˆΠΈΡ… окруТСниях. На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ скрипта получаСтся настраиваСмая установка WordPress с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Lets Encrypt, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ Π½Π° NGINX Unit ΠΈ пригодная для ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠ³ΠΎ примСнСния.

Разработанная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° для развСртывания WordPress с использованиСм NGINX Unit описана Π² Π±ΠΎΠ»Π΅Π΅ старой ΡΡ‚Π°Ρ‚ΡŒΠ΅, сСйчас ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ настроим Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΌ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΎΡ…Π²Π°Ρ‡Π΅Π½Ρ‹ (ΠΊΠ°ΠΊ ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… руководствах):

  • WordPress CLI
  • Let’s Encrypt ΠΈ сСртификаты TLSSSL
  • АвтоматичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ сСртификатов
  • ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ NGINX
  • Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ NGINX
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° HTTPS ΠΈ HTTP/2
  • Автоматизация процСсса

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ описана установка Π½Π° ΠΎΠ΄Π½ΠΎΠΌ сСрвСрС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ сСрвСр ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ статики, сСрвСр ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ PHP, Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…. Установка с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ мноТСства Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… хостов ΠΈ сСрвисов β€” ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ Ρ‚Π΅ΠΌΠ° Π½Π° Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅. Π₯ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ написали ΠΎ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ, Ρ‡Π΅Π³ΠΎ Π½Π΅Ρ‚ Π² этих ΡΡ‚Π°Ρ‚ΡŒΡΡ… β€” ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² коммСнтариях.

ВрСбования

  • Π‘Π΅Ρ€Π²Π΅Ρ€-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ (LXC ΠΈΠ»ΠΈ LXD), Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина, ΠΈΠ»ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΆΠ΅Π»Π΅Π·Π½Ρ‹ΠΉ сСрвСр, с Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Ρ‡Π΅ΠΌ 512Мб ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΈ установлСнной Ubuntu 18.04 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ свСТСй.
  • ДоступныС ΠΈΠ· ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π° ΠΏΠΎΡ€Ρ‚Ρ‹ 80 ΠΈ 443
  • Π”ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ имя, связанноС с ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΌ ip-адрСсом этого сСрвСра
  • Доступ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ root (sudo).

ΠžΠ±Π·ΠΎΡ€ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹

АрхитСктура такая ΠΆΠ΅, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ описано Ρ€Π°Π½Π΅Π΅, Ρ‚Ρ€Π΅Ρ…ΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ΅ web-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Оно состоит ΠΈΠ· скриптов PHP, исполняСмых Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ PHP, ΠΈ статичСских Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π²Π΅Π±-сСрвСром.

АвтоматизируСм установку WordPress с NGINX Unit ΠΈ Ubuntu

ΠžΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹

  • МногиС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для настройки Π² скриптС ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚Ρ‹ Π² условия (if) для идСмпотСнтности: скрипт ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ нСсколько Ρ€Π°Π· Π±Π΅Π· риска измСнСния настроСк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹.
  • Π‘ΠΊΡ€ΠΈΠΏΡ‚ стараСтся ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ПО ΠΈΠ· Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π², Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ обновлСния систСмы Π² ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ (apt upgrade для Ubuntu).
  • ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΡΡ‚Π°Ρ€Π°ΡŽΡ‚ΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ свои настройки.
  • Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ число запускаСмых процСссовпотоков Π² настройках, скрипт ΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ ΡƒΠ³Π°Π΄Π°Ρ‚ΡŒ автоматичСскиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ настройки для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ…, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…, Β«ΠΆΠ΅Π»Π΅Π·Π½Ρ‹Ρ…Β» сСрвСрах.
  • ΠŸΡ€ΠΈ описании настроСк всСгда Π΄ΡƒΠΌΠ°Π΅ΠΌ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΠ± Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ, которая, ΠΊΠ°ΠΊ ΠΌΡ‹ надССмся, станСт основой для создания вашСй собствСнной инфраструктуры ΠΊΠ°ΠΊ ΠΊΠΎΠ΄Π°.
  • ВсС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ основныС систСмныС настройки, Π½ΠΎ нСпосрСдствСнно WordPress Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Установка ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния

УстановитС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ скрипт:

  • WORDPRESS_DB_PASSWORD β€” ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… WordPress
  • WORDPRESS_ADMIN_USER β€” имя администратора WordPress
  • WORDPRESS_ADMIN_PASSWORD β€” ΠΏΠ°Ρ€ΠΎΠ»ΡŒ администратора WordPress
  • WORDPRESS_ADMIN_EMAIL β€” email администратора WordPress
  • WORDPRESS_URL β€” ΠΏΠΎΠ»Π½Ρ‹ΠΉ URL сайта WordPress, начиная с https://.
  • LETS_ENCRYPT_STAGING β€” пустая ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π½ΠΎ, выставив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² 1, Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ staging сСрвСра 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)" β€” hostname систСмы, ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌΡ‹ΠΉ ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ WORDPRESS_URL. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… TLS/SSL сСртификатов ΠΎΡ‚ Let’s Encrypt, Π° Ρ‚Π°ΠΊΠΆΠ΅ для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ WordPress.
  • NGINX_CONF_DIR="/etc/nginx" β€” ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ с настройками NGINX, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ основной Ρ„Π°ΠΉΠ» nginx.conf.
  • CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" β€” ΠΏΡƒΡ‚ΡŒ ΠΊ сСртификатам Let’s Encrypt для сайта WordPress, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ TLS_HOSTNAME.

НазначСниС hostname WordPress сСрвСру

Π‘ΠΊΡ€ΠΈΠΏΡ‚ устанавливаСт hostname сСрвСру, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ соотвСтствовало Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ сайта. Π­Ρ‚ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ Ρ‚Π°ΠΊ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡΡ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ ΠΏΠΎΡ‡Ρ‚Ρƒ Ρ‡Π΅Ρ€Π΅Π· 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

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ hostname Π² /etc/hosts

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ WP‑Cron ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для запуска пСриодичСских Π·Π°Π΄Π°Ρ‡, Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ WordPress ΠΌΠΎΠ³ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ самому сСбС Ρ‡Π΅Ρ€Π΅Π· HTTP. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ WP-Cron Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π° всСх окруТСниях, скрипт добавляСт строчку Π² Ρ„Π°ΠΉΠ» /etc/hosts, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ WordPress ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ самому сСбС Ρ‡Π΅Ρ€Π΅Π· интСрфСйс loopback:

ΠΊΠΎΠ΄ скрипта

# 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 Unit ΠΈ 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) ΠΈ ΠΈΡ… зависимостСй

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ всС Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹, обновляСм ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ устанавливаСм прилоТСния. ΠŸΠ°ΠΊΠ΅Ρ‚Ρ‹, устанавливаСмыС скриптом, Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ PHP, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΈ запускС WordPress.org

ΠΊΠΎΠ΄ скрипта

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 для использования с NGINX Unit ΠΈ WordPress

Π‘ΠΊΡ€ΠΈΠΏΡ‚ создаСт Ρ„Π°ΠΉΠ» настроСк Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ conf.d. Π’ΡƒΡ‚ задаСтся ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² для PHP, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π²Ρ‹Π²ΠΎΠ΄ ошибок PHP Π² STDERR, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ записаны Π² ΠΆΡƒΡ€Π½Π°Π» NGINX Unit, Π° Ρ‚Π°ΠΊΠΆΠ΅ пСрСзапускаСтся NGINX Unit.

ΠΊΠΎΠ΄ скрипта

# 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 для WordPress

ΠœΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ MariaDB вмСсто MySQL, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ Π½Π΅Π΅ большС Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ сообщСства, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½Π°, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, прСдоставляСт Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (вСроятно, Ρ‚ΡƒΡ‚ всС ΠΏΡ€ΠΎΡ‰Π΅: Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ MySQL, Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°).

Π‘ΠΊΡ€ΠΈΠΏΡ‚ создаСт Π½ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ создаСт ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для доступа WordPress Ρ‡Π΅Ρ€Π΅Π· интСрфСйс loopback:

ΠΊΠΎΠ΄ скрипта

# 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, Π° Ρ‚Π°ΠΊΠΆΠ΅ измСняСт настройки:

  • Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· unix domain socket вмСсто TCP Π½Π° loopback, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ TCP.
  • WordPress добавляСт прСфикс https:// ΠΊ URL, Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ с NGINX ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ HTTPS, Π° Ρ‚Π°ΠΊΠΆΠ΅ отправляСт ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ hostname (ΠΊΠ°ΠΊ это прСдоставляСт NGINX) Π² PHP. ΠœΡ‹ примСняСм кусочСк ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ.
  • 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 Unit

Π‘ΠΊΡ€ΠΈΠΏΡ‚ настраиваСт NGINX Unit для запуска PHP ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡƒΡ‚Π΅ΠΉ WordPress, изолируя пространство ΠΈΠΌΠ΅Π½ процСссов PHP ΠΈ оптимизируя настройки ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ΡƒΡ‚ Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅:

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° пространств ΠΈΠΌΠ΅Π½ опрСдСляСтся ΠΏΠΎ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ, основана Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ запуска скрипта Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅. Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ настроСк ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ запуск ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ².
  • Если Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° пространств ΠΈΠΌΠ΅Π½, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ пространство ΠΈΠΌΠ΅Π½ network. Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ WordPress ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΈ ΠΊ endpoints ΠΈ Π±Ρ‹Ρ‚ΡŒ доступным Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅.
  • МаксимальноС число процСссов опрСдСляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: (Доступная ΠΏΠ°ΠΌΡΡ‚ΡŒ для Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… MariaDB ΠΈ NGINX Uniy)/(ΠΏΡ€Π΅Π΄Π΅Π» ΠΏΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π² PHP + 5)
    Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ устанавливаСтся Π² настройках NGINX Unit.

Π’Π°ΠΊΠΆΠ΅ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всСгда Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π΄Π²Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… процСсса 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

Настройка NGINX для WordPress

Π”Π°Π»Π΅Π΅ скрипт создаСт Ρ„Π°ΠΉΠ» настройки для WordPress default.conf Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ conf.d. Π—Π΄Π΅ΡΡŒ настраиваСтся:

  • Активация сСртификатов TLS, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΎΡ‚ Let’s Encrypt Ρ‡Π΅Ρ€Π΅Π· Certbot (Π΅Π³ΠΎ настройка Π±ΡƒΠ΄Π΅Ρ‚ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅)
  • Настройка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² бСзопасности TLS, основанная Π½Π° рСкомСндациях ΠΎΡ‚ Let’s Encrypt
  • ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ пропускаСмых запросов Π½Π° 1 час ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
  • ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Турналирования доступа, Π° Ρ‚Π°ΠΊΠΆΠ΅ Турналирования ошибок, Ссли Ρ„Π°ΠΉΠ» Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, для Π΄Π²ΡƒΡ… ΠΎΠ±Ρ‰ΠΈΡ… Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²: favicon.ico ΠΈ robots.txt
  • Π—Π°ΠΏΡ€Π΅Ρ‚ доступа ΠΊ скрытым Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ .php, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π΅Π»Π΅Π³Π°Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΈΠ»ΠΈ Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½Ρ‹ΠΉ запуск
  • ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Турналирования доступа для статики ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ²
  • Π—Π°Π΄Π°Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Access-Control-Allow-Origin для Ρ„Π°ΠΉΠ»ΠΎΠ² ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ²
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ для 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

Настройка Certbot для сСртификатов ΠΎΡ‚ Let’s Encrypt ΠΈ ΠΈΡ… автоматичСскоС ΠΏΡ€ΠΎΠ΄Π»Π΅Π½ΠΈΠ΅

Certbot β€” бСсплатный инструмСнт ΠΎΡ‚ Electronic Frontier Foundation (EFF), с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ автоматичСски ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ сСртификаты TLS ΠΎΡ‚ Let’s Encrypt. Π‘ΠΊΡ€ΠΈΠΏΡ‚ выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия, приводящиС ΠΊ настройкС Certbot для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сСртификатов ΠΎΡ‚ Let’s Encrypt Π² NGINX:

  • ΠžΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ 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 Unit для обслуТивания Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΊ ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ сайта с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ TLSSSL. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅, Π² зависимости ΠΎΡ‚ Π²Π°ΡˆΠΈΡ… Π½ΡƒΠΆΠ΄, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ:

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Brotli, ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½ΠΎΠ΅ сТатиС Π½Π° Π»Π΅Ρ‚Ρƒ ΠΏΠΎ HTTPS
  • ModSecurity с ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ для WordPress, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ автоматичСскиС Π°Ρ‚Π°ΠΊΠΈ Π½Π° ваш сайт
  • Π Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для WordPress, подходящСС Π²Π°ΠΌ
  • Π—Π°Ρ‰ΠΈΡ‚Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ AppArmor (Π½Π° Ubuntu)
  • Postfix ΠΈΠ»ΠΈ msmtp, Ρ‡Ρ‚ΠΎΠ±Ρ‹ WordPress ΠΌΠΎΠ³ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΡ‡Ρ‚Ρƒ
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ вашСго сайта, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π»ΠΈ, сколько Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ

Для Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сайта ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π΄ΠΎ NGINX Plus, наш коммСрчСский ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ уровня, основанный Π½Π° NGINX c ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ. Π•Π³ΠΎ подписчики ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Brotli, Π° Ρ‚Π°ΠΊΠΆΠ΅ (Π·Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠΏΠ»Π°Ρ‚Ρƒ) NGINX ModSecurity WAF. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ NGINX App Protect, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ WAF для NGINX Plus, основанный Π½Π° Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π²Π΅Π΄ΡƒΡ‰Π΅ΠΉ Π² отрасли бСзопасности, ΠΎΡ‚ F5.

N.B. Π—Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ высоконагруТСнного сайта Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ спСциалистам Southbridge. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠΌ Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ вашСго сайта ΠΈΠ»ΠΈ сСрвиса ΠΏΠΎΠ΄ любой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com