Τρέχουσα κατάσταση: PHP2Shell. Δύο κρίσιμες ευπάθειες της PHP (CVSS 9.2) επιτρέπουν κακόβουλο κώδικα χωρίς σύνδεση. Patches από τις 21/10/2026.Τι πρέπει να γίνει τώρα →

Το PHP-FPM εξηγημένο: διαχειριστής διεργασιών, pools και workers

Το PHP-FPM εκτελεί την PHP ως ξεχωριστή υπηρεσία με pools και workers. Έτσι λειτουργεί το μοντέλο διεργασιών, ποιες οδηγίες μετρούν και γιατί οι workers πρέπει να επανεκκινούνται μετά τις ενημερώσεις.

Ημερομηνία 5 λεπτά ανάγνωσηςΓνώση PHP

Εν συντομία: Το PHP-FPM (FastCGI Process Manager) εκτελεί την PHP ως ξεχωριστή υπηρεσία δίπλα στον διακομιστή ιστού. Μια διεργασία master διαχειρίζεται pools και κάθε pool ξεκινά workers, που επεξεργάζονται αιτήματα μέσω FastCGI. Τα pools μπορούν να λειτουργούν ανά ιστότοπο με δικό τους χρήστη, δικά τους όρια και κλειδωμένες ρυθμίσεις PHP. Επειδή οι workers επεξεργάζονται πολλά αιτήματα διαδοχικά, μετά από μια ενημέρωση της PHP πρέπει να επανεκκινηθούν όλοι.

Τι είναι το PHP-FPM;

Το εγχειρίδιο της PHP περιγράφει το FPM ως την κύρια υλοποίηση FastCGI της PHP, με λειτουργίες χρήσιμες κυρίως για ιστότοπους με μεγάλο φορτίο. Το FPM ενσωματώθηκε με την PHP 5.3.3 ως ξεχωριστό SAPI, δηλαδή ως ξεχωριστός τρόπος λειτουργίας. Το όνομα SAPI του είναι fpm-fcgi.

Η διαφορά από το mod_php: η PHP δεν εκτελείται μέσα στον διακομιστή ιστού, αλλά ως ξεχωριστή υπηρεσία. Ο Nginx, ο Apache ή άλλος διακομιστής ιστού προωθεί τα αιτήματα PHP μέσω του πρωτοκόλλου FastCGI και λαμβάνει πίσω την έτοιμη απάντηση. Ο διακομιστής ιστού και η PHP μπορούν έτσι να επανεκκινούνται, να διαμορφώνονται και να θωρακίζονται ανεξάρτητα. Πώς λειτουργεί το FastCGI κατ' αρχήν, περιγράφεται στη σελίδα CGI και FastCGI.

Master, pools και workers: το μοντέλο διεργασιών

Το PHP-FPM αποτελείται από τρία επίπεδα:

  1. Διεργασία master: διαβάζει τη διαμόρφωση, ανοίγει τα sockets και ξεκινά ή τερματίζει workers. Η ίδια δεν εκτελεί κώδικα εφαρμογής.
  2. Pools: Κάθε pool έχει όνομα, δικό του socket ή θύρα, δικό του χρήστη Unix και δικές του ρυθμίσεις PHP. Το εγχειρίδιο αναφέρει ρητά διαφορετικά uid, gid, chroot, περιβάλλον και php.ini ανά pool.
  3. Workers: διεργασίες ενός pool που δέχονται και εκτελούν αιτήματα. Ένας worker επεξεργάζεται διαδοχικά πολλά αιτήματα προτού αντικατασταθεί.

Πόσοι workers εκτελούνται καθορίζει ο διαχειριστής διεργασιών με την οδηγία pm:

Λειτουργία Συμπεριφορά Σημαντικές οδηγίες
static σταθερός αριθμός workers pm.max_children
dynamic workers ανάμεσα σε κάτω και άνω όριο pm.start_servers, pm.min_spare_servers, pm.max_spare_servers
ondemand workers μόνο όταν χρειάζονται, αποδόμηση μετά από αδράνεια pm.process_idle_timeout (προεπιλογή 10s)

Το pm.max_children περιορίζει σε όλες τις λειτουργίες τον αριθμό των ταυτόχρονων αιτημάτων. Το pm.max_requests αντικαθιστά έναν worker μετά από σταθερό αριθμό αιτημάτων· η προεπιλογή 0 σημαίνει απεριόριστα.

