ืึทื•ื˜ืึธืžืึทื˜ื™ื ื’ ื•ื•ืึธืจื“ืคึผืจืขืกืก ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ืžื™ื˜ NGINX Unit ืื•ืŸ Ubuntu

ืึทื•ื˜ืึธืžืึทื˜ื™ื ื’ ื•ื•ืึธืจื“ืคึผืจืขืกืก ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ืžื™ื˜ NGINX Unit ืื•ืŸ Ubuntu

ืขืก ืื™ื– ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืžืึทื˜ืขืจื™ืึทืœ ืื•ื™ืฃ ื™ื ืกื˜ืึธืœื™ื ื’ ื•ื•ืึธืจื“ืคึผืจืขืกืก; ืึท Google ื–ื•ื›ืŸ ืคึฟืึทืจ "ื•ื•ืึธืจื“ืคึผืจืขืกืก ื™ื ืกื˜ืึทืœื™ืจืŸ" ื•ื•ืขื˜ ืฆื•ืจื™ืงืงื•ืžืขืŸ ื•ื•ืขื’ืŸ ืึท ื”ืึทืœื‘ ืžื™ืœื™ืึธืŸ ืจืขื–ื•ืœื˜ืึทื˜ืŸ. ืึธื‘ืขืจ, ืขืก ื–ืขื ืขืŸ ืคืืงื˜ื™ืฉ ื–ื™ื™ืขืจ ื•ื•ื™ื™ื ื™ืง ื ื•ืฆื™ืง ื’ื•ื™ื“ืขืก ื•ื•ืึธืก ืงืขื ืขืŸ ื”ืขืœืคึฟืŸ ืื™ืจ ื™ื ืกื˜ืึทืœื™ืจืŸ ืื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจ ื•ื•ืึธืจื“ืคึผืจืขืกืก ืื•ืŸ ื“ื™ ืึทื ื“ืขืจืœื™ื™ื™ื ื’ ืึธืคึผืขืจื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขื ืึทื–ื•ื™ ืึทื– ื–ื™ื™ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืฉื˜ื™ืฆื˜ ืื™ื‘ืขืจ ืึท ืœืึทื ื’ ืฆื™ื™ื˜. ื˜ืึธืžืขืจ ื“ื™ ืจื™ื›ื˜ื™ืง ืกืขื˜ื˜ื™ื ื’ืก ืึธืคืขื ื’ืขืŸ ืฉื•ื•ืขืจ ืื•ื™ืฃ ื“ื™ื™ืŸ ืกืคึผืขืฆื™ืคื™ืฉ ื‘ืื“ืขืจืคืขื ื™ืฉืŸ, ืึธื“ืขืจ ืขืก ืงืขืŸ ื–ื™ื™ืŸ ื•ื•ื™ื™ึทืœ ื“ื™ ื“ื™ื˜ื™ื™ืœื“ ื“ืขืจืงืœืขืจื•ื ื’ ืžืื›ื˜ ื“ืขื ืึทืจื˜ื™ืงืœ ืฉื•ื•ืขืจ ืฆื• ืœื™ื™ืขื ืขืŸ.

ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ืžื™ืจ ื•ื•ืขืœืŸ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืฉื˜ืขืœืŸ ืฆื•ื–ืึทืžืขืŸ ื“ื™ ื‘ืขืกื˜ืขืจ ืคื•ืŸ ื‘ื™ื™ื“ืข ื•ื•ืขืœื˜ืŸ ื“ื•ืจืš ืฆื•ืฉื˜ืขืœืŸ ืึท ื‘ืึทืฉ ืฉืจื™ืคื˜ ืฆื• ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ื™ื ืกื˜ืึทืœื™ืจืŸ ื•ื•ืึธืจื“ืคึผืจืขืกืก ืื•ื™ืฃ ื•ื‘ื•ื ื˜ื•, ืื•ืŸ ืžื™ืจ ื•ื•ืขืœืŸ ื“ื•ืจื›ื’ื™ื™ืŸ ืขืก, ื“ืขืจืงืœืขืจืŸ ื•ื•ืึธืก ื™ืขื“ืขืจ ืฉื˜ื™ืง ื˜ื•ื˜ ืื•ืŸ ื“ื™ ื”ืึทื ื“ืœ-ืึธืคืก ื•ื•ืึธืก ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขืžืื›ื˜ ืื™ืŸ ื“ื™ื–ื™ื™ื ื™ื ื’. ืขืก. ืื•ื™ื‘ ืื™ืจ ื–ืขื ื˜ ืึท ื™ืงืกืคึผื™ืจื™ืึทื ืกื˜ ื‘ืึทื ื™ืฆืขืจ, ืื™ืจ ืงืขื ืขืŸ ื”ืึธืคึผืงืขืŸ ื“ืขื ื˜ืขืงืกื˜ ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืื•ืŸ ื ืึธืจ ื ืขืžืขืŸ ื“ื™ ืฉืจื™ืคื˜ ืคึฟืึทืจ ืžืึทื“ืึทืคืึทืงื™ื™ืฉืึทืŸ ืื•ืŸ ื ื•ืฆืŸ ืื™ืŸ ื“ื™ื™ืŸ ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ. ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ื“ืขื ืฉืจื™ืคื˜ ืื™ื– ืึท ืžื ื”ื’ ื•ื•ืึธืจื“ืคึผืจืขืกืก ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ืžื™ื˜ ืœืขืฅ ืขื ืงืจื™ืคึผื˜ ืฉื˜ื™ืฆืŸ, ืคืœื™ืกื ื“ื™ืง ืื•ื™ืฃ NGINX Unit ืื•ืŸ ืคึผืึทืกื™ืง ืคึฟืึทืจ ื™ื ื“ืึทืกื˜ืจื™.

