NGINX يونٽ ۽ Ubuntu سان خودڪار ورڈپریس تنصيب

NGINX يونٽ ۽ Ubuntu سان خودڪار ورڈپریس تنصيب

ورڈپریس کي ڪيئن انسٽال ڪجي ان تي ڪيترائي سبق آهن، گوگل سرچ لاءِ “WordPress install” لڳ ڀڳ اڌ لک نتيجا ملندا. جڏهن ته، حقيقت ۾، انهن مان تمام ٿورڙا سٺا رهنمائي ڪندڙ آهن، جن جي مطابق توهان ورڈپریس ۽ هيٺيون آپريٽنگ سسٽم کي انسٽال ۽ ترتيب ڏئي سگهو ٿا ته جيئن اهي ڊگهي عرصي تائين سپورٽ ڪرڻ جي قابل هجن. ٿي سگهي ٿو ته صحيح سيٽنگون خاص ضرورتن تي تمام گهڻي انحصار ڪن ٿيون، يا اهو ان حقيقت جي ڪري آهي ته تفصيلي وضاحت مضمون کي پڙهڻ ۾ مشڪل بڻائي ٿي.

هن آرٽيڪل ۾، اسان ڪوشش ڪنداسين ته هڪ بش اسڪرپٽ مهيا ڪندي هڪ بش اسڪرپٽ مهيا ڪندي خودڪار طريقي سان ورڈپریس کي Ubuntu تي انسٽال ڪرڻ لاء، انهي سان گڏ ان جي ذريعي هلڻ، وضاحت ڪندي ته هر ٽڪرا ڇا ڪندو آهي، ۽ انهي سان گڏ اسان ان کي ترقي ڪرڻ ۾ سمجھوتو ڪيو آهي. . جيڪڏهن توهان هڪ ترقي يافته صارف آهيو، ته توهان مضمون جي متن کي ڇڏي سگهو ٿا ۽ صرف اسڪرپٽ وٺو توهان جي ماحول ۾ تبديلي ۽ استعمال لاء. اسڪرپٽ جو آئوٽ پٽ هڪ ڪسٽم ورڈپریس تنصيب آهي ليٽس انڪرپٽ سپورٽ سان، NGINX يونٽ تي هلندڙ ۽ پيداوار جي استعمال لاءِ موزون آهي.

NGINX يونٽ استعمال ڪندي ورڈپریس کي ترتيب ڏيڻ لاء ترقي يافته فن تعمير بيان ڪيو ويو آهي پراڻو مضمون، هاڻي اسان انهن شين کي به وڌيڪ ترتيب ڏينداسين جيڪي اتي نه ڍڪيل هيون (جيئن ٻين ڪيترن ئي سبقن ۾):

  • ورڈپریس CLI
  • اچو ته Encrypt ۽ TLSSSL سرٽيفڪيٽ
  • سرٽيفڪيٽ جي خودڪار تجديد
  • NGINX ڪيشنگ
  • NGINX کمپريشن
  • HTTPS ۽ HTTP/2 سپورٽ
  • پروسيس آٽوميشن

آرٽيڪل هڪ سرور تي تنصيب کي بيان ڪندو، جيڪو هڪ ئي وقت ۾ هڪ مستحڪم پروسيسنگ سرور، هڪ پي ايڇ پي پروسيسنگ سرور، ۽ هڪ ڊيٽابيس جي ميزباني ڪندو. هڪ تنصيب جيڪا سپورٽ ڪري ٿي ڪيترن ئي مجازي ميزبان ۽ خدمتن کي مستقبل لاءِ هڪ امڪاني موضوع آهي. جيڪڏھن توھان چاھيو ٿا ته اسان ڪجھھ بابت لکون جيڪي ھن مضمونن ۾ نه آھن، تبصرن ۾ لکندا.

