αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ WordPress αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‡αžΆαž˜αž½αž™ NGINX Unit αž“αž·αž„ Ubuntu

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ WordPress αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‡αžΆαž˜αž½αž™ NGINX Unit αž“αž·αž„ Ubuntu

αž˜αžΆαž“αžŸαž˜αŸ’αž—αžΆαžšαŸˆαž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ WordPress αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€ Google αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ "WordPress install" αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž›αž‘αŸ’αž’αž•αž›αž”αŸ’αžšαž αŸ‚αž›αž€αž“αŸ’αž›αŸ‡αž›αžΆαž“αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžαžΆαž˜αž–αž·αžαž˜αžΆαž“αž˜αž‚αŸ’αž‚αž»αž‘αŸ’αž‘αŸαžŸαž€αŸαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžαž·αž…αžαž½αž…αž”αŸ†αž•αž»αžαž“αŸ…αž‘αžΈαž“αŸ„αŸ‡ αžŠαŸ‚αž›αž’αžΆαž…αž‡αž½αž™αž’αŸ’αž“αž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ WordPress αž“αž·αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž–αž½αž€αž‚αŸαž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž™αžΌαžšαŸ” αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž’αžΆαžŸαŸ’αžšαŸαž™αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αž‘αŸ…αž›αžΎαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž¬αžœαžΆαž’αžΆαž…αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αžΆαžšαž–αž“αŸ’αž™αž›αŸ‹αž›αž˜αŸ’αž’αž·αžαž’αŸ’αžœαžΎαž±αŸ’αž™αž’αžαŸ’αžαž”αž‘αž–αž·αž”αžΆαž€αž’αžΆαž“αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΌαžœαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž›αŸ’αž’αž”αŸ†αž•αž»αžαž“αŸƒαž–αž·αž—αž–αž›αŸ„αž€αž‘αžΆαŸ†αž„αž–αžΈαžšαžŠαŸ„αž™αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžŸαŸ’αž‚αŸ’αžšαžΈαž” bash αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αž‘αžΎαž„ WordPress αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸ…αž›αžΎ Ubuntu αž αžΎαž™αž™αžΎαž„αž“αžΉαž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžœαžΆ αžŠαŸ„αž™αž–αž“αŸ’αž™αž›αŸ‹αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŠαž»αŸ†αž“αžΈαž˜αž½αž™αŸ—αž’αŸ’αžœαžΎ αž“αž·αž„αž€αžΆαžšαžŠαŸ„αŸ‡αžŠαžΌαžšαžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž’αŸ’αžœαžΎαž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαž…αž“αžΆαŸ” αžœαžΆαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž‡αžΆαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž’αŸ’αž“αž€αž’αžΆαž…αžšαŸ†αž›αž„αž’αžαŸ’αžαž”αž‘αž“αŸƒαž’αžαŸ’αžαž”αž‘αž αžΎαž™αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚ αž™αž€αžŸαŸ’αž‚αŸ’αžšαžΈαž” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž€αŸ‚αž”αŸ’αžšαŸ‚ αž“αž·αž„αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž”αžšαž·αžŸαŸ’αžαžΆαž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž‚αžΊαž‡αžΆαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž”αŸ’αž›αž€, αžšαžΌαž”αž—αžΆαž–αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž›αžΎ NGINX Unit αž“αž·αž„αžŸαž˜αžšαž˜αŸ’αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž§αžŸαŸ’αžŸαžΆαž αž€αž˜αŸ’αž˜αŸ”

αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž”αžΆαž“αž’αž—αž·αžœαžŒαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ WordPress αžŠαŸ„αž™αž”αŸ’αžšαžΎ NGINX Unit αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ αž’αžαŸ’αžαž”αž‘αž…αžΆαžŸαŸ‹αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž™αžΎαž„αž€αŸαž“αžΉαž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αž•αž„αžŠαŸ‚αžš (αžŠαžΌαž…αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸαžšαŸ€αž“αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‡αžΆαž…αŸ’αžšαžΎαž“):

  • WordPress CLI
  • αžαŸ„αŸ‡ αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž” αž“αž·αž„αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš TLSSSL
  • αž€αžΆαžšαž”αž“αŸ’αžαžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·
  • αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹ NGINX
  • αž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹ NGINX
  • HTTPS αž“αž·αž„ HTTP/2 αž‚αžΆαŸ†αž‘αŸ’αžš
  • αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜

αž’αžαŸ’αžαž”αž‘αž“αžΉαž„αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αž½αž™ αžŠαŸ‚αž›αž“αžΉαž„αž”αž„αŸ’αž αŸ„αŸ‡αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αž αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž”αž˜αŸ’αžšαžΎαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš PHP αž“αž·αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αŸ’αž“αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΆαž›αž‚αŸ’αž“αžΆαŸ” αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αžŠαŸ„αž™αž˜αžΆαž“αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž αž“αž·αž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‡αžΆαž…αŸ’αžšαžΎαž“αž‚αžΊαž‡αžΆαž”αŸ’αžšαž’αžΆαž“αž”αž‘αžŠαŸαž˜αžΆαž“αžŸαž€αŸ’αžαžΆαž“αž»αž–αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αž“αžΆαž‚αžαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž±αŸ’αž™αž™αžΎαž„αžŸαžšαžŸαŸαžšαž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαž˜αž½αž™αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžŸαžΌαž˜αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžαž·αž™αŸ„αž”αž›αŸ‹αŸ”

αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžš

  • αž’αž»αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ (αž’αž·αž›αŸ” αžŸαŸŠαžΈαŸ” ស៊ី ឬ Lxd) αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž αž¬αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž•αŸ’αž“αŸ‚αž€αžšαžΉαž„αž’αž˜αŸ’αž˜αžαžΆ αžŠαŸ‚αž›αž˜αžΆαž“ RAM αž™αŸ‰αžΆαž„αžαž·αž… 512MB αž“αž·αž„ Ubuntu 18.04 αž¬αžŠαŸ†αž‘αžΎαž„αžαŸ’αž˜αžΈαŸ—αž‡αžΆαž„αž“αŸαŸ‡αŸ”
  • αž…αŸ’αžšαž€αž…αžΌαž›αž”αŸ’αžšαžΎαž’αŸŠαžΈαž“αž’αžΊαžŽαž·αž 80 αž“αž·αž„ 443
  • αžˆαŸ’αž˜αŸ„αŸ‡αžŠαŸ‚αž“αžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžŸαžΆαž’αžΆαžšαžŽαŸˆαžšαž”αžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αŸαŸ‡αŸ”
  • αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž‡αžΆαž˜αž½αž™αžŸαž·αž‘αŸ’αž’αž·αž‡αžΆ root (sudo) αŸ”

αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž‘αžΌαž‘αŸ…αž“αŸƒαžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜

αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž‚αžΊαžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αžΉαž„αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆ αž˜αž»αž“αž“αŸαŸ‡αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžŽαŸ’αžαžΆαž‰αž”αžΈαž‡αžΆαž“αŸ‹αŸ” αžœαžΆαž˜αžΆαž“αžŸαŸ’αž‚αŸ’αžšαžΈαž” PHP αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ PHP αž“αž·αž„αž―αž€αžŸαžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αžαžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžšαŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ WordPress αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‡αžΆαž˜αž½αž™ NGINX Unit αž“αž·αž„ Ubuntu

αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž‘αžΌαž‘αŸ…

  • αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž»αŸ†αž–αŸαž‘αŸ’αž’αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž›αž€αŸ’αžαžαžŽαŸ’αžŒαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αž‚αŸ’αž˜αžΆαž“αžŸαž˜αžαŸ’αžαž—αžΆαž–αŸ– αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αž…αŸ’αžšαžΎαž“αžŠαž„αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž αžΆαž“αž·αž—αŸαž™αž“αŸƒαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αŸ”
  • αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž–αŸ’αž™αžΆαž™αžΆαž˜αžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž’αžΆαž”αŸ‹αžŠαŸαžαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž€αŸ’αž“αž»αž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž˜αž½αž™ (apt upgrade αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸŠαžΌαž”αŸŠαž»αž“αž‘αžΌ)αŸ”
  • αž€αŸ’αžšαž»αž˜αž–αŸ’αž™αžΆαž™αžΆαž˜αžšαž€αžƒαžΎαž‰αžαžΆαž–αž½αž€αž‚αŸαž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžš αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž–αž½αž€αž‚αŸαž’αžΆαž…αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαžŸαŸ’αžšαž”αžαžΆαž˜αŸ”
  • αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž…αŸ†αž“αž½αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž–αŸ’αž™αžΆαž™αžΆαž˜αž‘αžŸαŸ’αžŸαž“αŸαž‘αžΆαž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžš αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž•αŸ’αž“αŸ‚αž€αžšαžΉαž„αŸ”
  • αž“αŸ…αž–αŸαž›αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ αž™αžΎαž„αžαŸ‚αž„αžαŸ‚αž‚αž·αžαž‡αžΆαž˜αž»αž“αž’αŸ†αž–αžΈαžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜ αžŠαŸ‚αž›αž™αžΎαž„αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž“αžΉαž„αž€αŸ’αž›αžΆαž™αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‡αžΆαž€αžΌαžŠαŸ”
  • αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΈαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž‡αžΆ rootαžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž–αž½αž€αž‚αŸαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚ WordPress αžαŸ’αž›αž½αž“αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž˜αŸ’αž˜αžαžΆαŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“

