جدول المحتويات

يقوم معظم الأشخاص بتثبيت WordPress سهل الطريق. سنقوم بتثبيته يمين الطريقة آمنة وقابلة للتكرار، وبالرغم من قيمتها، فهي لا تزال سهلة.

لا يُخترق ووردبريس لأنه سيء، بل لأن الناس يتجاهلونه.

يُشغّل ووردبريس أكثر من ثلث شبكة الإنترنت، ورغم شهرته بسرعة تثبيته التي لا تتجاوز خمس دقائق، إلا أن معظم المستخدمين يُعدّونه بطريقة تُتيح للمهاجمين اختراقه ومشاكل مستقبلية. لا يعني تثبيته بالطريقة الصحيحة تعقيد الأمور، بل إرساء أساس متين للأداء والأمان والاستقرار. غالبًا ما يُخفي التكوين المُتسرّع أو المُنسوخ ثغرات خطيرة تستغلها الروبوتات والبرمجيات الخبيثة. عندما تُخصّص بضع دقائق إضافية لتكوين قاعدة البيانات بشكل صحيح، وتأمين PHP، واستخدام إعداد Nginx مُحصّن، فإنك تحمي نفسك من المشاكل التي قد تُعطّل مواقع بأكملها. تخيل الأمر كما لو أنك تبني منزلًا: يُمكن لأي شخص بناء أربعة جدران، ولكن البناء المُتأنّي فقط هو الذي سينجو من العاصفة. يُوضّح هذا الدليل العملية الكاملة خطوة بخطوة لتستفيد من مزايا ووردبريس دون الوقوع في الأخطاء الشائعة.
حسنًا، دعنا نتخطى الدردشة

ماذا سنستخدم؟

  • نظام:يوصى باستخدام Ubuntu 22.04 أو 24.04
  • قاعدة البيانات:MariaDB للأداء والاستقرار
  • خادم الويب:NGINX للأداء والاستقرار
  • التخزين المؤقت:Redis- مخزن بيانات عالي الأداء في الذاكرة
  • SSL:سيرتبوت
  • إضافات: إعادة تحميل Nginx التلقائية، ضغط Brotli، التسجيل الآمن، إخفاء البريد الإلكتروني

أصبح أوبونتو نظام تشغيل الخوادم المفضل لدي منذ أن ألغت ريد هات نظام CentOS. سهولة الاستخدام، ووفرة التوثيق، ودعم المجتمع القوي، وتوافر حزم البرامج الحديثة على نطاق واسع، تجعله خيارًا مثاليًا للمبتدئين والمحترفين على حد سواء. فهو يحقق التوازن الأمثل بين الاستقرار والميزات الحديثة، وهو ما تحتاجه تمامًا عند تشغيل نظام واسع النطاق مثل ووردبريس.

حضّر خادمك

سحق
sudo apt install python-software-properties
sudo add-apt-repository ppa:ondrej/nginx
sudo apt update && sudo apt upgrade -y
sudo apt install -y nginx nginx-extras mariadb-server unzip curl redis-server imagemagick
sudo apt install -y php8.3-fpm php8.3-mysql \
 php8.3-curl php8.3-xml php8.3-zip php8.3-gd php8.3-mbstring php8.3-bcmath \
 php8.3-intl php8.3-soap php8.3-imagick
سحق
# Allow NGINX in the Firewall (For this instance UFW)
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

كما هو الحال دائمًا، أوصي بتعطيل تسجيل الدخول الجذري عبر ssh عبر ssh_config وتعطيل مصادقة كلمة المرور واللجوء إلى مفاتيح SSH لأسباب تتعلق بالسلامة

إعداد قاعدة البيانات

تشغيل المصلب المدمج

سحق
sudo mysql_secure_installation
Switch to unix_socket authentication [Y/n] N
Change the root password? [Y/n] As you wish
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

إنشاء قاعدة بيانات مخصصة + مستخدم

إس كيو إل
# Change the DB/User Names, Password as you wish
CREATE DATABASE wp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'VERY_STRONGPASS!';
GRANT ALL PRIVILEGES ON wp.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;

ضبط قاعدة البيانات الموصى به، تحرير /etc/mysql/mariadb.conf.d/50-server.cnf

ايني
[mysqld]
bind-address            = 127.0.0.1
# Adjust as you like.
# ~50-70% of RAM on DB-only servers
innodb_buffer_pool_size = 1G 
innodb_log_file_size    = 256M
innodb_flush_method     = O_DIRECT
max_connections         = 200
query_cache_size        = 0
query_cache_type        = 0
سحق
sudo systemctl restart mariadb