ื“ื™ ื“ืขื•ื•ืขืœืึธืคึผืขื“ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ืคึฟืึทืจ ื“ื™ืคึผืœื•ื™ื™ื ื’ ื•ื•ืึธืจื“ืคึผืจืขืกืก ื ื™ืฆืŸ NGINX Unit ืื™ื– ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ืขืœื˜ืขืจืข ืืจื˜ื™ืงืœ, ืžื™ืจ ื•ื•ืขืœืŸ ืื™ืฆื˜ ืื•ื™ืš ืงืึทื ืคื™ื’ื™ืขืจ ื˜ื™ื ื’ื– ื•ื•ืึธืก ื–ืขื ืขืŸ ื ื™ืฉื˜ ืงืึทื•ื•ืขืจื“ ื“ืึธืจื˜ (ื•ื•ื™ ืื™ืŸ ืคื™ืœืข ืื ื“ืขืจืข ื˜ื•ื˜ืึธืจื™ืึทืœื–):

  • ื•ื•ืึธืจื“ืคึผืจืขืกืก CLI
  • ืœืึธืžื™ืจ ืขื ืงืจื™ืคึผื˜ ืื•ืŸ TLSSSL ืกืขืจื˜ื™ืคื™ืงืึทืฅ
  • ืึธื˜ืึทืžืึทื˜ื™ืง ื‘ืึทื•ื•ื™ื™ึทื–ืŸ ืจื™ื ื•ืึทืœ
  • NGINX ืงืึทื˜ืฉื™ื ื’
  • NGINX ืงืึทืžืคึผืจืขืฉืึทืŸ
  • ื”ื˜ื˜ืคึผืก ืื•ืŸ ื”ื˜ื˜ืคึผ / 2 ืฉื˜ื™ืฆืŸ
  • ืคึผืจืึธืฆืขืก ืึธื˜ืึทืžื™ื™ืฉืึทืŸ

ื“ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื˜ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ืื•ื™ืฃ ืื™ื™ืŸ ืกืขืจื•ื•ืขืจ, ื•ื•ืึธืก ื•ื•ืขื˜ ืกื™ื™ืžืึทืœื˜ื™ื™ื ื™ืึทืกืœื™ ื‘ืึทืœืขื‘ืึธืก ืึท ืกื˜ืึทื˜ื™ืง ืคึผืจืึทืกืขืกื™ื ื’ ืกืขืจื•ื•ืขืจ, ืึท PHP ืคึผืจืึทืกืขืกื™ื ื’ ืกืขืจื•ื•ืขืจ ืื•ืŸ ืึท ื“ืึทื˜ืึทื‘ื™ื™ืก. ื™ื™ึทื ืžืึธื ื˜ื™ืจื•ื ื’ ืžื™ื˜ ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ืงื™ื™ืคืœ ื•ื•ื™ืจื˜ื•ืึทืœ ืžื—ื ื•ืช ืื•ืŸ ื‘ืึทื“ื™ื ื•ื ื’ืก ืื™ื– ืึท ืคึผืึธื˜ืขื ืฆื™ืขืœ ื˜ืขืžืข ืคึฟืึทืจ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜. ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœื˜ ืึทื– ืžื™ืจ ืฉืจื™ื™ึทื‘ืŸ ื•ื•ืขื’ืŸ ืขืคึผืขืก ื•ื•ืึธืก ืื™ื– ื ื™ืฉื˜ ืื™ืŸ ื“ื™ ืึทืจื˜ื™ืงืœืขืŸ, ืฉืจื™ื™ึทื‘ืŸ ืื™ืŸ ื“ื™ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ.

ื‘ืื“ืขืจืคืขื ื™ืฉืŸ

  • ืกืขืจื•ื•ื™ืจืขืจ ืงืึทื ื˜ื™ื™ื ืขืจ (ืœืงืกืง ืึธื“ืขืจ ืœืงืกื“), ืึท ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ, ืึธื“ืขืจ ืึท ืจืขื’ื•ืœืขืจ ื™ื™ึทื–ื ื•ื•ืึทืจื’ ืกืขืจื•ื•ืขืจ, ืžื™ื˜ ืœืคึผื—ื•ืช 512 ืžื‘ ืคื•ืŸ ื‘ืึทืจืึทืŸ ืื•ืŸ Ubuntu 18.04 ืึธื“ืขืจ ืžืขืจ ืœืขืฆื˜ื ืก ืื™ื ืกื˜ืึทืœื™ืจืŸ.
  • ืื™ื ื˜ืขืจื ืขื˜ ืฆื•ื˜ืจื™ื˜ ืคึผืึธืจืฅ 80 ืื•ืŸ 443
  • ื“ื™ ืคืขืœื“ ื ืึธืžืขืŸ ืคึฟืึทืจื‘ื•ื ื“ืŸ ืžื™ื˜ ื“ื™ ืขืคื ื˜ืœืขืš IP ืึทื“ืจืขืก ืคื•ืŸ ื“ืขื ืกืขืจื•ื•ืขืจ
  • ืึทืงืกืขืก ืžื™ื˜ ื•ื•ืึธืจืฆืœ ืจืขื›ื˜ (ืกื•ื“ืึธ).

ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ืื™ื‘ืขืจื‘ืœื™ืง

ื“ื™ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ืื™ื– ื“ื™ ื–ืขืœื‘ืข ื•ื•ื™ ื“ื™ืกืงืจื™ื™ื‘ื“ ืคืจื™ืขืจ, ืึท ื“ืจื™ื™-ืจื™ื™ ื•ื•ืขื‘ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ืขืก ื‘ืืฉื˜ื™ื™ื˜ ืคื•ืŸ PHP ืกืงืจื™ืคึผืก ืขืงืกืึทืงื™ื•ื˜ืึทื“ ืื•ื™ืฃ ื“ื™ PHP ืžืึธื˜ืึธืจ ืื•ืŸ ืกื˜ืึทื˜ื™ืง ื˜ืขืงืขืก ืคึผืจืึทืกืขืกื˜ ื“ื•ืจืš ื“ื™ ื•ื•ืขื‘ ืกืขืจื•ื•ืขืจ.

ืึทื•ื˜ืึธืžืึทื˜ื™ื ื’ ื•ื•ืึธืจื“ืคึผืจืขืกืก ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ืžื™ื˜ NGINX Unit ืื•ืŸ Ubuntu

