Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP 7 - fpm - pools - OPcache - nginx - Shared Memory

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP 7 - fpm - pools - OPcache - nginx - Shared Memory

    Ein freundliches Moin Moin in die Runde,

    ich bin Tobias, 28 Jahre alt und habe einen root-Server auf KVM Basis worauf ich einige Webseiten laufen habe. Soweit läuft auch alles Wunderbar.

    Grobe Systemvorstellung:
    PHP 7.0 und 7.1 installiert - nginx 1.13 - MariaDB
    Jede Website läuft über einen eigenen PHP pool unter separatem User.

    Ordnerstruktur:
    /var/www/eigeneseiten/seite1 /seite2 /seite3 etc.
    /var/www/fremdeseiten/seite1 /seite2 /seite3 etc.

    Nun zu meinem Problem:
    OPcache ist ja ein shared Speicher, der unter dem Masterprozess von PHP läuft - d.h. die jeweiligen PHP Pools können die Daten der anderen Seiten sehen. Für meine eigenen Seiten habe ich OPcache aktiviert, weil es dort nicht so schlimm ist - ich verwalte diese ja.

    Das Problem ist aber auf den "Fremden Webseiten". Dort ist OPcache aktuell mittels "php_admin_flag[opcache.enable] = 0" in den jeweiligen Pools deaktiviert, wegen der shared Memory Problematik. Nun hatte ich versucht, für jede Website einen eigenen Masterprozess zu starten - jedoch ohne Erfolg. Auch die Anpassung von "opcache.ristrict_api" für jeden Pool brachte nichts. Ich dachte wenigstens, dass der Speicher zwar immer noch shared ist aber so zumindest der "Lesezugriff" der anderen Seiten verschwunden ist - auch ohne Erfolg.


    Gibt es ggf. noch eine andere Lösung die verhindert, dass man Pool-übergreifend die Daten aus dem OPcache lesen kann. Ich würde dieses Feature nämlich gerne aus Performancegründen aktivieren.



  • #2
    Du must Die Prozesse der "Fremden Webseiten" unter jeweils eigenen Usern ausführen wenn Du das einschränken/trennen willst.

    Möglicherweise Hilft Dir auch dieser Beitrag: https://ma.ttias.be/mitigating-phps-...ensitive-data/
    PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

    Kommentar


    • #3
      Danke für die Info. Aber jede Website und somit auch jeder Pool läuft unter einem anderen User.

      immer verschieden:
      user = user1
      group = user1

      in jedem Pool gleich:
      listen.owner = www-data
      listen.group = www-data

      Kommentar


      • #4
        Genau deswegen der Link!
        PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

        Kommentar


        • #5
          Ja das habe ich ja verstanden. Ich bin auch der Meinung, dass ich alles davon umgesetzt habe.

          opcache.validate_permission und opcache.validate_root sind in der php.ini auf 1 gesetzt.

          in der jeweiligen PHP Pool ist auch opcache.restrict_api auf das Dateiverzeichnis der Website gesetzt.

          Die PHP Versionen sind auch aktueller.

          Irgendwas übersehe ich... komme aber nicht drauf...

          Kommentar


          • #6
            Der Bug wurde doch schon gefixed (https://bugs.php.net/bug.php?id=69090).
            Was genau ist nun das Problem?

            Grüße.

            Kommentar


            • #7
              Genau das ist es ja. Das "Problem" ist, dass ich trotzdem die Cachedateien der anderen Seiten sehen kann.

              Kommentar


              • #8
                Was genau meinst mit mit "Cachedateien der anderen Seiten sehen kann" ?

                Grüße.

                Kommentar


                • #9
                  Wenn ich mir die Cachedaten anzeigen lasse, also die im OPcache liegen schaut es aktuell so aus:

                  /var/www/seite1/datei1.php
                  /var/www/seite1/datei2.php etc.
                  /var/www/seite2/datei1.php
                  /var/www/seite2/datei2.php etc.
                  /var/www/seite3/datei1.php
                  /var/www/seite3/datei2.php etc.


                  Ich möchte es aber gerne so:

                  OPcache anzeige über Seite 1:
                  /var/www/seite1/datei1.php
                  /var/www/seite1/datei2.php
                  /var/www/seite1/datei3.php

                  OPcache anzeige über Seite 2:
                  /var/www/seite2/datei1.php
                  /var/www/seite2/datei2.php
                  /var/www/seite2/datei3.php

                  Sprich, jede Webseite soll nur den eigenen Cache lesen können und nicht Seitenübergreifend. Ich hoffe es kommt rüber was ich meine xD

                  Jede Seite (/var/www/seite1/ etc.) läuft über einen eigenen User mit eigenem php pool. opcache.validate_permission und opcache.validate_root sind in der php.ini ebenfalls auf 1 gesetzt.
                  opcache.restrict_api ist ebenfalls für jede Seite (/var/www/seite1/ etc.) eingestellt.

                  PHP Versionen habe ich einmal PHP7.0 von Stretch und PHP7.1 von Buster.

                  Kommentar


                  • #10
                    Aber nur weil man sehen kann, was alles im OPCache ist, heißt das ja nicht, dass man da auch dran kommt.

                    Kannst du denn eine Datei aus seite1 in seite2 includen?

                    Grüße.

                    Kommentar


                    • #11
                      Mit open_basedir habe ich jede Website gut "eingepackt" - aber dennoch ist es natürlich nicht schön, wenn man die Daten sehen kann. Ein "Bösewicht" kann so viele Eindrücke bekommen - gerade was die installierten Themes und Plugins betrifft.

                      Kommentar


                      • #12
                        Du könntest die entsprechenden opcache-Funktionen in der php.ini über disable_functions deaktivieren.
                        Aber ich hab keine Ahnung, ob's Anwendungen gibt, die diese Funktionen brauchen oder ob man sonst noch anders an diese Daten kommt.

                        Komplett getrennt bekommst du es so aber nie. Da musst du wohl was anderes machen (mit Docker zb)

                        Grüße.

                        Kommentar


                        • #13
                          Kleines "Endergebnis":

                          OPcache gestrichen und vergessen und auf den FastCGI-Cache umgestiegen. Den kann man pro vHost anlegen. Vorherige Serverauslastung ca. 45% im Schnitt - jetzt nur noch 7%. Eine enorme Entlastung für PHP.


                          Ein echtes Zaubermittel xD

                          Kommentar


                          • #14
                            Das ist aber nicht das selbe wie der OPCache sondern funktioniert mehr oder wenige wie ein Reverse-Proxy.

                            Grüße.

                            Kommentar


                            • #15
                              Ich weiß. Aber ich kann ihn pro Seite gezielt anlegen und die PHP Entlastung machts ja deutlich. Darum ist mir schlussendlich egal wie das Kind heißt xD. Und bei Seiten die so gut wie nie geändert werden kann man die Verfalldauer ja hochsetzen auf z.B. 4 Wochen. Reicht mit vollkommen für meine Zwecke.

                              Kommentar

                              Lädt...
                              X