PHP-FPM - Pools - OPcache

  • Ein freundliches Moin Moin in die Runde,


    ich hätte da mal ein Anliegen bei welchem ich nicht weiter komme.


    Ich habe bei Netcup einen KVM root-server mit nginx, mariadb und php7.0/7.1. Soweit laufen meine Seiten auch Super - Performance etc...alles schick.

    Nun ist mir aber aufgefallen, dass der OPcache ja als "shared memory" fungiert - sprich alle PHP Pools im Masterprozess nutzen den. Dies hat natürlich zum Nachteil, dass die Seiten untereinander sehen können was im Cache liegt.

    Und so begann die Suche im Internet. Als "beste" Lösung erscheint mir die Variante, für jeden Pool einen eigenen Masterprozess zu haben. Somit hätte jede Seite ihren eigenen OPcache.


    Unter /etc/init.d/ habe ich das neue Script durch copy/paste der originaldatei übernommen und die jeweiligen Parameter (prozessname, etc) verändert. Mit der /etc/php/7.0/fpm/php-fpm.conf habe ich das gleiche gemacht. Kopiert zu php-fpm-seite.conf, die erforderlichen Parameter geändert (PID) und...... NIX.


    Ich bekomme es einfach nicht zum "Laufen". Den neuen Prozess (php7.0-fpm-seite) bekomme ich zwar gestartet, dann hört es aber auch schon auf. Unter "status" sehe ich das er läuft aber bei htop wird er z.B. auch nicht angezeigt.


    Ich hoffe hier gibt ein paar findige, die es besser können als ich :)


    Vielleicht gibt es ja auch noch eine ganz andere/einfachere Möglichkeit. Ich möchte einfach nur, das jede Webseite (pool) seinen eigenen Bytecode-Cache (opcache) hat.

  • Oha, scheint wohl nicht so einfach zu sein. Ich habe mich auch schon etwas von dem Gedanken entfernt, dass es funktionieren wird. Jetzt bin ich gerade bei APCu bei - aber dort scheint es nicht besser zu sein. Scheinen alles shared caches zu sein...

  • Nein, ich habe alle wichtigen Parameter abgeändert.

    Das "schlimme" ist ja, dass ich keine andere Alternative gefunden habe in meiner Shared Hosting Umgebung einen guten Cache (OPcache, apcu, memcached) einzusetzen. Für OPcache gibt es halt keine andere Alternative - zumindest was den Opcode Cache betrifft.


    Da dieser aber nur als Shared Memory fungiert und auf den Masterprozess "hört", brauche ich halt für jeden PHP pool einen eigenen Masterprozess.


    Der Server ist auch so schnell genug. Aber gerade zu high traffic Zeiten ist OPcache überaus Sinnvoll.

  • PS:

    Ich hatte auch versucht, mittels opcache.restrict_api den Zugriff auf den jeweiligen Seitenpfad (/var/www/seite1/) zu beschränken, jedoch auch ohne Erfolg.


    Code
    opcache.validate_permission und opcache.validate_root sind beide auf 1.
  • Ich glaube du hast das mit OpCache nicht ganz kapiert.

    Opcache ist kein Cache in dem Produktive Daten liegen.

    Es ist ein Cache für OpCode. Also in Opcode compilierte PHP Scripts.

    Daher ist ein teilen weniger problematisch.

  • Ich glaube du hast das mit OpCache nicht ganz kapiert.

    Um darauf kurz einzugehen - kapiert habe ich den OPcache schon! Trotz alledem wird der Cache durch den Masterprozess gesteuert und ist somit den ganzen Pools gegenüber "offen" (shared). Ich hatte einfach nur nach einer Lösung gesucht, dieses zu verhindern. Wollte aber zeitgleich in meiner shared Hosting Umgebung bleiben und in keine Virtualisierung gehen. Mit ging es einfach um die Verzeichnisstruktur, die eine Website von einer anderen erfahren kann. Dem einen ist das egal - mir nicht.

    Ich hätte auf Lösungen wie - disable_functions = opcache_get_status - greifen können. Für mich aber nichts ganzes und nichts halbes.


    Aber ich habe nun eine Lösung für mich und meine paar Leute gefunden:

    OPcache gestrichen und vergessen. Umstieg auf FastCGI-Cache - Ergebnis: ca 40% weniger Serverauslastung - ein echtes Zaubermittel für PHP.

    Das beste daran, man kann den Cache für jeden vHost gezielt anlegen.


    PS: Das er anders Arbeitet als OPcache ist mir bewusst ;)