ืึทืœื’ืขืžื™ื™ื ืข ืคึผืจื™ื ืฆื™ืคึผืŸ

  • ืคื™ืœืข ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืงืึทืžืึทื ื“ื– ืื™ืŸ ืึท ืฉืจื™ืคื˜ ื–ืขื ืขืŸ ืืœื ื’ืขื•ื•ื™ืงืœื˜ ืื™ืŸ ืื•ื™ื‘ ื˜ื ืึธื™ื ืคึฟืึทืจ ื™ื“ืขืžืึธื˜ืขื ืกื™: ื“ื™ ืฉืจื™ืคื˜ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืœื•ื™ืคืŸ ืขื˜ืœืขื›ืข ืžืึธืœ ืึธืŸ ื“ื™ ืจื™ื–ื™ืงื™ืจืŸ ืคื•ืŸ ื˜ืฉืึทื ื’ื™ื ื’ ืกืขื˜ื˜ื™ื ื’ืก ื•ื•ืึธืก ื–ืขื ืขืŸ ืฉื•ื™ืŸ ื’ืจื™ื™ื˜.
  • ื“ืขืจ ืฉืจื™ืคื˜ ืคืจื•ื•ื•ื˜ ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืคึฟื•ืŸ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ื–, ืึทื–ื•ื™ ืื™ืจ ืงืขื ืขืŸ ืฆื•ืœื™ื™ื’ืŸ ืกื™ืกื˜ืขื ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื•ื ื’ืขืŸ ืื™ืŸ ืื™ื™ืŸ ื‘ืึทืคึฟืขืœ (apt upgrade ืคึฟืึทืจ ื•ื‘ื•ื ื˜ื•).
  • ื˜ื™ืžื– ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ื“ืขื˜ืขืงื˜ ืึทื– ื–ื™ื™ ืœื•ื™ืคืŸ ืื™ืŸ ืึท ืงืึทื ื˜ื™ื™ื ืขืจ ืึทื–ื•ื™ ื–ื™ื™ ืงืขื ืขืŸ ื˜ื•ื™ืฉืŸ ื–ื™ื™ืขืจ ืกืขื˜ื˜ื™ื ื’ืก ืึทืงืึธืจื“ื™ื ื’ืœื™.
  • ืื™ืŸ ืกื“ืจ ืฆื• ืฉื˜ืขืœืŸ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืคืึธื“ืขื ืคึผืจืึทืกืขืกืึทื– ืฆื• ื–ื™ื™ืŸ ืœืึธื ื˜ืฉื˜ ืื™ืŸ ื“ื™ ืกืขื˜ื˜ื™ื ื’ืก, ื“ื™ ืฉืจื™ืคื˜ ืคืจื•ื•ื•ื˜ ืฆื• ื˜ืจืขืคืŸ ื“ื™ ืึธื˜ืึทืžืึทื˜ื™ืง ืกืขื˜ื˜ื™ื ื’ืก ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืื™ืŸ ืงืึทื ื˜ื™ื™ื ืขืจื–, ื•ื•ื™ืจื˜ื•ืึทืœ ืžืืฉื™ื ืขืŸ ืื•ืŸ ื™ื™ึทื–ื ื•ื•ืึทืจื’ ืกืขืจื•ื•ืขืจืก.
  • ื•ื•ืขืŸ ื“ื™ืกืงืจื™ื™ื‘ื™ื ื’ ืกืขื˜ื˜ื™ื ื’ืก, ืžื™ืจ ืฉื˜ืขื ื“ื™ืง ื˜ืจืึทื›ื˜ืŸ ืขืจืฉื˜ืขืจ ื•ื•ืขื’ืŸ ืึธื˜ืึทืžื™ื™ืฉืึทืŸ, ื•ื•ืึธืก ืžื™ืจ ื”ืึธืคึฟืŸ ื•ื•ืขื˜ ื•ื•ืขืจืŸ ื“ื™ ื™ืงืขืจ ืคึฟืึทืจ ืงืจื™ื™ื™ื˜ื™ื ื’ ื“ื™ื™ืŸ ืื™ื™ื’ืขื ืข ื™ื ืคืจืึทืกื˜ืจืึทืงื˜ืฉืขืจ ื•ื•ื™ ืงืึธื“.
  • ื›ืœ ืงืึทืžืึทื ื“ื– ื–ืขื ืขืŸ ืœื•ื™ืคืŸ ืคื•ืŸ ื“ื™ ื‘ืึทื ื™ืฆืขืจ ื•ื•ืึธืจืฆืœ, ื•ื•ื™ื™ึทืœ ื–ื™ื™ ื˜ื•ื™ืฉืŸ ื“ื™ ื™ืงืขืจื“ื™ืง ืกื™ืกื˜ืขื ืกืขื˜ื˜ื™ื ื’ืก, ืึธื‘ืขืจ ื•ื•ืึธืจื“ืคึผืจืขืกืก ื–ื™ืš ืœื•ื™ืคื˜ ื•ื•ื™ ืึท ืจืขื’ื•ืœืขืจ ื‘ืึทื ื™ืฆืขืจ.

ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืกื•ื•ื™ื•ื•ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื–

ืฉื˜ืขืœืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืกื•ื•ื™ื•ื•ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืื™ื™ื“ืขืจ ืคืœื™ืกื ื“ื™ืง ื“ื™ ืฉืจื™ืคื˜:

  • WORDPRESS_DB_PASSWORD - ื•ื•ืึธืจื“ืคึผืจืขืกืก ื“ืึทื˜ืึทื‘ื™ื™ืก ืคึผืึทืจืึธืœ
  • WORDPRESS_ADMIN_USER - ื•ื•ืึธืจื“ืคึผืจืขืกืก ืึทื“ืžื™ืŸ ื ืืžืขืŸ
  • WORDPRESS_ADMIN_PASSWORD - ื•ื•ืึธืจื“ืคึผืจืขืกืก ืึทื“ืžื™ืŸ ืคึผืึทืจืึธืœ
  • WORDPRESS_ADMIN_EMAIL - ื•ื•ืึธืจื“ืคึผืจืขืกืก ืึทื“ืžื™ืŸ ื‘ืœื™ืฆืคึผืึธืกื˜
  • WORDPRESS_URL - ืคื•ืœ URL ืคื•ืŸ ื“ื™ ื•ื•ืึธืจื“ืคึผืจืขืกืก ืคึผืœืึทืฅ, ืกื˜ืึทืจื˜ื™ื ื’ ืžื™ื˜ https://.
  • LETS_ENCRYPT_STAGING - ืœื™ื™ื“ื™ืง ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜, ืึธื‘ืขืจ ื“ื•ืจืš ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ ื•ื•ืขืจื˜ ืฆื• 1, ืื™ืจ ื•ื•ืขื˜ ื ื•ืฆืŸ Let's Encrypt ืก ืกื˜ืึทื’ื™ื ื’ ืกืขืจื•ื•ืขืจืก, ื•ื•ืึธืก ื–ืขื ืขืŸ ื ื•ื™ื˜ื™ืง ืฆื• ืึธืคื˜ ื‘ืขื˜ืŸ ืกืขืจื˜ื™ืคื™ืงืึทืฅ ื•ื•ืขืŸ ื˜ืขืกื˜ื™ื ื’ ื“ื™ื™ืŸ ืกืขื˜ื˜ื™ื ื’ืก, ืึทื ื“ืขืจืฉ Let's Encrypt ืงืขืŸ ื˜ืขืžืคึผืขืจืขืจืึทืœื™ ืคืึทืจืฉืคึผืึทืจืŸ ื“ื™ื™ืŸ IP ืึทื“ืจืขืก ืจืขื›ื˜ ืฆื• ื“ืขืจ ื’ืจื•ื™ืก ื ื•ืžืขืจ ืคื•ืŸ ืจื™ืงื•ื•ืขืก.