Ποια λειτουργία ταιριάζει, εξαρτάται από το φορτίο. Η static κρατά πάντα τον ίδιο αριθμό workers έτοιμο και ταιριάζει σε εφαρμογές με ομοιόμορφα υψηλή χρήση και αρκετή μνήμη RAM. Η dynamic είναι συμβιβασμός για τους περισσότερους ιστότοπους. Η ondemand εξοικονομεί μνήμη σε διακομιστές με πολλούς μικρούς ιστότοπους, επειδή τα pools χωρίς επισκέπτες δεν δεσμεύουν workers· σε αντάλλαγμα το πρώτο αίτημα μετά από μια παύση διαρκεί λίγο περισσότερο. Ένα υπερβολικά υψηλό pm.max_children μπορεί να οδηγήσει τον διακομιστή σε έλλειψη μνήμης σε κορυφώσεις φορτίου, ένα υπερβολικά χαμηλό οδηγεί σε χρόνους αναμονής και μηνύματα σφάλματος του διακομιστή ιστού.

Ένα pool με ασφαλείς βασικές ρυθμίσεις

Ένα παράδειγμα ξεχωριστού pool ανά ιστότοπο, με οδηγίες από το εγχειρίδιο της PHP. Οι διαδρομές και οι τιμές είναι παραδείγματα:

; /etc/php/8.3/fpm/pool.d/kunde-a.conf
[kunde-a]
user = kunde-a
group = kunde-a

listen = /run/php/kunde-a.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 10s

request_terminate_timeout = 60s
security.limit_extensions = .php
clear_env = yes

php_admin_value[open_basedir] = /var/www/kunde-a:/tmp
php_admin_flag[session.upload_progress.enabled] = off
php_admin_value[error_log] = /var/log/php/kunde-a.error.log

Σύμφωνα με το εγχειρίδιο, οι τιμές μέσω php_value και php_flag μπορούν να αλλάξουν κατά την εκτέλεση με ini_set(), οι τιμές μέσω php_admin_value και php_admin_flag όχι. Το security.limit_extensions έχει από προεπιλογή την τιμή .php .phar και ορίζει ποιες καταλήξεις αρχείων εκτελεί το FPM ως κύριο σενάριο. Το clear_env = yes είναι η προεπιλογή και αδειάζει το περιβάλλον των workers.

Για την παρακολούθηση υπάρχει μια σελίδα κατάστασης μέσω του pm.status_path και μια σελίδα ping μέσω του ping.path. Και οι δύο πρέπει να είναι προσβάσιμες μόνο εσωτερικά. Τα αργά αιτήματα καταγράφει το FPM με backtrace, όταν έχουν οριστεί τα request_slowlog_timeout και slowlog.

Σημαντικό

Το εγχειρίδιο της PHP προειδοποιεί: όποιος μπορεί να ανοίξει μια σύνδεση FastCGI προς το PHP-FPM, ελέγχει τη διαμόρφωση του αιτήματος και μπορεί έτσι να εκτελέσει αυθαίρετο κώδικα. Το PHP-FPM δεν επιτρέπεται ποτέ να είναι προσβάσιμο από μη αξιόπιστο δίκτυο. Χρησιμοποιήστε ένα Unix socket ή το listen.allowed_clients.

Ποιον ρόλο παίζει το PHP-FPM στο PHP2Shell;

Το PHP-FPM ανήκει στους επηρεαζόμενους τρόπους λειτουργίας. Ιδιαίτερα καθαρά φαίνεται το μοντέλο διεργασιών στο CVE-2026-109619: η εσωτερική κατάσταση που ανήκει σε ένα αίτημα μπορεί να παραμείνει μετά την απελευθέρωση της μνήμης και ένα μεταγενέστερο αίτημα στον ίδιο worker μπορεί να τη χρησιμοποιήσει προτού επαναφερθεί. Αυτό είναι δυνατό μόνο επειδή οι workers επεξεργάζονται πολλά αιτήματα διαδοχικά.

