Konzeptfrage zu PHP-FPM mit einer größeren Anzahl vHosts

derlym

Blog Benutzer
Hallo zusammen,

ich plane einen Apache-Webserver, welcher bislang mit PHP 5 als Modul läuft, auf PHP-FPM umzustellen. Das Ziel ist es PHP 5 (für legacy code) und 7 (für alles andere) parallel anbieten zu können, sowie eine flexible Konfiguration und ein hohes Sicherheitsniveau zu etablieren.

Allerdings stellen sich mir einige Fragen bezüglich der Performance. Auf dem Server befinden sich derzeit 15 Nutzer, die zusammen über ca. 100 vHosts verfügen. Einige wenige vHosts sind stark frequentiert, die meisten haben jedoch kaum Traffic zu verzeichnen oder liegen brach.

Mein ursprünglicher Plan war es, jedem Benutzer einen Pool zuzuweisen, auf den dann alle vHosts des jeweiligen Nutzers zugreifen. Allerdings ist PHP-FPM bezüglich der Konfigurationsmöglichkeiten zu eingeschränkt. Die php.ini kann (wie bei mod_php) scheinbar nur global für den gesamten Server konfiguriert werden. Per-vHost Einstellungen, wie bei mod_php mittels php_admin_value sind anscheinend ebenfalls nicht möglich.

Bleibt also nur noch die Option, für jeden vHost einen separaten Pool anzulegen und die notwendigen Einstellungen dort vorzunehmen. Allerdings kann diese Lösung doch unmgöglich performant sein, wenn für jeden vHost (auch brach liegende) zu jeder Zeit mindestens ein Prozess vorgehalten und ein File-Handle belegt wird.

Wie handhabt ihr das? Gibt es einen "Königsweg" für dieses Problem?
 

ThomasChr

Member
afaik kannst du php konfigurationswerte für jeden apache vhost direkt in der konfig für den vhost setzen wie du magst.
 

derlym

Blog Benutzer
Hast du eine Idee, wie das zu realisieren ist?

Die von mod_php bekannten Direktiven php_value/php_admin_value funktionieren nicht, da PHP dem Apache unbekannt ist. Mit dem dem Apache-Modul "mod_env" können zwar Parameter an PHP übergeben werden, allerdings besteht dort die Gefahr, dass ein User diese mit einer .htaccess-Datei überschreibt.

So sieht mein Test-Setup momentan aus:

Code:
<VirtualHost *:80>
        ServerName my.domain.tld
        DocumentRoot "/var/www/default"

        ErrorLog "/var/log/apache2/error.log"
        CustomLog "/var/log/apache2/access.log" common

        # Uebergabe von Parametern mittels mod_env
        SetEnv PHP_ADMIN_VALUE "post_max_size=16M"
        ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php7-pool1.sock|fcgi://localhost/"

        <Directory />
                Options +Indexes
        </Directory>
</VirtualHost>
 

Joe User

Zentrum der Macht
Wirf mal einen Blick in die php-fpm.conf beziehungsweise die $pool.conf

Mehrere Pools sind performancetechnisch kein Problem.

Du solltest aber Apache auf MPM-Event umstellen.
 

derlym

Blog Benutzer
Mehrere Pools sind performancetechnisch kein Problem.

100 Pools (einen für jeden vHost) verkraftet der Server sicher - allerdings scheint mir das nicht wirklich optimal zu sein. Ein PHP-Prozess reserviert sich grob geschätzt 10 MB. Bei 100 vHosts/Pools ist das über 1GB RAM, welches ständig reserviert ist + 100 Prozesse, von denen ein großer Teil die meiste Zeit idlet. Wenn ein Pool mehrere Prozesse vorhält, dann multiplizieren sich diese Zahlen entsprechend.
 

Joe User

Zentrum der Macht
Es spricht nichts dagegen, dass sich mehrere/alle VHosts einen Pool teilen, machen sie bei mod_php ja auch.

Andererseits sollten bei ~100 VHosts ohnehin einige RAM-Riegel in der Kiste stecken, da machen 2-8 GB mehr keinen allzu grossen unterschied mehr. Da sollte man sich um das memory_limit in der php.ini viel grössere Sorgen machen...
 
Top