αž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αž˜αž»αž“αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž”αŸ–

  • WORDPRESS_DB_PASSWORD - αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ WordPress
  • WORDPRESS_ADMIN_USER - αžˆαŸ’αž˜αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ WordPress
  • WORDPRESS_ADMIN_PASSWORD - αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ WordPress
  • WORDPRESS_ADMIN_EMAIL - αž’αŸŠαžΈαž˜αŸ‚αž›αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ WordPress
  • WORDPRESS_URL - URL αž–αŸαž‰αž›αŸαž‰αž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžš WordPress αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™ https://.
  • LETS_ENCRYPT_STAGING β€” αž‘αž‘αŸβ€‹αžαžΆαž˜β€‹αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžŠαŸ„αž™β€‹αž€αŸ†αžŽαžαŸ‹β€‹αžαž˜αŸ’αž›αŸƒβ€‹αž‘αŸ… 1 αž’αŸ’αž“αž€β€‹αž“αžΉαž„β€‹αž”αŸ’αžšαžΎβ€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸβ€‹αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›β€‹αžšαž”αžŸαŸ‹ Let's Encrypt αžŠαŸ‚αž›β€‹αž…αžΆαŸ†αž”αžΆαž…αŸ‹β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αžŸαŸ’αž“αžΎαžŸαž»αŸ†β€‹αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšβ€‹αž‰αžΉαž€αž‰αžΆαž”αŸ‹β€‹αž“αŸ…αž–αŸαž›β€‹αžŸαžΆαž€αž›αŸ’αž”αž„β€‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹β€‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž”αžΎβ€‹αž˜αž·αž“β€‹αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž‘αŸ Let's Encrypt αž’αžΆαž…β€‹αž“αžΉαž„β€‹αž”αž·αž‘β€‹αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€β€‹αž‡αžΆβ€‹αž”αžŽαŸ’αžŠαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“ αžŠαŸ„αž™αžŸαžΆαžšβ€‹αž…αŸ†αž“αž½αž“β€‹αžŸαŸ†αžŽαžΎβ€‹αž…αŸ’αžšαžΎαž“αŸ”

αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαž’αžαŸαžšαžŠαŸ‚αž›αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž”αŸ’αž›αž€, αžšαžΌαž”αž—αžΆαž–αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹ αž“αž·αž„αž…αŸαž‰αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαž˜αž·αž“αž˜αŸ‚αž“αŸ”
αž”αž“αŸ’αž‘αžΆαžαŸ‹αžŸαŸ’αž‚αŸ’αžšαžΈαž” 572-576 αž–αž·αž“αž·αžαŸ’αž™αžαž˜αŸ’αž›αŸƒ LETS_ENCRYPT_STAGING.

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“

αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž“αŸ…αž›αžΎαž”αž“αŸ’αž‘αžΆαžαŸ‹ 55-61 αž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αž‘αžΆαŸ†αž„αžαž˜αŸ’αž›αŸƒ hard-code αž˜αž½αž™αž…αŸ†αž“αž½αž“ αž¬αž”αŸ’αžšαžΎαžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž”αžΆαž“αž˜αž€αž–αžΈαž’αžαŸαžšαžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž˜αž»αž“αŸ–

  • 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 αŸ” αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš TLS/SSL αžŠαŸ‚αž›αžŸαž˜αžŸαŸ’αžšαž”αž–αžΈ Let's Encrypt αž€αŸαžŠαžΌαž…αž‡αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ WordPress αžαžΆαž„αž€αŸ’αž“αž»αž„αž•αž„αžŠαŸ‚αžšαŸ”
  • NGINX_CONF_DIR="/etc/nginx" - αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αžαžαžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ NGINX αžšαž½αž˜αž‘αžΆαŸ†αž„αž―αž€αžŸαžΆαžšαž˜αŸ nginx.conf.
  • CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" β€” αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹ Let's Encrypt Certificate αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸαž αž‘αŸ†αž–αŸαžš WordPress αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αž–αžΈαž’αžαŸαžš TLS_HOSTNAME.