ื“ืขืจ ืฉืจื™ืคื˜ ื˜ืฉืขืงืก ืึทื– ื“ื™ ื•ื•ืึธืจื“ืคึผืจืขืกืก ืคึฟืึทืจื‘ื•ื ื“ืขื ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื– ื–ืขื ืขืŸ ื‘ืึทืฉื˜ื™ืžื˜ ืื•ืŸ ืขื’ื–ื™ืฅ ืื•ื™ื‘ ื–ื™ื™ ื–ืขื ืขืŸ ื ื™ืฉื˜.
ืฉืจื™ืคื˜ ืฉื•ืจื•ืช 572-576 ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ื•ื•ืขืจื˜ LETS_ENCRYPT_STAGING.

ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ืขืจื™ื™ื•ื•ื“ ืกื•ื•ื™ื•ื•ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื–

ื“ื™ ืฉืจื™ืคื˜ ืื•ื™ืฃ ืฉื•ืจื•ืช 55-61 ืฉื˜ืขืœื˜ ื“ื™ ืคืืœื’ืขื ื“ืข ื™ื ื•ื•ื™ื™ืจืึทื ืžืขื ืึทืœ ื•ื•ืขืจื™ืึทื‘ืึทืœื–, ืึธื“ืขืจ ืฆื• ืขื˜ืœืขื›ืข ืฉื•ื•ืขืจ-ืงืึธื“ืขื“ ื•ื•ืขืจื˜ ืึธื“ืขืจ ื ื™ืฆืŸ ืึท ื•ื•ืขืจื˜ ื“ืขืจื™ื™ื•ื•ื“ ืคื•ืŸ ื“ื™ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืฉื˜ืขืœืŸ ืื™ืŸ ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ืึธืคึผื˜ื™ื™ืœื•ื ื’:

  • DEBIAN_FRONTEND="noninteractive" - ื“ืขืจืฆื™ื™ืœื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืึทื– ื–ื™ื™ ืœื•ื™ืคืŸ ืื™ืŸ ืึท ืฉืจื™ืคื˜ ืื•ืŸ ืขืก ืื™ื– ืงื™ื™ืŸ ืžืขื’ืœืขื›ืงื™ื™ื˜ ืคื•ืŸ ื‘ืึทื ื™ืฆืขืจ ื™ื ื˜ืขืจืึทืงืฉืึทืŸ.
  • WORDPRESS_CLI_VERSION="2.4.0" - WordPress CLI ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" - ื˜ืฉืขืงืกื•ื ืคื•ืŸ ื“ื™ ื•ื•ืึธืจื“ืคึผืจืขืกืก CLI 2.4.0 ืขืงืกืขืงื•ื˜ืึทื‘ืœืข ื˜ืขืงืข (ื“ื™ ื•ื•ืขืจืกื™ืข ืื™ื– ืื ื’ืขื•ื•ื™ื–ืŸ ืื™ืŸ ื“ื™ ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง WORDPRESS_CLI_VERSION). ื“ื™ ืฉืจื™ืคื˜ ืื•ื™ืฃ ืฉื•ืจื” 162 ื ื™ืฆื˜ ื“ืขื ื•ื•ืขืจื˜ ืฆื• ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืึทื– ื“ื™ ืจื™ื›ื˜ื™ืง WordPress CLI ื˜ืขืงืข ืื™ื– ื“ืึทื•ื ืœืึธื•ื“ื™ื“.
  • UPLOAD_MAX_FILESIZE="16M" - ื“ื™ ืžืึทืงืกื™ืžื•ื ื˜ืขืงืข ื’ืจื™ื™ืก ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื•ืคึผืœืึธืึทื“ืขื“ ืฆื• ื•ื•ืึธืจื“ืคึผืจืขืกืก. ื“ื™ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืื™ื– ื’ืขื ื™ืฆื˜ ืื™ืŸ ืขื˜ืœืขื›ืข ืขืจื˜ืขืจ, ืึทื–ื•ื™ ืขืก ืื™ื– ื’ืจื™ื ื’ืขืจ ืฆื• ืฉื˜ืขืœืŸ ืขืก ืื•ื™ืฃ ืื™ื™ืŸ ืึธืจื˜.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" - ืกื™ืกื˜ืขื ื”ืึธืกื˜ื ืึทืžืข, ื™ืงืกื˜ืจืึทืงื˜ื™ื“ ืคื•ืŸ ื“ื™ WORDPRESS_URL ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง. ื’ืขื•ื•ื™ื™ื ื˜ ืฆื• ืงืจื™ื’ืŸ ืฆื•ื ืขืžืขืŸ TLS / SSL ืกืขืจื˜ื™ืคื™ืงืึทืฅ ืคื•ืŸ Let's Encrypt, ื•ื•ื™ ื’ืขื–ื•ื ื˜ ื•ื•ื™ ืคึฟืึทืจ ื™ื ืขืจืœืขืš ื•ื•ืึธืจื“ืคึผืจืขืกืก ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ.
  • NGINX_CONF_DIR="/etc/nginx" - ื“ืจืš ืฆื• ื“ืขืจ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ืžื™ื˜ NGINX ืกืขื˜ื˜ื™ื ื’ืก, ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ื“ื™ ื”ื•ื™ืคึผื˜ ื˜ืขืงืข nginx.conf.
  • CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" - ื“ืจืš ืฆื• ืœืึธื–ืŸ ืก ืขื ืงืจื™ืคึผื˜ ืกืขืจื˜ื™ืคื™ืงืึทืฅ ืคึฟืึทืจ ื“ื™ ื•ื•ืึธืจื“ืคึผืจืขืกืก ืคึผืœืึทืฅ, ื‘ืืงื•ืžืขืŸ ืคึฟื•ืŸ ื“ื™ ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง TLS_HOSTNAME.