گه

  • ڪنٽينر سرور (LXC يا ايل ايڪس ڊي)، هڪ ورچوئل مشين، يا هڪ باقاعده هارڊويئر سرور، جنهن ۾ گهٽ ۾ گهٽ 512MB RAM ۽ Ubuntu 18.04 يا وڌيڪ تازو انسٽال ٿيل هجي.
  • انٽرنيٽ تائين رسائي بندرگاهن 80 ۽ 443
  • ڊومين جو نالو هن سرور جي عوامي IP پتي سان لاڳاپيل آهي
  • روٽ رسائي (sudo).

فن تعمير جو جائزو

فن تعمير ساڳيو آهي جيئن بيان ڪيو ويو آهي پهريان کان، هڪ ٽي-ٽيئر ويب ايپليڪيشن. اهو پي ايڇ پي اسڪرپٽس تي مشتمل آهي جيڪي پي ايڇ پي انجڻ تي هلن ٿيون ۽ جامد فائلون جيڪي ويب سرور پاران پروسيس ٿيل آهن.

NGINX يونٽ ۽ Ubuntu سان خودڪار ورڈپریس تنصيب

عام اصول

  • اسڪرپٽ ۾ ڪيتريون ئي ترتيب ڏيڻ واري حڪمن ۾ لپي ويندا آھن جيڪڏھن حالتون idempotency لاءِ: اسڪرپٽ ڪيترائي ڀيرا هلائي سگھجن ٿيون سيٽنگون تبديل ڪرڻ جي خطري کان سواءِ جيڪي اڳ ۾ ئي موجود آھن.
  • اسڪرپٽ ريپوزٽريز مان سافٽ ويئر انسٽال ڪرڻ جي ڪوشش ڪري ٿي، تنهنڪري توهان هڪ ڪمانڊ ۾ سسٽم اپڊيٽ لاڳو ڪري سگهو ٿا (apt upgrade Ubuntu لاءِ).
  • ڪمانڊ ڳولڻ جي ڪوشش ڪندا آهن ته اهي هڪ ڪنٽينر ۾ هلائي رهيا آهن انهي ڪري اهي انهن جي سيٽنگون مطابق تبديل ڪري سگهن ٿيون.
  • سيٽنگون ۾ شروع ٿيڻ واري سلسلي جي عملن جو تعداد مقرر ڪرڻ لاء، اسڪرپٽ ڪنٽينرز، ورچوئل مشينن، ۽ هارڊويئر سرورز ۾ ڪم ڪرڻ لاءِ خودڪار سيٽنگن جو اندازو لڳائڻ جي ڪوشش ڪري ٿو.
  • جڏهن سيٽنگون بيان ڪريون ٿا، اسان هميشه آٽوميشن جي باري ۾ سوچيو ٿا، جيڪو اسان کي اميد آهي ته ڪوڊ جي طور تي توهان جي پنهنجي انفراسٽرڪچر ٺاهڻ جو بنياد بڻجي ويندو.
  • سڀئي حڪم استعمال ڪندڙ طور هلائي رهيا آهن پاڙ، ڇاڪاڻ ته اهي بنيادي سسٽم سيٽنگون تبديل ڪندا آهن، پر سڌو سنئون ورڈپریس هڪ باقاعده صارف جي طور تي هلندو آهي.

ماحوليات جي متغيرن کي ترتيب ڏيڻ

اسڪرپٽ کي هلائڻ کان اڳ هيٺ ڏنل ماحوليات متغير مقرر ڪريو:

  • 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" ورڈپریس CLI ايپليڪيشن جو نسخو آهي.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" - چيڪسم ورڈپریس CLI 2.4.0 executable فائل (ورجن متغير ۾ بيان ڪيو ويو آهي WORDPRESS_CLI_VERSION). اسڪرپٽ آن لائن 162 هن قدر کي استعمال ڪندي چيڪ ڪرڻ لاءِ ته صحيح ورڈپریس 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}" - ورڈپریس سائيٽ لاءِ Let's Encrypt سرٽيفڪيٽ ڏانهن رستو، متغير مان حاصل ڪيل TLS_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