αž€αŸ†αžŽαžαŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ WordPress

αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž€αŸ†αžŽαžαŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžšαž”αžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαž˜αŸ’αž›αŸƒαžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αžΉαž„αžˆαŸ’αž˜αŸ„αŸ‡αžŠαŸ‚αž“αžšαž”αžŸαŸ‹αž‚αŸαž αž‘αŸ†αž–αŸαžšαŸ” αžœαžΆαž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αž‰αžΎαžŸαŸ†αž”αž»αžαŸ’αžšαž…αŸαž‰αžαžΆαž˜αžšαž™αŸˆ SMTP αž“αŸ…αž–αŸαž›αžŠαŸ†αž‘αžΎαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžαŸ‚αž˜αž½αž™ αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αžŸαŸ’αž‚αŸ’αžšαžΈαž”αŸ”

αž€αžΌαžŠαžŸαŸ’αž‚αŸ’αžšαžΈαž”

# Change the hostname to be the same as the WordPress hostname
if [ ! "$(hostname)" == "${TLS_HOSTNAME}" ]; then
  echo " Changing hostname to ${TLS_HOSTNAME}"
  hostnamectl set-hostname "${TLS_HOSTNAME}"
fi

αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžˆαŸ’αž˜αŸ„αŸ‡αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‘αŸ… /etc/hosts

αž”αž“αŸ’αžαŸ‚αž˜αŸ” WP-Cron αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž·αž…αŸ’αž…αž€αžΆαžšαžαžΆαž˜αž€αžΆαž›αž€αŸ†αžŽαžαŸ‹ αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™ WordPress αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαžŠαŸ„αž™αžαŸ’αž›αž½αž“αžœαžΆαžαžΆαž˜αžšαž™αŸˆ HTTP αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΆαž€αžŠαžαžΆ WP-Cron αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸ…αž€αŸ’αž“αž»αž„αž‚αŸ’αžšαž”αŸ‹αž”αžšαž·αžŸαŸ’αžαžΆαž“ αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž”αž“αŸ’αžαŸ‚αž˜αž”αž“αŸ’αž‘αžΆαžαŸ‹αž˜αž½αž™αž‘αŸ…αž―αž€αžŸαžΆαžš / etc / hostsαžŠαžΌαž…αŸ’αž“αŸαŸ‡ WordPress αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαžŠαŸ„αž™αžαŸ’αž›αž½αž“αžœαžΆαžαžΆαž˜αžšαž™αŸˆαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αŸ–

αž€αžΌαžŠαžŸαŸ’αž‚αŸ’αžšαžΈαž”

# Add the hostname to /etc/hosts
if [ "$(grep -m1 "${TLS_HOSTNAME}" /etc/hosts)" = "" ]; then
  echo " Adding hostname ${TLS_HOSTNAME} to /etc/hosts so that WordPress can ping itself"
  printf "::1 %sn127.0.0.1 %sn" "${TLS_HOSTNAME}" "${TLS_HOSTNAME}" >> /etc/hosts
fi

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‡αŸ†αž αžΆαž“αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŠαŸ‚αž›αž“αŸ…αžŸαŸαžŸαžŸαž›αŸ‹αž‘αžΆαž˜αž‘αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αž½αž™αž…αŸ†αž“αž½αž“ αž αžΎαž™αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαžƒαŸ’αž›αžΆαŸ†αž„αž˜αžΆαž“αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αŸ” αž™αžΎαž„αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž”αž‰αŸ’αž‡αžΈαžƒαŸ’αž›αžΆαŸ†αž„ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžŠαŸ†αž‘αžΎαž„αž§αž”αž€αžšαžŽαŸαž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ–

αž€αžΌαžŠαžŸαŸ’αž‚αŸ’αžšαžΈαž”

# Make sure tools needed for install are present
echo " Installing prerequisite tools"
apt-get -qq update
apt-get -qq install -y 
  bc 
  ca-certificates 
  coreutils 
  curl 
  gnupg2 
  lsb-release

αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž’αž„αŸ’αž‚αž—αžΆαž– NGINX αž“αž·αž„αžƒαŸ’αž›αžΆαŸ†αž„ NGINX

αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŠαŸ†αž‘αžΎαž„αž’αž„αŸ’αž‚αž—αžΆαž– NGINX αž“αž·αž„αž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž  NGINX αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„ 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) αž“αž·αž„αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžƒαŸ’αž›αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜ αž™αžΎαž„αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αŸαžαžΆ αž“αž·αž„αžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αžŠαŸ„αž™αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž€αŸαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ 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 αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αž„αŸ’αž‚αž—αžΆαž– 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 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ WordPress

αž™αžΎαž„αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ MariaDB αž›αžΎ MySQL αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž˜αžΆαž“αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžŸαž αž‚αž˜αž“αŸαž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“ αž αžΎαž™αž’αžΆαž…αž•αž„αžŠαŸ‚αžšαŸ” αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„αž˜αž»αž“αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ (αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž’αŸ’αžœαžΈαŸ—αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αž‡αžΆαž„αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ– αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αž‘αžΎαž„ MySQL αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αžƒαŸ’αž›αžΆαŸ†αž„αž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž, αž”αŸ’αžšαž αŸ‚αž› αž’αŸ’αž“αž€αž”αž€αž”αŸ’αžšαŸ‚) αŸ”

αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αž˜αžΈ αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαž–αŸαžαŸŒαž˜αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎ WordPress αžαžΆαž˜αžšαž™αŸˆαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αŸ–

αž€αžΌαžŠαžŸαŸ’αž‚αŸ’αžšαžΈαž”

# Set up the WordPress database
echo " Configuring MariaDB for WordPress"
mysqladmin create wordpress || echo "Ignoring above error because database may already exist"
mysql -e "GRANT ALL PRIVILEGES ON wordpress.* TO "wordpress"@"localhost" IDENTIFIED BY "$WORDPRESS_DB_PASSWORD"; FLUSH PRIVILEGES;"

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ WordPress CLI

αž“αŸ…αž‡αŸ†αž αžΆαž“αž“αŸαŸ‡αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ 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 αŸ”
  • WordPress αž”αž“αŸ’αžαŸ‚αž˜αž”αž»αž–αŸ’αžœαž”αž‘ https:// αž‘αŸ… URL αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αžαž·αžαž·αž‡αž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… NGINX តអម HTTPS αž αžΎαž™αž€αŸαž•αŸ’αž‰αžΎαžˆαŸ’αž˜αŸ„αŸ‡αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž–αžΈαž…αž˜αŸ’αž„αžΆαž™ (αžŠαžΌαž…αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αžŠαŸ„αž™ 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

αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ NGINX Unit αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš PHP αž“αž·αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž•αŸ’αž›αžΌαžœ WordPress αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈ namespace αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš PHP αž“αž·αž„αž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαŸ” αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž”αžΈαžŠαŸ‚αž›αž‚αž½αžšαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž…αŸ†αž–αŸ„αŸ‡αŸ–

  • αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžš Namespace αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž›αž€αŸ’αžαžαžŽαŸ’αžŒ αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαŸ” αž“αŸαŸ‡αž‡αžΆαž€αžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž€αž»αž„αžαžΊαž“αŸαžšαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž˜αž·αž“αž‚αžΆαŸ†αž‘αŸ’αžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ†αžŽαžΆαž‰αŸ‹αŸ”
  • αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ namespaces αž“αŸ„αŸ‡ namespace αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘ αž”αžŽαŸ’αžαžΆαž‰. αž“αŸαŸ‡αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™ WordPress αž—αŸ’αž‡αžΆαž”αŸ‹αž€αŸ’αž“αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΆαž›αž‚αŸ’αž“αžΆαž‘αŸ…αž€αžΆαž“αŸ‹αž…αŸ†αžŽαž»αž…αž”αž‰αŸ’αž…αž”αŸ‹ αž“αž·αž„αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž”αžΆαž“αž“αŸ…αž›αžΎαž’αŸŠαžΈαž“αž’αžΊαžŽαž·αžαŸ”
  • αž…αŸ†αž“αž½αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αžαž·αž”αžšαž˜αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ– (αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš MariaDB αž“αž·αž„ NGINX Uniy)/(αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹ RAM αž€αŸ’αž“αž»αž„ PHP + 5)
    αžαž˜αŸ’αž›αŸƒαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αž„αŸ’αž‚αž—αžΆαž– 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

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ NGINX αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ WordPress

αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ WordPress default.conf αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžαžΆαž‘αž»αž€ conf.d. αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ†αž‘αžΎαž„αŸ–

  • αž€αžΆαžšαž’αŸ’αžœαžΎαž±αŸ’αž™αžŸαž€αž˜αŸ’αž˜αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš TLS αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αž–αžΈ Let's Encrypt αžαžΆαž˜αžšαž™αŸˆ Certbot (αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžœαžΆαž“αžΉαž„αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹)
  • αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– TLS αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž–αžΈ Let's Encrypt
  • αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŸαŸ†αžŽαžΎαžŠαŸ‚αž›αž”αžΆαž“αžšαŸ†αž›αž„αžšαž™αŸˆαž–αŸαž› 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

αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ 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
  • αž˜αŸ‰αžΌαžŒαŸ‚αž›αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– с αž…αŸ’αž”αžΆαž”αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ WordPressαžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžšαž–αžΆαžšαž€αžΆαžšαžœαžΆαž™αž”αŸ’αžšαž αžΆαžšαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”
  • αž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ WordPress αžŸαžΆαž€αžŸαž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€
  • αž€αžΆαžšαž€αžΆαžšαž–αžΆαžš αžŠαŸ„αž™αž˜αžΆαž“αž‡αŸ†αž“αž½αž™ ធអម័រ (αž“αŸ…αž›αžΎαž’αŸŠαžΌαž”αŸŠαž»αž“αž‘αžΌ)
  • Postfix ឬ msmtp αžŠαžΌαž…αŸ’αž“αŸαŸ‡ WordPress αž’αžΆαž…αž•αŸ’αž‰αžΎαžŸαŸ†αž”αž»αžαŸ’αžšαž”αžΆαž“αŸ”
  • αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž‚αŸαž αž‘αŸ†αž–αŸαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž’αŸ’αž“αž€αž™αž›αŸ‹αž–αžΈαž…αŸ†αž“αž½αž“αž…αžšαžΆαž…αžšαžŽαŸαžŠαŸ‚αž›αžœαžΆαž’αžΆαž…αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αžΆαž“αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‚αŸαž αž‘αŸ†αž–αŸαžšαž€αžΆαž“αŸ‹αžαŸ‚αž”αŸ’αžšαžŸαžΎαžš αž™αžΎαž„αžŸαžΌαž˜αžŽαŸ‚αž“αžΆαŸ†αž±αŸ’αž™αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž‘αŸ… NGINX αž”αžΌαž€αž•αž›αž·αžαž•αž›αž–αžΆαžŽαž·αž‡αŸ’αž‡αž€αž˜αŸ’αž˜αžαŸ’αž“αžΆαž€αŸ‹αžŸαž αž‚αŸ’αžšαžΆαžŸαžšαž”αžŸαŸ‹αž™αžΎαž„αž•αŸ’αž’αŸ‚αž€αž›αžΎαž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž  NGINX αŸ” αž’αžαž·αžαž·αž‡αž“αžšαž”αžŸαŸ‹αžœαžΆαž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“αž˜αŸ‰αžΌαžŒαž»αž› Brotli αžŠαŸ‚αž›αž•αŸ’αž‘αž»αž€αžŠαŸ„αž™αžαžΆαž˜αžœαž“αŸ’αž αž€αŸαžŠαžΌαž…αž‡αžΆ (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž›αŸƒαž”αž“αŸ’αžαŸ‚αž˜) NGINX ModSecurity WAF. αž™αžΎαž„αž€αŸαž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αž•αž„αžŠαŸ‚αžšαŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ NGINX αž€αžΆαžšαž–αžΆαžšαž˜αŸ‰αžΌαžŒαž»αž› WAF αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ NGINX Plus αž•αŸ’αž’αŸ‚αž€αž›αžΎαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžˆαžΆαž“αž˜αž»αžαž‚αŸαž€αŸ’αž“αž»αž„αž§αžŸαŸ’αžŸαžΆαž αž€αž˜αŸ’αž˜αž–αžΈ F5 αŸ”

NB αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαž‚αŸαž αž‘αŸ†αž–αŸαžšαž•αŸ’αž‘αž»αž€αžαŸ’αž–αžŸαŸ‹ αž’αŸ’αž“αž€αž’αžΆαž…αž‘αžΆαž€αŸ‹αž‘αž„αž’αŸ’αž“αž€αž―αž€αž‘αŸαžŸ αžŸαŸ…αž”αŸ’αžšαŸŠαžΈαž. αž™αžΎαž„αž“αžΉαž„αž’αžΆαž“αžΆαž”αžΆαž“αž“αžΌαžœαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž›αžΏαž“ αž“αž·αž„αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžš αž¬αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž”αž“αŸ’αž‘αž»αž€αžŽαžΆαž˜αž½αž™αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com