ืึทืกื™ื™ื ื™ื ื’ ื”ืึธืกื˜ื ืึทืžืข ืฆื• ื•ื•ืึธืจื“ืคึผืจืขืกืก ืกืขืจื•ื•ืขืจ

ื“ืขืจ ืฉืจื™ืคื˜ ื‘ืึทืฉื˜ืขื˜ื™ืงื˜ ื“ื™ ื”ืึธืกื˜ื ืึทืžืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืกืขืจื•ื•ืขืจ ืึทื–ื•ื™ ืึทื– ื“ื™ ื•ื•ืขืจื˜ ื’ืœื™ื™ึทื›ืŸ ื“ื™ ืคืขืœื“ ื ืึธืžืขืŸ ืคื•ืŸ ื“ื™ ืคึผืœืึทืฅ. ื“ืึธืก ืื™ื– ื ื™ื˜ ื ื™ื™ื˜ื™ืง, ืึธื‘ืขืจ ืขืก ืื™ื– ืžืขืจ ื‘ืึทืงื•ื•ืขื ืฆื• ืฉื™ืงืŸ ืึทื•ื˜ื’ืึธื•ื™ื ื’ ืคึผืึธืกื˜ ื“ื•ืจืš ืกืžื˜ืคึผ ื•ื•ืขืŸ ืื™ืจ ืฉื˜ืขืœืŸ ืึท ืื™ื™ืŸ ืกืขืจื•ื•ืขืจ, ื•ื•ื™ ืงืึทื ืคื™ื’ื™ืขืจื“ ื“ื•ืจืš ื“ื™ ืฉืจื™ืคื˜.

ืฉืจื™ืคื˜ ืงืึธื“

# 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 ื’ืขื•ื•ื™ื™ื ื˜ ืฆื• ืœื•ื™ืคืŸ ืคึผืขืจื™ืึธื“ื™ืฉ ื˜ืึทืกืงืก, ืจื™ืงื•ื•ื™ื™ืขืจื– ื•ื•ืึธืจื“ืคึผืจืขืกืก ืฆื• ืงืขื ืขืŸ ืฆื•ื˜ืจื™ื˜ ื–ื™ืš ื“ื•ืจืš ื”ื˜ื˜ืคึผ. ืฆื• ืžืึทื›ืŸ ื–ื™ื›ืขืจ ืึทื– WP-Cron ืึทืจื‘ืขื˜ ืจื™ื›ื˜ื™ืง ืื™ืŸ ืึทืœืข ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ, ื“ื™ ืฉืจื™ืคื˜ ืžื•ืกื™ืฃ ืึท ืฉื•ืจื” ืฆื• ื“ืขืจ ื˜ืขืงืข / ืขื˜ืง / ืฆื‘ืื•ืชืึทื–ื•ื™ ืึทื– ื•ื•ืึธืจื“ืคึผืจืขืกืก ืงืขื ืขืŸ ืึทืงืกืขืก ื–ื™ืš ื“ื•ืจืš ื“ื™ ืœื•ืคึผื‘ืึทืงืง ืฆื•ื‘ื™ื ื“:

ืฉืจื™ืคื˜ ืงืึธื“

# 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 (ื–ืืœ ืก ืขื ืงืจื™ืคึผื˜) ืื•ืŸ ื–ื™ื™ืขืจ ื“ื™ืคึผืขื ื“ืึทื ืกื™ื–

ืึทืžืึธืœ ืึทืœืข ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ื– ื–ืขื ืขืŸ ืžื•ืกื™ืฃ, ืžื™ืจ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ ื“ื™ ืžืขื˜ืึทื“ืึทื˜ืึท ืื•ืŸ ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–. ื“ื™ ืคึผืึทืงืึทื“ื–ืฉืึทื– ืื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื•ืจืš ื“ื™ ืฉืจื™ืคื˜ ืื•ื™ืš ืึทืจื™ื™ึทื ื ืขืžืขืŸ 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

ื“ืขืจ ืฉืจื™ืคื˜ ืงืจื™ื™ื™ืฅ ืึท ืกืขื˜ื˜ื™ื ื’ืก ื˜ืขืงืข ืื™ืŸ ื“ื™ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ืงืึธื ืค.ื“. ื“ืึธืก ืฉื˜ืขืœื˜ ื“ื™ ืžืึทืงืกื™ืžื•ื ื˜ืขืงืข ื•ืคึผืœืึธืึทื“ ื’ืจื™ื™ืก ืคึฟืึทืจ 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

ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ MariaDB ื“ืึทื˜ืึทื‘ืึทืกืข ืกืขื˜ื˜ื™ื ื’ืก ืคึฟืึทืจ ื•ื•ืึธืจื“ืคึผืจืขืกืก

ืžื™ืจ ืื•ื™ืกื“ืขืจื•ื•ื™ื™ืœื˜ MariaDB ืื™ื‘ืขืจ MySQL ื•ื•ื™ื™ึทืœ ืขืก ื”ืื˜ ืžืขืจ ืงื”ืœ ืึทืงื˜ื™ื•ื•ื™ื˜ืขื˜ืŸ ืื•ืŸ ืงืขื ืขืŸ ืื•ื™ืš ื’ื™ื˜ ื‘ืขืกืขืจ ืคืึธืจืฉื˜ืขืœื•ื ื’ ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜ (ืžื™ืกื˜ืึธืžืข, ืึทืœืฅ ืื™ื– ืกื™ืžืคึผืœืขืจ ื“ืึธ: ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ MySQL, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืœื™ื™ื’ืŸ ืืŸ ืื ื“ืขืจ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™, ื‘ืขืขืจืขืš. ืื™ื‘ืขืจื–ืขืฆืขืจ).

