أساسيات لينكس

تشغيل أكثر من إصدار PHP جنبًا إلى جنب باستخدام PHP-FPM وNginx على ديبيان وأوبونتو

امنح كل موقع إصدار PHP خاصًا به عبر مجمّعات ومقابس PHP-FPM منفصلة، واضبط سطر الأوامر، وتجنب أخطاء الخوادم متعددة الإصدارات.

تاريخ النشر
مدة القراءة
7 دقائق
الكاتب
SKYLINE Engineering

تطبيق معتمد على PHP 8.3، وآخر جاهز للانتقال إلى 8.5، وأنت تريد نقلهما واحدًا تلو الآخر لا دفعة واحدة. هذا ما يتيحه PHP-FPM: فكل إصدار من PHP يعمل خدمةً مستقلة، ويمكن أن يكون لكل موقع مجمّع (pool) ومستخدم ومقبس خاص به، ثم يحدد Nginx أي إصدار يخدم أي موقع. يشرح هذا الدليل الإعداد على ديبيان وأوبونتو، ويوضح المقايضات بصراحة.

قبل البدء: من أين تأتي الإصدارات الإضافية؟

تأتي كل نسخة من ديبيان وأوبونتو بفرع واحد من PHP: ديبيان 13 ‏(trixie) مع PHP 8.4، وديبيان 12 ‏(bookworm) مع PHP 8.2، وأوبونتو 24.04 مع PHP 8.3، وأوبونتو 22.04 مع PHP 8.1. وهذه الحزم تتلقى إصلاحات الأمان من التوزيعة نفسها. أما أي إصدار آخر فيأتي من مستودع خارجي، وأشهرها لديبيان packages.sury.org، ومقابله في أوبونتو مستودع ondrej/php. ضع في حسابك ثلاث حقائق:

  • تحديثات الأمان لهذه الحزم تأتي من القائم على المستودع، لا من فريقي أمان ديبيان أو أوبونتو.
  • يبني المستودع أيضًا الإصدار الذي تشحنه توزيعتك بأرقام إصدار أعلى، فبعد إضافته تُرقّى حزم PHP الحالية منه كذلك. ويُظهر الأمر apt policy php8.4-fpm المصدر المستخدم.
  • ما زال المستودع يحمل فروعًا منتهية الدعم (من 5.6 إلى 8.1)، وتوفرها للتثبيت لا يعني أنها مدعومة. فالمشروع الرسمي يدعم حاليًا 8.2 (إصلاحات أمنية حتى 31 ديسمبر 2026)، و8.3 (حتى 31 ديسمبر 2027)، و8.4 (حتى 31 ديسمبر 2028)، و8.5 (حتى 31 ديسمبر 2029).

خذ نسخة احتياطية من الخادم قبل تغيير مصادر الحزم.

الخطوة 1: إضافة المستودع (ديبيان)

هذه هي الأوامر المنشورة في ملف README الخاص بالمستودع:

sudo apt-get update
sudo apt-get -y install lsb-release ca-certificates curl
sudo curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
sudo dpkg -i /tmp/debsuryorg-archive-keyring.deb
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt-get update

أما في أوبونتو 22.04 و24.04 فأضف المستودع بالأمر sudo add-apt-repository ppa:ondrej/php، لكن اقرأ صفحة وصفه أولًا: فهي تذكر في أكتوبر 2026 أن المستودع في طور الدمج مع packages.sury.org الذي صار المصدر المعتمد لأحدث إصدار من أوبونتو، وأن تعليمات الانتقال ستُنشر لاحقًا.

الخطوة 2: تثبيت الإصدار الثاني

ثبّت FPM وسطر الأوامر والإضافات التي يحتاجها تطبيقك. والإضافات خاصة بكل إصدار، فالحزمة php8.3-intl لا تفيد PHP 8.4 بشيء.

sudo apt install php8.3-fpm php8.3-cli php8.3-mysql php8.3-mbstring \
  php8.3-xml php8.3-curl php8.3-intl php8.3-zip php8.3-gd
systemctl status php8.3-fpm
ls -l /run/php/

يحصل كل إصدار على خدمة خاصة (php8.3-fpm وphp8.4-fpm)، وشجرة إعدادات خاصة تحت /etc/php/8.3/، ومجمّع افتراضي يستمع على /run/php/php8.3-fpm.sock.

الخطوة 3: مجمّع مستقل لكل موقع

يشغّل المجمّع الافتراضي www كل المواقع بالمستخدم www-data. أما المجمّع المخصص لكل موقع فيمنع شيفرة PHP في موقع من قراءة ملفات موقع آخر، ويتيح لك ضبط موارد كل موقع على حدة. أنشئ مستخدم نظام، ثم ملف مجمّع مثل /etc/php/8.3/fpm/pool.d/shop.conf:

sudo useradd --system --user-group --home-dir /var/www/shop --shell /usr/sbin/nologin shop
[shop]
user = shop
group = shop
listen = /run/php/php8.3-fpm-shop.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 10s

يسمح السطران listen.owner وlisten.group لـ Nginx الذي يعمل بالمستخدم www-data بالاتصال بالمقبس، بينما يعمل PHP نفسه بالمستخدم shop. ومع pm = ondemand لا تبدأ العمليات إلا عند وصول الطلبات وتتوقف بعد مهلة الخمول، وهذا مهم حين تتشارك عدة إصدارات من PHP خادمًا افتراضيًا صغيرًا. امنح المستخدم shop صلاحية الكتابة على المجلدات التي يحتاج التطبيق للكتابة فيها فقط، مثل مجلدات الرفع والتخزين المؤقت. ثم افحص الإعداد وأعد التشغيل:

sudo php-fpm8.3 -t
sudo systemctl restart php8.3-fpm
ls -l /run/php/php8.3-fpm-shop.sock

الخطوة 4: توجيه Nginx إلى المقبس الصحيح

تأتي حزمة Nginx في ديبيان بالملف snippets/fastcgi-php.conf الذي يقسّم المسار، ويعيد 404 لملفات PHP غير الموجودة، ويضم معاملات FastCGI القياسية. استخدمه واذكر المقبس الذي يحمل رقم الإصدار صراحة:

server {
    listen 80;
    server_name shop.example.com;
    root /var/www/shop/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm-shop.sock;
    }
}
sudo nginx -t && sudo systemctl reload nginx

ونقل الموقع لاحقًا إلى PHP 8.5 لا يتطلب أكثر من إنشاء المجمّع نفسه تحت /etc/php/8.5/fpm/pool.d/، وتغيير سطر fastcgi_pass واحد، ثم إعادة تحميل Nginx، والتراجع يتم بالعكس. وتجنّب المقبس العام /run/php/php-fpm.sock، فديبيان تديره عبر update-alternatives وتوجهه إلى إصدار FPM الأعلى أولوية من بين الإصدارات العاملة، فقد ينتقل الموقع الذي يستخدمه إلى إصدار آخر بصمت عند تثبيت إصدار جديد.

الخطوة 5: اجعل سطر الأوامر متوقعًا

الأمر php بدوره يُدار عبر البدائل (alternatives)، وأي إصدار أعلى يُثبَّت حديثًا يستولي عليه في الوضع التلقائي، فتعمل مهام cron وComposer وأدوات الأطر على إصدار مختلف عن إصدار الموقع. فإما أن تثبّت الإصدار الافتراضي:

update-alternatives --display php
sudo update-alternatives --set php /usr/bin/php8.3

أو، وهو الأفضل على الخوادم متعددة الإصدارات، أن تستدعي الملف التنفيذي ذا الرقم صراحة حيثما كان ذلك مهمًا:

/usr/bin/php8.3 /var/www/shop/artisan schedule:run
php8.3 "$(command -v composer)" install --no-dev

الخطوة 6: تحقق من طلب حقيقي

ضع في جذر الموقع ملفًا من سطر واحد باسم عشوائي يطبع PHP_VERSION وphp_sapi_name()، وافتحه مرة واحدة ثم احذفه. يجب أن ترى الإصدار المتوقع والقيمة fpm-fcgi. ولا تترك صفحات phpinfo() على الخادم، فهي تكشف تفاصيل الإعدادات والبيئة.

أخطاء شائعة

  • ترقيع إصدار واحد فقط. كل فرع مثبت يحتاج إلى التحديث. وعندما يصدر PHP إصدارًا أمنيًا، افحص كل حزم php8.x بالأمر apt policy.
  • ملفات php.ini منفصلة. الإعدادات موجودة في /etc/php/<version>/fpm/php.ini لكل إصدار، فالحد الذي ترفعه في 8.3 لا يرتفع في 8.5.
  • الذاكرة. لكل خدمة FPM عملية رئيسية وعمليات عاملة خاصة بها، فاحسب مجموع pm.max_children في كل المجمّعات مقابل الذاكرة المتاحة.
  • إصدارات متروكة. عندما يغادر آخر موقع إصدارًا ما، اعرض حزمه بالأمر dpkg -l 'php8.3*' وأزلها بالكامل، حتى لا يبقى إصدار غير مستخدم وغير مرقّع على الخادم.

ما الذي ينبغي فعله

  1. فضّل إصدار PHP الذي تأتي به توزيعتك متى لبّى متطلبات تطبيقاتك، ولا تضف مستودعًا خارجيًا إلا عند الحاجة إلى فرع آخر.
  2. استخدم الفروع التي ما زال المشروع الرسمي يدعمها فقط، ودوّن تواريخ انتهاء دعمها.
  3. أنشئ لكل موقع مجمّع FPM ومستخدمًا ومقبسًا يحمل رقم الإصدار، واستخدم هذا المقبس في Nginx.
  4. ثبّت إصدار سطر الأوامر بالأمر update-alternatives --set أو استدعِ php8.x صراحة في مهام cron وسكربتات النشر.
  5. أدرج كل إصدارات PHP المثبتة في فحص الترقيع الشهري.

على خادم سكايلاين كلاود الافتراضي في الرياض تملك صلاحية SSH كاملة بحساب root لتنفيذ كل ما سبق، وما يعمل داخل الخادم مسؤوليتك، ولا تتوفر لخوادم الرياض لقطات (snapshots) من المنصة، لذا خذ نسختك الاحتياطية بنفسك قبل تغيير المستودعات.

المصادر

SKYLINE Engineering

@skyline

The engineering team at SKYLINE Industrial Solutions. We publish field-tested guides drawn from real KSA and GCC deployments.

صفحة الكاتب
SKYLINE engineering services

Need this implemented for you?

Reading is free — building it right takes a team. SKYLINE engineers ship Linux Basics for Aramco vendors, banks, hospitals and government agencies across Saudi Arabia. Talk to us before you start.

Aramco Approved Contractor ISO 9001 · ISO 27001 SAMA CSF aligned NCA ECC ready 247+ KSA clients

Comments

0 total · 0 threads
Be the first to leave a comment.