تحسين PHP لـ WordPress

يفتح /etc/php/8.3/fpm/php.ini أو 8.4 وإلغاء التعليق/إضافة ما يلي

ايني
memory_limit = 256M
; These values are kinda low. So adjust as you like
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 120

; Security: prevent path-info exploits
cgi.fix_pathinfo = 0
expose_php = Off

; Enable OPcache
zend_extension=opcache
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
سحق
# Reload PHP-fpm
sudo systemctl reload php8.3-fpm # or 8.4

تنزيل ووردبريس عبر WP-CLI

تثبيت WP-CLI

سحق
sudo -u ubuntu -i # Login as a user other than the root
sudo apt install -y php-cli php-mbstring unzip less file
curl -sS -o /usr/local/bin/wp https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x /usr/local/bin/wp

إنشاء جذر الويب

سحق
mkdir -p /var/www/blog
cd /var/www/blog

تنزيل وتكوين

سحق
wp core download --locale=en_US
# The DB/User/Password you created earlier
wp config create --dbname=wp --dbuser=wpuser --dbpass=VERY_STRONGPASS! --dbhost=localhost --dbprefix=wp_
# Do not use default username: admin, Choose something more secure
wp core install --url="https://example.com" --title="My Site" --admin_user="myusername" --admin_password="ANOTHERSTRONGPASS" --admin_email="me@example.com"
sudo chown -R www-data:www-data /var/www/blog
find /var/www/blog -type d -exec chmod 755 {} \;
find /var/www/blog -type f -exec chmod 644 {} \;
# WP-CONFIG should always have 600 or 440 (-rw-------) permission
chmod 600 /var/www/blog/wp-config.php
# https://developer.wordpress.org/advanced-administration/security/hardening/#file-permissions

تأمين وتحسين ووردبريس

سحق
# Set unique salts & keys
wp config shuffle-salts

يحررwp-config.php وأضف ما يلي

بي اتش بي
# Disable file editing inside WP-Admin
define('DISALLOW_FILE_EDIT', true);
# Limit Revisions to 5
define('WP_POST_REVISIONS', 5);
# Disable WP cron (use system cron)
define('DISABLE_WP_CRON', true);
# Save/Exit the file
سحق
sudo -u ubuntu crontab -e
# Append the following at the end of the file
* * * * * /usr/local/bin/wp --path=/var/www/blog cron event run --due-now --quiet

إعداد خادم الويب NGINX

أولاً، دعنا نقوم بإعداد Certbot لإصدار شهادة SSL | مفتاح API لـ Cloudflareإذا كنت لا تستخدم Cloudflare، فابحث عن مزود الخدمة الخاص بك هنا أو استخدم طريقة HTTP.
ضع في اعتبارك الذي - التي "ملف blog.confيمكن إعادة تسمية "" بأي اسم تريده. في حال لم يكن ذلك واضحًا.

سحق
sudo apt install -y certbot python3-certbot-dns-cloudflare
sudo mkdir -p /etc/letsencrypt
echo "dns_cloudflare_api_token = YOUR_API_TOKEN_HERE" > /etc/.cloudflare.ini
sudo chmod 600 /root/.cloudflare.ini
سحق
# Issue a Certificate
sudo certbot certonly -d example.com -d "*.example.com" \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/.cloudflare.ini \
  --key-type rsa \
  --rsa-key-size 2048 \
  --agree-tos \
  --force-renewal\
  --no-eff-email\
  --email YOUR@EMAIL.COM
# The cert output should be in /etc/letsencrypt/live/example.com/

الآن، لنبدأ بإعداد NGINX. ملفات التكوين: في حسابي على جيثب. لا تنسى لتغيير "example.com" داخل الملفات إلى المجال الخاص بك ومسار شهادة SSL.

سحق
nano /etc/nginx/nginx.conf
# Apend/Modify the following inside http{} block
http2 on;
ssl_protocols TLSv1.2 TLSv1.3; # Drop v1, v1.1 - Keep only 1.2 & 1.3
سحق
cd /etc/nginx/sites-available/
wget -O /etc/nginx/sites-available/blog.conf https://raw.githubusercontent.com/abdessalllam/cloud-setup/refs/heads/main/wordpress/blog.conf
# Disable directory browsing
echo "autoindex off;" > /etc/nginx/snippets/no-autoindex.conf
# Enable the Website and Reload NGINX
sudo ln -s /etc/nginx/sites-available/blog.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