ื“ืขืจ ืฉืจื™ืคื˜ ืงืจื™ื™ื™ืฅ ืึท ื ื™ื™ึทืข ื“ืึทื˜ืึทื‘ื™ื™ืก ืื•ืŸ ืงืจื™ื™ื™ืฅ ื•ื•ืึธืจื“ืคึผืจืขืกืก ืึทืงืกืขืก ืงืจืึทื“ืขื ื˜ืฉืึทืœื– ื“ื•ืจืš ื“ื™ ืœื•ืคึผื‘ืึทืงืง ืฆื•ื‘ื™ื ื“:

ืฉืจื™ืคื˜ ืงืึธื“

# 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. ืžื™ื˜ ืขืก, ืื™ืจ ืงืขื ืขืŸ ื™ื ืกื˜ืึทืœื™ืจืŸ ืื•ืŸ ืคื™ืจืŸ ื•ื•ืึธืจื“ืคึผืจืขืกืก ืกืขื˜ื˜ื™ื ื’ืก ืึธืŸ ืžืึทื ื™ื•ืึทืœื™ ืจืขื“ืึทื’ื™ืจืŸ ื˜ืขืงืขืก, ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืึธื“ืขืจ ืงืœืึธืฅ ืื™ืŸ ื“ื™ ืงืึธื ื˜ืจืึธืœ ื˜ืึทืคืœื™ืข. ืขืก ืงืขื ืขืŸ ืื•ื™ืš ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ ื˜ืขืžืขืก ืื•ืŸ ืึทื“ื™ืฉืึทื ื– ืื•ืŸ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ ื•ื•ืึธืจื“ืคึผืจืขืกืก.

ืฉืจื™ืคื˜ ืงืึธื“

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

ื™ื ืกื˜ืึธืœื™ื ื’ ืื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจ ื•ื•ืึธืจื“ืคึผืจืขืกืก

ื“ืขืจ ืฉืจื™ืคื˜ ื™ื ืกื˜ืึธืœื– ื“ื™ ืœืขืฆื˜ืข ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹ื•ื•ืึธืจื“ืคึผืจืขืกืก ืื™ืŸ ื“ื™ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ /var/www/wordpress, ืื•ืŸ ืื•ื™ืš ืขื ื“ืขืจื•ื ื’ืขืŸ ื“ื™ ืกืขื˜ื˜ื™ื ื’ืก:

  • ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืงืฉืจ ืึทืจื‘ืขื˜ ืื™ื‘ืขืจ ืึท ื™ื•ื ื™ืงืก ืคืขืœื“ ื›ืึธืœืขืœ ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ TCP ืื•ื™ืฃ ืœื•ืคึผื‘ืึทืงืง ืฆื• ืจืขื“ื•ืฆื™ืจืŸ TCP ืคืึทืจืงืขืจ.
  • ื•ื•ืึธืจื“ืคึผืจืขืกืก ืžื•ืกื™ืฃ ืึท ืคึผืจืขืคื™ืงืก https:// ืฆื• ื“ื™ URL ืื•ื™ื‘ ืงืœื™ื™ืึทื ืฅ ืคืึทืจื‘ื™ื ื“ืŸ ืฆื• NGINX ืื™ื‘ืขืจ ื”ื˜ื˜ืคึผืก, ืื•ืŸ ืื•ื™ืš ืกืขื ื“ื– ื“ื™ ื•ื•ื™ื™ึทื˜ ื”ืึธืกื˜ื ืึทืžืข (ื•ื•ื™ ืฆื•ื’ืขืฉื˜ืขืœื˜ ื“ื•ืจืš NGINX) ืฆื• PHP. ืžื™ืจ ื ื•ืฆืŸ ืึท ืฉื˜ื™ืง ืคื•ืŸ ืงืึธื“ ืฆื• ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ืขื.
  • ื•ื•ืึธืจื“ืคึผืจืขืกืก ื“ืึทืจืฃ ื”ื˜ื˜ืคึผืก ืฆื• ืœืึธื’ื™ืŸ
  • URL ืกื˜ืจื•ืงื˜ื•ืจ ืื™ื– ื‘ื™ืฉื˜ื™ืงืข ืžื™ื˜ืœ ื‘ืื–ื™ืจื˜
  • ืจื™ื›ื˜ื™ืง ื˜ืขืงืข ืกื™ืกื˜ืขื ืคึผืขืจืžื™ืฉืึทื ื– ื–ืขื ืขืŸ ื‘ืึทืฉื˜ื™ืžื˜ ืคึฟืึทืจ ื“ื™ ื•ื•ืึธืจื“ืคึผืจืขืกืก ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ.

