حزمة LEMP (Linux وNginx وMariaDB وPHP-FPM) بديل سريع وخفيف لـ Apache لتشغيل مواقع PHP. في AlmaLinux 9 يأتي كل شيء من مستودع AppStream الرسمي، لكن SELinux وfirewalld يحتاجان إلى بعض الانتباه. يرافقك هذا الدليل في تثبيت نظيف على VPS Linux Infrawire الخاص بك، وتنطبق الخطوات نفسها على Rocky Linux 9.
📋 المتطلبات المسبقة
- خادم VPS من نوع KVM بنظام AlmaLinux 9 (عنوان IP وكلمة مرور root متوفران في مساحة العميل)
- وصول SSH بحساب root
- نطاق
example.comيشير إلىVPS_IP
1. تحديث النظام وتثبيت الأدوات
Bashdnf -y update dnf -y install nano policycoreutils-python-utils
توفّر الحزمة policycoreutils-python-utils الأداة semanage المستخدمة في قسم SELinux.
2. تثبيت Nginx وفتح جدار الحماية
Bashdnf -y install nginx systemctl enable --now nginx firewall-cmd --permanent --add-service=http --add-service=https firewall-cmd --reload firewall-cmd --list-services
3. تثبيت MariaDB
Bashdnf -y install mariadb-server systemctl enable --now mariadb mysql_secure_installation
أجب عن أسئلة المعالج لتحديد كلمة مرور root، وحذف المستخدمين المجهولين، ومنع دخول root عن بُعد، وحذف قاعدة بيانات الاختبار. ثم أنشئ قاعدة بيانات ومستخدمًا مخصصين:
Bashmysql -u root -p
SQL1CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; 3GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost'; 4FLUSH PRIVILEGES; 5EXIT;
4. تثبيت PHP 8.3 من وحدة AppStream
يوفّر AppStream عدة مسارات (streams) لـ PHP. اختر المسار المطلوب قبل التثبيت:
Bashdnf module list php dnf -y module reset php dnf -y module enable php:8.3 dnf -y install php-fpm php-cli php-mysqlnd php-gd php-mbstring php-xml php-intl php-opcache php-pecl-zip php -v
افتراضيًا يعمل تجمّع PHP-FPM بالمستخدم apache. وبما أن Nginx يعمل بالمستخدم nginx، فوحّد المستخدم في التجمّع ومجلدات الجلسات:
Bashsed -i 's/^user = apache/user = nginx/; s/^group = apache/group = nginx/' /etc/php-fpm.d/www.conf chown -R root:nginx /var/lib/php/session /var/lib/php/wsdlcache /var/lib/php/opcache grep -E '^(user|group|listen)' /etc/php-fpm.d/www.conf systemctl enable --now php-fpm
يستمع التجمّع على مقبس Unix في المسار /run/php-fpm/www.sock.
5. إنشاء كتلة الخادم (server block)
Bashmkdir -p /var/www/example.com/public chown -R nginx:nginx /var/www/example.com nano /etc/nginx/conf.d/example.com.conf
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 root /var/www/example.com/public; 6 index index.php index.html; 7 8 location / { 9 try_files $uri $uri/ /index.php?$query_string; 10 } 11 12 location ~ \.php$ { 13 include fastcgi_params; 14 fastcgi_pass unix:/run/php-fpm/www.sock; 15 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 16 } 17 18 location ~ /\.(?!well-known) { 19 deny all; 20 } 21}
Bashnginx -t && systemctl reload nginx
6. إعداد SELinux
أبقِ SELinux في وضع enforcing (تحقق عبر getenforce). الملفات التي تُنشأ تحت /var/www تحصل أصلًا على الوسم httpd_sys_content_t، أما الملفات المنقولة بالأمر mv من مكان آخر فتحتفظ بوسمها القديم. أعد وسمها، ولا تمنح صلاحية الكتابة إلا للمجلدات التي تحتاجها:
Bashrestorecon -Rv /var/www/example.com mkdir -p /var/www/example.com/public/uploads semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/example.com/public/uploads(/.*)?' restorecon -Rv /var/www/example.com/public/uploads
فعّل القيم المنطقية (booleans) فقط إذا احتاجها تطبيقك:
Bash# يتصل PHP بقاعدة بيانات عبر TCP (خادم بعيد أو 127.0.0.1) setsebool -P httpd_can_network_connect_db 1 # يجري PHP أو Nginx اتصالات صادرة (واجهات API، وproxy_pass إلى تطبيق) setsebool -P httpd_can_network_connect 1
قاعدة MariaDB المحلية التي يُوصل إليها عبر المقبس لا تحتاج إلى أيٍّ منهما. لمعرفة ما يحجبه SELinux نفّذ ausearch -m avc -ts recent. لا "تُصلح" مشكلة أبدًا بالأمر setenforce 0.
7. اختبار PHP ثم حذف ملف الاختبار
Bashecho '<?php phpinfo();' > /var/www/example.com/public/info.php curl -sI http://example.com/info.php | head -n 1 rm /var/www/example.com/public/info.php
المتوقع هو HTTP/1.1 200 OK. تكشف صفحة phpinfo() إعداداتك، لذا احذفها فورًا. وأخيرًا تحقق من الخدمات:
Bashsystemctl is-active nginx php-fpm mariadb
🛠️ استكشاف الأخطاء وإصلاحها
502 Bad Gateway. خدمة PHP-FPM متوقفة أو مسار المقبس في fastcgi_pass خاطئ. نفّذ systemctl status php-fpm وتحقق من ls -l /run/php-fpm/www.sock واقرأ /var/log/nginx/error.log. إذا ذكر السجل Permission denied على المقبس فابحث عن رفض AVC بالأمر ausearch.
403 Forbidden أو Permission denied. تحقق من المالك (nginx:nginx) ومن وسم SELinux عبر ls -Z /var/www/example.com/public. يجب أن يكون httpd_sys_content_t، وإلا نفّذ restorecon -Rv.
"File not found." أو صفحة فارغة. مسار root أو سطر SCRIPT_FILENAME خاطئ. راجعهما ثم نفّذ nginx -t.
تعذّر الاتصال بقاعدة بيانات أو API خارجية. يحجب SELinux الاتصالات الصادرة افتراضيًا: فعّل httpd_can_network_connect_db أو httpd_can_network_connect كما هو موضح أعلاه.
🎉 يعمل Nginx وMariaDB وPHP-FPM على AlmaLinux 9 مع بقاء SELinux في وضع enforcing.