تمكين دعم Cloudflare

إذا كنت ستستخدم Cloudflare مع الوكيل العكسي، فنحن بحاجة إلى إضافة نطاقات CF للتأكد من حصول خادمنا على عنوان IP الحقيقي للزائر. أحدث إصدارات Cloudflare IPv4 - IPv6 النطاقات
The same can apply to other Load balancers, All you have to do is modify the file below to include their IP Ranges “only”.

سحق
wget -O /etc/nginx/conf.d/realip.conf https://raw.githubusercontent.com/abdessalllam/cloud-setup/refs/heads/main/wordpress/realip.conf
sudo nginx -t && sudo systemctl reload nginx

سيتم تضمين جميع ملفات .conf الموجودة ضمن conf.d تلقائيًا بشكل افتراضي
بعد ذلك، قم بإنشاء ip.php في المجلد /var/www/blog واختبر ما إذا كان Nginx يحصل على عنوان IP الحقيقي.

بي اتش بي
<?php
header('Content-Type: text/plain');
foreach (['REMOTE_ADDR','HTTP_CF_CONNECTING_IP','HTTP_X_FORWARDED_FOR'] as $h) {
    echo "$h: " . ($_SERVER[$h] ?? '') . "\n";
}

الآن، قم بتثبيت البرنامج الإضافي الخاص بـ Cloudflare وقم بتطبيق الإعدادات الموصى بها.

إعداد تخزين Redis المؤقت

Redis هي إحدى أفضل الطرق لتسريع WordPress (التخزين المؤقت للكائنات، والتخزين المؤقت للصفحات في بعض الأحيان)

سحق
sudo systemctl enable redis-server
sudo systemctl start redis-server

تأمين Redis عن طريق التحرير /etc/redis/redis.conf

التكوين
# Append/Uncomment/Modify the following
supervised systemd
maxmemory 256mb                # adjust for your RAM
maxmemory-policy allkeys-lru   # evict least-used keys

تثبيت المكونات الإضافية الأساسية

سحق
wp plugin install redis-cache --activate
wp redis enable
wp plugin install nginx-helper --activate

تثبيت وإعداد Brotli

يُسهّل Brotli تحميل موقعك الإلكتروني بإرسال بايتات أقل عبر الإنترنت - مثل ضغط الملفات قبل إرسالها عبر البريد الإلكتروني، ولكنه تلقائي وغير مرئي للمستخدم. إنه أفضل من Gzip.

سحق
# Only with ppa:ondrej/nginx Repo
sudo apt install libnginx-mod-http-brotli-filter libnginx-mod-http-brotli-static
سحق
nano /etc/nginx/nginx.conf
التكوين
# Append the following to inside http{} block, above "gzip on"
brotli on;
brotli_comp_level 5;
brotli_static on;  # serve precompressed .br if present (harmless if not)
brotli_types
  text/plain text/css text/javascript application/javascript
  application/json application/xml application/rss+xml
  application/vnd.ms-fontobject application/font-sfnt
  application/x-font-ttf font/ttf font/otf image/svg+xml;
  
# Append/Uncomment the following
gzip on;
gzip_comp_level 6;
gzip_types text/plain text/css application/javascript application/json application/xml image/svg+xml;

أعد تحميل NGINX واختبر ما إذا كان Brotli يعمل

سحق
sudo nginx -t && sudo systemctl reload nginx
# Brotli client
curl -sI -H 'Accept-Encoding: br' https://yourdomain | grep -i content-encoding
# Response → Content-Encoding: br

# Gzip client
curl -sI -H 'Accept-Encoding: gzip' https://yourdomain | grep -i content-encoding
# Response → Content-Encoding: gzip (or nothing if already tiny)

إعادة التحميل التلقائي لـ NGINX

إذا بدأت باستخدام إضافات مثل Smush وYoast SEO Redirects، إلخ... أي إضافة تتطلب تضمين ملفات في "blog.conf" أو "nginx.conf". في كل مرة تُغيّر فيها الإضافة هذا الملف، نحتاج إلى إعادة تحميل NGINX. لذا، لنُنشئ خدمة تُنفّذ ذلك تلقائيًا.

سحق
# Create a /etc/systemd/system/nginx-auto-reload.service
[Unit]
Description=Validate and reload Nginx when watched files change