ืฉืจื™ืคื˜ ืงืึธื“

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 Unit ืฆื• ืœื•ื™ืคืŸ PHP ืื•ืŸ ืฉืขืคึผืŸ ื•ื•ืึธืจื“ืคึผืจืขืกืก ืคึผืึทื˜ืก, ื™ื™ืกืึทืœื™ื™ื˜ื™ื ื’ ื“ื™ ื ืึธืžืขืŸ ืคื•ืŸ PHP ืคึผืจืึทืกืขืกืึทื– ืื•ืŸ ืึธืคึผื˜ื™ืžื™ื–ื™ื ื’ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืกืขื˜ื˜ื™ื ื’ืก. ืขืก ื–ืขื ืขืŸ ื“ืจื™ื™ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ื•ื•ืึธืก ื–ืขื ืขืŸ ื•ื•ืขืจื˜ ืฆื• ื‘ืึทืฆืึธืœืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ื˜ ืฆื•:

  • ื ืึทืžืขืกืคึผืึทืกืข ืฉื˜ื™ืฆืŸ ืื™ื– ื‘ืืฉืœืืกืŸ ื“ื•ืจืš ืฆื•ืฉื˜ืึทื ื“, ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ืึทื– ื“ื™ ืฉืจื™ืคื˜ ืื™ื– ืคืœื™ืกื ื“ื™ืง ืื™ืŸ ื“ืขื ืงืึทื ื˜ื™ื™ื ืขืจ. ื“ืึธืก ืื™ื– ื ื™ื™ื˜ื™ืง ื•ื•ื™ื™ึทืœ ืจื•ื‘ึฟ ืงืึทื ื˜ื™ื™ื ืขืจ ืกืขื˜ืึทืคึผืก ืฉื˜ื™ืฆืŸ ื ื™ืฉื˜ ื ืขืกื˜ืขื“ ืคืœื™ืกื ื“ื™ืง ืคื•ืŸ ืงืึทื ื˜ื™ื™ื ืขืจื–.
  • ืื•ื™ื‘ ืขืก ืื™ื– ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ื ืึทืžืขืกืคึผืึทืกืขืก, ื“ื™ ื ืึทืžืขืกืคึผืึทืกืข ืื™ื– ืคืึทืจืงืจื™ืคึผืœื˜ ื ืขืฅ. ื“ืึธืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืœืึธื–ืŸ ื•ื•ืึธืจื“ืคึผืจืขืกืก ืฆื• ืกื™ื™ืžืึทืœื˜ื™ื™ื ื™ืึทืกืœื™ ืคืึทืจื‘ื™ื ื“ืŸ ืฆื• ืขื ื“ืคึผื•ื™ื ืฅ ืื•ืŸ ื–ื™ื™ืŸ ืฆื•ื˜ืจื™ื˜ืœืขืš ืื•ื™ืฃ ื“ืขืจ ืื™ื ื˜ืขืจื ืขืฅ.
  • ื“ื™ ืžืึทืงืกื™ืžื•ื ื ื•ืžืขืจ ืคื•ืŸ ืคึผืจืึทืกืขืกืึทื– ืื™ื– ื‘ืืฉืœืืกืŸ ื•ื•ื™ ื’ื™ื™ื˜: (ืคืึทืจืึทื ืขืŸ ื–ื›ึผืจื•ืŸ ืคึฟืึทืจ ืคืœื™ืกื ื“ื™ืง MariaDB ืื•ืŸ NGINX Uniy) / (ื‘ืึทืจืึทืŸ ืฉื™ืขื•ืจ ืื™ืŸ PHP + 5)
    ื“ืขืจ ื•ื•ืขืจื˜ ืื™ื– ื‘ืึทืฉื˜ื™ืžื˜ ืื™ืŸ ื“ื™ NGINX Unit ืกืขื˜ื˜ื™ื ื’ืก.

ื“ืขืจ ื•ื•ืขืจื˜ ืื•ื™ืš ื™ืžืคึผืœื™ื™ื– ืึทื– ืขืก ื–ืขื ืขืŸ ืฉื˜ืขื ื“ื™ืง ื‘ื™ื™ึท ืžื™ื ื“ืกื˜ืขืจ ืฆื•ื•ื™ื™ PHP ืคึผืจืึทืกืขืกืึทื– ืคืœื™ืกื ื“ื™ืง, ื•ื•ืึธืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง ื•ื•ื™ื™ึทืœ ื•ื•ืึธืจื“ืคึผืจืขืกืก ืžืื›ื˜ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ื™ื™ืกื™ื ื’ืงืจืึทื ืึทืก ืจื™ืงื•ื•ืขืก ืฆื• ื–ื™ืš, ืื•ืŸ ืึธืŸ ื ืึธืš ืคึผืจืึทืกืขืกืึทื– ืคืœื™ืกื ื“ื™ืง, ืœืžืฉืœ, 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 ืคึฟืึทืจ ื•ื•ืึธืจื“ืคึผืจืขืกืก

ื“ืขืจื ืึธืš, ื“ืขืจ ืฉืจื™ืคื˜ ืงืจื™ื™ื™ืฅ ืึท ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืข ืคึฟืึทืจ ื•ื•ืึธืจื“ืคึผืจืขืกืก default.conf ืื™ืŸ ื“ืขื ืงืึทื˜ืึทืœืึธื’ ืงืึธื ืค.ื“. ื“ืึธ ืขืก ืื™ื– ืงืึทื ืคื™ื’ื™ืขืจื“:

  • ืึทืงื˜ืึทื•ื•ื™ื™ื˜ื™ื ื’ TLS ืกืขืจื˜ื™ืคื™ืงืึทืฅ ื‘ืืงื•ืžืขืŸ ืคื•ืŸ Let's Encrypt ื“ื•ืจืš Certbot (ืงืึทื ืคื™ื’ื™ืขืจื™ื ื’ ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืื™ืŸ ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืึธืคึผื˜ื™ื™ืœื•ื ื’)
  • ืงืึทื ืคื™ื’ื™ืขืจ TLS ื–ื™ื›ืขืจื”ื™ื™ื˜ ืกืขื˜ื˜ื™ื ื’ืก ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืจืขืงืึทืžืึทื ื“ื™ื™ืฉืึทื ื– ืคื•ืŸ Let's Encrypt
  • ื’ืขื‘ืŸ ืกืงื™ืคึผื˜ ื‘ืขื˜ืŸ ืงืึทื˜ืฉื™ื ื’ ืคึฟืึทืจ 1 ืฉืขื” ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜
  • ื“ื™ืกื™ื™ื‘ืึทืœ ืึทืงืกืขืก ืœืึธื’ื™ื ื’, ื•ื•ื™ ื’ืขื–ื•ื ื˜ ื•ื•ื™ ื˜ืขื•ืช ืœืึธื’ื™ื ื’ ืื•ื™ื‘ ื“ื™ ื˜ืขืงืข ืื™ื– ื ื™ื˜ ื’ืขืคึฟื•ื ืขืŸ, ืคึฟืึทืจ ืฆื•ื•ื™ื™ ืคึผืจืึธืกื˜ ื’ืขื‘ืขื˜ืŸ ื˜ืขืงืขืก: favicon.ico ืื•ืŸ robots.txt
  • ืœื™ื™ืงืขื ืขืŸ ืฆื•ื˜ืจื™ื˜ ืฆื• ืคืึทืจื‘ืึธืจื’ืŸ ื˜ืขืงืขืก ืื•ืŸ ืขื˜ืœืขื›ืข ื˜ืขืงืขืก .ืคืคึผืฆื• ืคืึทืจืžื™ื™ึทื“ืŸ ื•ืžืœืขื’ืึทืœ ืึทืงืกืขืก ืึธื“ืขืจ ืึทื ื™ื ื˜ืขื ืฉืึทื ืึทืœ ืงืึทื˜ืขืจ
  • ื“ื™ืกื™ื™ื‘ืึทืœ ืึทืงืกืขืก ืœืึธื’ื™ื ื’ ืคึฟืึทืจ ืกื˜ืึทื˜ื™ืง ืื•ืŸ ืฉืจื™ืคึฟื˜ ื˜ืขืงืขืก
  • ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ืขื ื˜ื™ื˜ืœ ืึทืงืกืขืก-ืงืึธื ื˜ืจืึธืœ-ืึทืœืึทื•-ืึธืจื™ื’ื™ืŸ ืคึฟืึทืจ ืฉืจื™ืคึฟื˜ ื˜ืขืงืขืก
  • ืึทื“ื™ื ื’ ืจื•ื˜ื™ื ื’ ืคึฟืึทืจ 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 ืคึฟืึทืจ ื–ืืœ ืก ืขื ืงืจื™ืคึผื˜ ืกืขืจื˜ื™ืคื™ืงืึทืฅ ืื•ืŸ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืจื™ื ื•ื™ื ื’ ื–ื™ื™