/etc/hosts ۾ ميزبان نالو شامل ڪرڻ

اضافو WP-Cron وقتي ڪمن کي هلائڻ لاءِ استعمال ڪيو ويو، ورڈپریس کي ضرورت آهي ته هو پاڻ کي HTTP ذريعي رسائي ڪري سگھن. پڪ ڪرڻ لاءِ 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 يونٽ ۽ NGINX مخزن کي شامل ڪرڻ

رسم الخط انسٽال ڪري ٿو NGINX يونٽ ۽ اوپن سورس NGINX کي سرڪاري NGINX مخزنن مان يقيني بڻائڻ لاءِ نسخن کي جديد سيڪيورٽي پيچس ۽ بگ فيڪس استعمال ڪيو ويو آهي.

اسڪرپٽ شامل ڪري ٿو NGINX يونٽ مخزن ۽ پوءِ 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 يونٽ، PHP ماريا ڊي بي، 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

NGINX يونٽ ۽ ورڈپریس سان استعمال ڪرڻ لاءِ پي ايڇ پي کي ترتيب ڏيڻ

اسڪرپٽ ڊاريڪٽري ۾ سيٽنگون فائل ٺاهي ٿي 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

ورڈپریس لاءِ ماريا ڊي بي ڊيٽابيس سيٽنگون بيان ڪرڻ

اسان ماريا ڊي بي کي 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;"

ورڈپریس CLI پروگرام کي انسٽال ڪرڻ

هن قدم تي، اسڪرپٽ پروگرام کي انسٽال ڪري ٿو WP-CLI. ان سان گڏ، توهان ورڈپریس سيٽنگون انسٽال ۽ منظم ڪري سگهو ٿا بغير دستي طور تي فائلن کي ايڊٽ ڪرڻ، ڊيٽابيس کي اپڊيٽ ڪرڻ، يا ڪنٽرول پينل ۾ داخل ٿيڻ جي. اهو پڻ استعمال ڪري سگهجي ٿو انسٽال ڪرڻ لاءِ موضوعات ۽ اضافو ۽ تازه ڪاري 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

ورڈپریس کي انسٽال ڪرڻ ۽ ترتيب ڏيڻ

اسڪرپٽ ڊاريڪٽري ۾ ورڈپریس جو جديد نسخو انسٽال ڪري ٿو /var/www/wordpress۽ پڻ سيٽنگون تبديل ڪري ٿو:

  • ڊيٽابيس ڪنيڪشن يونڪس ڊومين ساکٽ تي ڪم ڪري ٿو TCP جي بدران لوپ بيڪ تي TCP ٽرئفڪ کي گھٽائڻ لاءِ.
  • ورڈپریس ھڪڙو اڳوڻو شامل ڪري ٿو https:// URL ڏانهن جيڪڏهن ڪلائنٽ HTTPS تي NGINX سان ڳنڍي، ۽ پڻ موڪلي ٿو ريموٽ ميزبان جو نالو (جيئن NGINX پاران مهيا ڪيل آهي) PHP ڏانهن. اسان هن کي سيٽ ڪرڻ لاء ڪوڊ جو هڪ ٽڪرو استعمال ڪندا آهيون.
  • ورڈپریس لاگ ان لاءِ HTTPS جي ضرورت آهي
  • 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 يونٽ قائم ڪرڻ