Από αυτό προκύπτουν τρεις υποχρεώσεις:

  1. Εφαρμογή της ενημέρωσης: PHP 8.5.12, 8.4.27, 8.3.36 ή 8.2.35, αντίστοιχα ένα επιβεβαιωμένο backport της διανομής.
  2. Επανεκκίνηση όλων των workers: Τα νέα αρχεία στον δίσκο δεν αλλάζουν τίποτα, όσο εκτελούνται παλιοί workers. Αυτό ισχύει για κάθε εγκατεστημένη έκδοση FPM και κάθε pool. Οι εντολές βρίσκονται στη σελίδα Επανεκκίνηση του PHP-FPM και όλων των workers.
  3. Κλειδωμένες προσωρινές τιμές: Τα μέτρα του php.net, για παράδειγμα το session.upload_progress.enabled=0, ανήκουν μέσω php_admin_value ή php_admin_flag στο pool, όχι στο .user.ini.

Ο διαχωρισμός σε pools δεν αντικαθιστά την ενημέρωση, περιορίζει όμως τη ζημιά: αν κάθε ιστότοπος εκτελείται με δικό του χρήστη, ένας επιτιθέμενος δεν φτάνει μετά από μια εισβολή αυτόματα στα αρχεία των υπολοίπων. Πώς φαίνεται αυτό στην πράξη, περιγράφει το άρθρο Απομόνωση των pools PHP-FPM ανά ιστότοπο· η ενσωμάτωση στον Nginx βρίσκεται στη σελίδα Θωράκιση του Nginx με PHP-FPM.

Πώς βοηθά συγκεκριμένα η PHP SOS;

  • Καταγραφή των pools: Απαριθμούμε όλες τις εκδόσεις FPM, τα pools, τους χρήστες και τα sockets του διακομιστή σας.
  • Patch και επανεκκίνηση: Ενημερώνουμε την PHP και αποδεικνύουμε μέσω των χρόνων εκκίνησης ότι δεν εκτελείται πλέον κανένας παλιός worker.
  • Διαχωρισμός pools: Στο πλαίσιο της θωράκισης διακομιστή στήνουμε ανά ιστότοπο ένα pool με δικό του χρήστη και κλειδωμένες ρυθμίσεις.
  • Έλεγχος προσβασιμότητας: Ελέγχουμε ότι τα sockets FastCGI και οι σελίδες κατάστασης δεν είναι προσβάσιμα από έξω.

Συχνές ερωτήσεις

Τι σημαίνει το FPM;

Το FPM σημαίνει FastCGI Process Manager. Το εγχειρίδιο της PHP το περιγράφει ως την κύρια υλοποίηση FastCGI της PHP, με λειτουργίες που είναι χρήσιμες κυρίως για ιστότοπους με μεγάλο φορτίο. Ενσωματώθηκε με την PHP 5.3.3.

Ποια η διαφορά ανάμεσα σε pool και worker;

Ένα pool είναι μια ομάδα διεργασιών worker με κοινή διαμόρφωση: χρήστη, socket, όρια και ρυθμίσεις PHP. Ένας worker είναι μία μεμονωμένη διεργασία που επεξεργάζεται διαδοχικά αιτήματα. Ένας διακομιστής μπορεί να έχει πολλά pools, για παράδειγμα ένα ανά ιστότοπο.

Πρέπει το PHP-FPM να είναι προσβάσιμο μέσω TCP ή μέσω Unix socket;

Αν ο διακομιστής ιστού εκτελείται στον ίδιο host, το εγχειρίδιο της PHP συνιστά Unix socket. Στο TCP πρέπει να οριστεί το listen.allowed_clients, διότι διαφορετικά μπορεί να συνδεθεί οποιαδήποτε διεύθυνση. Μια ανοιχτά προσβάσιμη θύρα FastCGI επιτρέπει σύμφωνα με το εγχειρίδιο την εκτέλεση αυθαίρετου κώδικα.

Προστατεύει το pm.max_requests από ευπάθειες όπως το PHP2Shell;

Όχι. Το pm.max_requests αντικαθιστά έναν worker μετά από σταθερό αριθμό αιτημάτων και βοηθά κυρίως κατά των διαρροών μνήμης σε επεκτάσεις. Απέναντι σε μια ευπάθεια στον διερμηνέα βοηθά μόνο η ενημέρωση με επακόλουθη επανεκκίνηση όλων των workers.

Πηγές

Άμεση επικοινωνία

Κάθε ώρα μετράει. Γράψτε μας τώρα.

Περιγράψτε σύντομα το σύστημα, την έκδοση PHP και ό,τι παρατηρείτε. Θα επικοινωνήσουμε μαζί σας, θα διευκρινίσουμε την κατάσταση και θα εργαστούμε εξ αποστάσεως μέχρι το περιστατικό να κλείσει και να τεκμηριωθεί.

Άμεση βοήθεια