ืกืขืจื˜ื‘ืึธื˜ ืื™ื– ืึท ืคืจื™ื™ ื’ืขืฆื™ื™ึทื’ ืคื•ืŸ ื“ื™ ืขืœืขืงื˜ืจืึธื ื™ืฉ ืคืจืึธื ื˜ื™ืขืจ ื•ื•ื™ืงื™ืคึผืขื“ื™ืข (EFF) ื•ื•ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื‘ืึทืงื•ืžืขืŸ ืื•ืŸ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ื‘ืึทื ื™ื™ึทืขืŸ TLS ืกืขืจื˜ื™ืคื™ืงืึทืฅ ืคึฟื•ืŸ Let's Encrypt. ื“ืขืจ ืฉืจื™ืคื˜ ืคึผืขืจืคืึธืจืžื– ื“ื™ ืคืืœื’ืขื ื“ืข ืกื˜ืขืคึผืก ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ Certbot ืฆื• ืคึผืจืึธืฆืขืก ืกืขืจื˜ื™ืคื™ืงืึทืฅ ืคึฟื•ืŸ Let's Encrypt ืื™ืŸ NGINX:

  • ืกื˜ืึทืคึผืก NGINX
  • ื“ืึทื•ื ืœืึธื•ื“ื– ืจืขืงืึทืžืขื ื“ื™ื“ TLS ืกืขื˜ื˜ื™ื ื’ืก
  • ืœื•ื™ืคื˜ Certbot ืฆื• ื‘ืึทืงื•ืžืขืŸ ืกืขืจื˜ื™ืคื™ืงืึทืฅ ืคึฟืึทืจ ื“ืขื ืคึผืœืึทืฅ
  • ืจื™ืกื˜ืึทืจื˜ NGINX ืฆื• ื ื•ืฆืŸ ืกืขืจื˜ื™ืคื™ืงืึทืฅ
  • ืงืึทื ืคื™ื’ื™ืขืจ ืกืขืจื˜ื‘ืึธื˜ ืฆื• ืœื•ื™ืคืŸ ื˜ืขื’ืœืขืš ื‘ื™ื™ึท 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 ืขื ื™ื™ื‘ืึทืœื“. ืื™ืจ ืงืขืŸ ืื•ื™ืš, ื“ื™ืคึผืขื ื“ื™ื ื’ ืื•ื™ืฃ ื“ื™ื™ืŸ ื‘ืื“ืขืจืคืขื ื™ืฉืŸ, ืœื™ื™ื’ืŸ ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜:

ืคึฟืึทืจ ืืคื™ืœื• ื‘ืขืกืขืจ ืคึผืœืึทืฅ ืคืึธืจืฉื˜ืขืœื•ื ื’, ืžื™ืจ ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืึทืคึผื’ืจื™ื™ื“ื™ื ื’ ืฆื• NGINX Plus, ืื•ื ื“ื–ืขืจ ื’ืขืฉืขืคื˜-ืžื™ื™ื ื•ื ื’ ื’ืขืฉืขืคื˜ ืคึผืจืึธื“ื•ืงื˜ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ื™ ืึธืคึฟืŸ ืžืงื•ืจ NGINX. ื–ื™ื™ืŸ ืื‘ืื ืขื ื˜ืŸ ื•ื•ืขืœืŸ ื‘ืึทืงื•ืžืขืŸ ืึท ื“ื™ื ืึทืžื™ืงืึทืœืœื™ ืœืึธื•ื“ื™ื“ Brotli ืžืึธื“ื•ืœืข, ื•ื•ื™ ื’ืขื–ื•ื ื˜ ื•ื•ื™ (ืคึฟืึทืจ ืึทืŸ ื ืึธืš ืึธืคึผืฆืึธืœ) NGINX ModSecurity WAF. ืžื™ืจ ืื•ื™ืš ืคืึธืจืฉืœืึธื’ืŸ NGINX ืึทืคึผ ืคึผืจืึธื˜ืขืงื˜, ืึท WAF ืžืึธื“ื•ืœืข ืคึฟืึทืจ NGINX Plus ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืื™ื ื“ื•ืกื˜ืจื™ืข-ืœื™ื“ื™ื ื’ ื–ื™ื›ืขืจื”ื™ื™ื˜ ื˜ืขื›ื ืึธืœืึธื’ื™ืข ืคึฟื•ืŸ F5.

ื ื‘ ืคึฟืึทืจ ืฉื˜ื™ืฆืŸ ืคื•ืŸ ืึท ื”ื•ื™ืš-ืžืึทืกืข ื•ื•ืขื‘ื–ื™ื™ื˜ืœ, ืื™ืจ ืงืขื ื˜ ืงืึธื ื˜ืึทืงื˜ ืกืคึผืขืฉืึทืœืึทืกืฅ Southbridge. ืžื™ืจ ื•ื•ืขืœืŸ ืขื ืฉื•ืจ ืฉื ืขืœ ืื•ืŸ ืคืึทืจืœืึธื–ืœืขืš ืึธืคึผืขืจืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ื™ืŸ ื•ื•ืขื‘ื–ื™ื™ื˜ืœ ืึธื“ืขืจ ื“ื™ื ืกื˜ ืื•ื ื˜ืขืจ ืงื™ื™ืŸ ืžืึทืกืข.

ืžืงื•ืจ: www.habr.com