اسڪرپٽ PHP کي هلائڻ ۽ ورڈپریس رستن کي پروسيس ڪرڻ لاءِ NGINX يونٽ کي ترتيب ڏئي ٿو، PHP عمل جي نالي جي جڳھ کي الڳ ڪرڻ ۽ ڪارڪردگي سيٽنگن کي بهتر ڪرڻ. هتي ڏسڻ لاء ٽي خاصيتون آهن:

  • نالو اسپيس لاءِ سپورٽ شرط جي بنياد تي طئي ڪئي وئي آهي، انهي جي جانچ ڪرڻ تي ته اسڪرپٽ ڪنٽينر ۾ هلي رهي آهي. اهو ضروري آهي ڇاڪاڻ ته اڪثر ڪنٽينر سيٽ اپ ڪنٽينرز جي nested لانچ جي حمايت نه ڪندا آھن.
  • جيڪڏهن نالن جي اسپيس لاءِ سپورٽ آهي، نان اسپيس کي بند ڪريو نيٽ ورڪ. اهو آهي ورڈپریس کي اجازت ڏيڻ جي اجازت ڏيڻ جي ٻنهي پوائنٽن سان ڳنڍڻ ۽ ساڳئي وقت ويب تي دستياب ٿي.
  • عملن جو وڌ ۾ وڌ تعداد ھيٺ ڏنل بيان ڪيو ويو آھي: (MariaDB ۽ NGINX Uniy هلائڻ لاءِ موجود ياداشت)/ (PHP + 5 ۾ رام جي حد)
    هي قدر مقرر ڪيو ويو آهي NGINX يونٽ سيٽنگون.

اهو قدر اهو پڻ ظاهر ڪري ٿو ته اتي هميشه گهٽ ۾ گهٽ ٻه 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 فهرست ۾ conf.d. اهو هتي ترتيب ڏنل آهي:

  • Let's Encrypt ذريعي Certbot مان حاصل ڪيل TLS سرٽيفڪيٽ کي فعال ڪرڻ (ان کي ترتيب ڏيڻ ايندڙ سيڪشن ۾ هوندو)
  • Let's Encrypt کان سفارشن جي بنياد تي TLS سيڪيورٽي سيٽنگون ترتيب ڏيڻ
  • ڊفالٽ طور 1 ڪلاڪ لاءِ ڪيشنگ اسڪپ درخواستن کي فعال ڪريو
  • رسائي لاگنگ کي بند ڪريو، ۽ گڏوگڏ غلطي لاگنگ جيڪڏھن فائل نه ملي، ٻن عام درخواست ٿيل فائلن لاء: favicon.ico ۽ robots.txt
  • لڪيل فائلن ۽ ڪجهه فائلن تائين رسائي کي روڪيو .phpغير قانوني رسائي يا اڻڄاتل شروعات کي روڪڻ لاء
  • جامد ۽ فونٽ فائلن لاءِ رسائي لاگنگ کي بند ڪريو
  • هيڊر سيٽنگ رسائي- ڪنٽرول- اجازت- اصليت فونٽ فائلن لاءِ
  • index.php ۽ ٻين اسٽيٽڪس لاءِ روٽنگ شامل ڪرڻ.

اسڪرپٽ ڪوڊ