[Service]
Type=oneshot
# Validate config & Stop if there are errors
ExecStart=/usr/sbin/nginx -t
# Reload ONLY if ExecStart succeeded
ExecStartPost=/bin/systemctl reload nginx
سحق
# Create /etc/systemd/system/nginx-auto-reload.path
[Unit]
Description=Watch specific Nginx-related files

[Path]
# Add one line per file you want to monitor for changes
# Add/Remove Lines as needed
PathChanged=/var/www/blog/foo.conf
PathChanged=/var/www/blog/bar.conf
PathChanged=/var/www/blog/baz.conf

[Install]
WantedBy=multi-user.target

تمكين وبدء

سحق
sudo systemctl daemon-reload
sudo systemctl enable --now nginx-auto-reload.path
# (optional first run)
sudo systemctl start nginx-auto-reload.service

امتحان:قم بتعديل أحد الملفات التي تتم مراقبتها، ثم

سحق
journalctl -u nginx-auto-reload.service -n 20 --no-pager
# You should see nginx: configuration file /etc/nginx/nginx.conf test is successful followed by a reload. If the config is broken, nginx -t will fail and no reload happens.

آمن التسجيل

السجلات هي مُسجِّل بياناتك السرية: فهي تُخبرك بما حدث، ومتى، ولماذا. وهي ضرورية لتصحيح الأخطاء واكتشاف مشاكل الأداء أو الأمان. ولكن بدون تدوير، ستنمو السجلات بلا نهاية وقد تملأ قرصك. نفِّذ العملية بشكل صحيح، وفعِّل ما تحتاجه فقط، وخزِّنه بأمان، وقم بتدويره/ضغطه وفقًا لجدول زمني.

سحق
mkdir -p /var/log/blog
sudo chown www-data:www-data /var/log/blog
sudo chmod 750 /var/log/blog
sudo tee /etc/logrotate.d/wordpress >/dev/null <<'EOF'
/var/log/blog/debug.log {
weekly
rotate 12
compress
missingok
notifempty
create 640 www-data www-data
}
EOF
بي اتش بي
# Enable file logging only in wp-config.php
if ( ! defined( 'WP_DEBUG' ) ) {
        define( 'WP_DEBUG', true );
}
// Set display to false, We don't want errors displayed on our frontend
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );
// Log to a file (outside web root is best)
define('WP_DEBUG_LOG', '/var/log/blog/debug.log');
// Set error logging to a seperate file (optional)
@ini_set('log_errors', 1);
@ini_set('error_log', '/var/log/blog/error.log');

إضافات

إذا كنت لا تستخدم "Email Obfuscation" الخاص بـ Cloudflare، فإنني أوصي بهذا المكون الإضافي لحماية عنوان بريدك الإلكتروني من برامج التجسس والبرمجيات الخبيثة. يضمن هذا ظهور بريدك الإلكتروني فقط عند تفعيل JavaScript، مما يبقيه مخفيًا عن مصدر الصفحة ويصعّب على برامج التجسس الوصول إليه.

سحق
# Let's create a Must-Use folder
mkdir -p /var/www/blog/wp-content/mu-plugins 
chown ubuntu:www-data //var/www/blog/wp-content/mu-plugins
wget -O /var/www/blog/wp-content/mu-plugins/protect-my-email.php https://raw.githubusercontent.com/abdessalllam/cloud-setup/refs/heads/main/wordpress/protect-my-email.php

الاستخدام:

محرر
Full Shortcode: [js_email label="Reach out to me via Email:" user="info" domain="example.com" display="inline" subject="Hello" msg="Please enable JS for the Email" class="optional-extra-class"]
Minimal Use: [js_email user="info" domain="example.com"]
Output: info@example.com

ماذا بعد؟

توجد سجلات Nginx في /var/log/nginx/

هذا كل شيء، لقد انتهيت. تهانينا 🎉🎉 أنصحك بتثبيت إضافة ذاكرة التخزين المؤقت وإضافة الأمان لتسريع عملية الإعداد وتأمينها بشكل أكبر.

هذا ليس الأسرع طريقة تثبيت ووردبريس — ولكنها الطريق الصحيح.
هل لديكم اقتراحات أو لاحظتم شيئًا يمكننا تحسينه؟ شاركونا أفكاركم في التعليقات، يسعدنا سماع آرائكم.

 

 

مصنفة في:

أدلة,