cat > ${NGINX_CONF_DIR}/conf.d/default.conf << EOM
upstream unit_php_upstream {
    server 127.0.0.1:8080;
    keepalive 32;
}
server {
    listen 80;
    listen [::]:80;
    # ACME-challenge used by Certbot for Let's Encrypt
    location ^~ /.well-known/acme-challenge/ {
      root /var/www/certbot;
    }
    location / {
      return 301 https://${TLS_HOSTNAME}$request_uri;
    }
}
server {
    listen      443 ssl http2;
    listen [::]:443 ssl http2;
    server_name ${TLS_HOSTNAME};
    root        /var/www/wordpress/;
    # Let's Encrypt configuration
    ssl_certificate         ${CERT_DIR}/fullchain.pem;
    ssl_certificate_key     ${CERT_DIR}/privkey.pem;
    ssl_trusted_certificate ${CERT_DIR}/chain.pem;
    include ${NGINX_CONF_DIR}/options-ssl-nginx.conf;
    ssl_dhparam ${NGINX_CONF_DIR}/ssl-dhparams.pem;
    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    # Proxy caching
    proxy_cache wp_cache;
    proxy_cache_valid 200 302 1h;
    proxy_cache_valid 404 1m;
    proxy_cache_revalidate on;
    proxy_cache_background_update on;
    proxy_cache_lock on;
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Deny all attempts to access hidden files such as .htaccess, .htpasswd,
    # .DS_Store (Mac)
    # Keep logging the requests to parse later (or to pass to firewall utilities
    # such as fail2ban)
    location ~ /. {
        deny all;
    }
    # Deny access to any files with a .php extension in the uploads directory;
    # works in subdirectory installs and also in multi-site network.
    # Keep logging the requests to parse later (or to pass to firewall utilities
    # such as fail2ban).
    location ~* /(?:uploads|files)/.*.php$ {
        deny all;
    }
    # WordPress: deny access to wp-content, wp-includes PHP files
    location ~* ^/(?:wp-content|wp-includes)/.*.php$ {
        deny all;
    }
    # Deny public access to wp-config.php
    location ~* wp-config.php {
        deny all;
    }
    # Do not log access for static assets, media
    location ~* .(?:css(.map)?|js(.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
        access_log off;
    }
    location ~* .(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
        add_header Access-Control-Allow-Origin "*";
        access_log off;
    }
    location / {
        try_files $uri @index_php;
    }
    location @index_php {
        proxy_socket_keepalive on;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass       http://unit_php_upstream;
    }
    location ~* .php$ {
        proxy_socket_keepalive on;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        try_files        $uri =404;
        proxy_pass       http://unit_php_upstream;
    }
}
EOM

Let's Encrypt کان سرٽيفڪيٽن لاءِ Certbot سيٽ ڪرڻ ۽ انهن کي پاڻمرادو تجديد ڪرڻ

سرٽيفڪيٽ اليڪٽرانڪ فرنٽيئر فائونڊيشن (EFF) کان هڪ مفت اوزار آهي جيڪو توهان کي اجازت ڏئي ٿو حاصل ڪري ۽ خودڪار طريقي سان TLS سرٽيفڪيٽن جي تجديد Let's Encrypt کان. NGINX ۾ Let's Encrypt کان سرٽيفڪيٽن کي پروسيس ڪرڻ لاءِ Certbot کي ترتيب ڏيڻ لاءِ اسڪرپٽ ھيٺ ڏنل ڪم ڪري ٿو:

  • NGINX کي روڪي ٿو
  • ڊائون لوڊ سفارش ٿيل TLS سيٽنگون
  • سائيٽ لاءِ سرٽيفڪيٽ حاصل ڪرڻ لاءِ Certbot هلائي ٿو
  • سرٽيفڪيٽ استعمال ڪرڻ لاءِ NGINX کي ٻيهر شروع ڪري ٿو
  • Certbot کي ترتيب ڏئي ٿو روزانو 3:24 AM تي هلائڻ لاءِ چيڪ ڪرڻ لاءِ ته ڇا سرٽيفڪيٽن جي تجديد ٿيڻ جي ضرورت آهي، ۽ جيڪڏهن ضروري هجي ته، نوان سرٽيفڪيٽ ڊائون لوڊ ڪريو ۽ NGINX کي ٻيهر شروع ڪريو.

اسڪرپٽ ڪوڊ

echo " Stopping NGINX in order to set up Let's Encrypt"
service nginx stop

mkdir -p /var/www/certbot
chown www-data:www-data /var/www/certbot
chmod g+s /var/www/certbot

if [ ! -f ${NGINX_CONF_DIR}/options-ssl-nginx.conf ]; then
  echo " Downloading recommended TLS parameters"
  curl --retry 6 -Ls -z "Tue, 14 Apr 2020 16:36:07 GMT" 
    -o "${NGINX_CONF_DIR}/options-ssl-nginx.conf" 
    "https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf" 
    || echo "Couldn't download latest options-ssl-nginx.conf"
fi

if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
  echo " Downloading recommended TLS DH parameters"
  curl --retry 6 -Ls -z "Tue, 14 Apr 2020 16:49:18 GMT" 
    -o "${NGINX_CONF_DIR}/ssl-dhparams.pem" 
    "https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem" 
    || echo "Couldn't download latest ssl-dhparams.pem"
fi

# If tls_certs_init.sh hasn't been run before, remove the self-signed certs
if [ ! -d "/etc/letsencrypt/accounts" ]; then
  echo " Removing self-signed certificates"
  rm -rf "${CERT_DIR}"
fi

if [ "" = "${LETS_ENCRYPT_STAGING:-}" ] || [ "0" = "${LETS_ENCRYPT_STAGING}" ]; then
  CERTBOT_STAGING_FLAG=""
else
  CERTBOT_STAGING_FLAG="--staging"
fi

if [ ! -f "${CERT_DIR}/fullchain.pem" ]; then
  echo " Generating certificates with Let's Encrypt"
  certbot certonly --standalone 
         -m "${WORDPRESS_ADMIN_EMAIL}" 
         ${CERTBOT_STAGING_FLAG} 
         --agree-tos --force-renewal --non-interactive 
         -d "${TLS_HOSTNAME}"
fi

echo " Starting NGINX in order to use new configuration"
service nginx start

# Write crontab for periodic Let's Encrypt cert renewal
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
  echo " Adding certbot to crontab for automatic Let's Encrypt renewal"
  (crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -
fi

توهان جي سائيٽ جي اضافي حسب ضرورت

اسان مٿي ڳالهايو آهي ته ڪيئن اسان جي اسڪرپٽ NGINX ۽ NGINX يونٽ کي ترتيب ڏئي ٿي هڪ پيداوار لاءِ تيار ڪيل سائيٽ جي خدمت ڪرڻ لاءِ TLSSSL فعال. توھان پڻ ڪري سگھو ٿا، توھان جي ضرورتن تي منحصر ڪري، مستقبل ۾ شامل ڪريو:

  • حمايت برٽلي، HTTPS تي اڏامندڙ ڪمپريشن کي بهتر بڻايو ويو
  • موڊ سيڪيورٽي с ورڈپریس لاء ضابطاتوهان جي سائيٽ تي خودڪار حملن کي روڪڻ لاء
  • بيڪ اپ ورڈپریس لاءِ جيڪو توهان لاءِ مناسب آهي
  • تحفظ مدد سان ايپ آرمر (Ubuntu تي)
  • پوسٽ فڪس يا msmtp ته جيئن ورڈپریس ميل موڪلي سگهي
  • توھان جي سائيٽ کي چيڪ ڪري رھيا آھيو توھان سمجھو ته اھو ڪيترو ٽريفڪ سنڀالي سگھي ٿو

اڃا به بهتر سائيٽ جي ڪارڪردگي لاء، اسان کي اپڊيٽ ڪرڻ جي صلاح ڏين ٿا NGINX پلس، اسان جي تجارتي، انٽرپرائز-گريڊ پراڊڪٽ جي بنياد تي اوپن سورس NGINX. ان جا سبسڪرائبرز هڪ متحرڪ طور تي لوڊ ٿيل بروٽلي ماڊل حاصل ڪندا، انهي سان گڏ (اضافي فيس لاءِ) NGINX ModSecurity WAF. اسان پڻ پيش ڪريون ٿا NGINX ايپ تحفظ، NGINX پلس لاءِ WAF ماڊل F5 کان صنعت جي معروف حفاظتي ٽيڪنالاجي جي بنياد تي.

اين بي هڪ انتهائي لوڊ ٿيل سائيٽ جي حمايت لاء، توهان ماهرن سان رابطو ڪري سگهو ٿا سائبربر. اسان ڪنهن به لوڊ هيٺ توهان جي ويب سائيٽ يا خدمت جي تيز ۽ قابل اعتماد آپريشن کي يقيني بڻائينداسين.

جو ذريعو: www.habr.com