CoreCP

Het PHP-beleid van een server

Elke machine bepaalt zelf wat klanten aan hun PHP mogen veranderen. Die beslissing staat in één bestand, /etc/corecp/php-policy.yaml, en dit scherm ís dat bestand.

Geschreven voor: Beheerder

Elke machine bepaalt zelf wat klanten aan hun PHP mogen veranderen. Die beslissing staat in één bestand, /etc/corecp/php-policy.yaml, en dit scherm ís dat bestand.

Het is een toelatingslijst. Een directive die er niet in staat kan door niemand gezet worden, wat de PHP-build ook ondersteunt, en een extensie die er niet in staat kan niet aangezet worden. Verruimen is een beslissing van de beheerder en van niemand anders: een reseller versmalt wat zijn klanten krijgen via een pakket, en kan nooit verruimen wat jouw machine toestaat.

Openen

  1. Ga naar Servers en open de machine.
  2. Kies onder Snelle acties de optie PHP-beleid instellen.

Of ga er rechtstreeks naartoe:

https://paneel.voorbeeld.nl/nodes/stck1.voorbeeld.nl/php-policy

Waar een node mee begint

Een verse node heeft elf directives — die waar hostingklanten echt om vragen, op plafonds die een gedeelde machine aankan:

corectl php policy show
PHP POLICY (/etc/corecp/php-policy.yaml)

DIRECTIVE                        SCOPE    BOUND
display_errors                   request  On | Off
error_reporting                  request  E_ALL | E_ALL & ~E_DEPRECATED | …
max_execution_time               request  max 600
max_input_vars                   request  max 20000
memory_limit                     request  max 512M
opcache.max_accelerated_files    pool     max 100000
opcache.memory_consumption       pool     max 512
post_max_size                    request  max 512M
session.save_handler             pool     files | redis | memcached
session.save_path                pool     starts with tcp:// or redis:// or unix://
upload_max_filesize              request  max 512M

extensions: apcu, igbinary, imagick, memcached, opcache, redis

De drie soorten grens

Een directive heeft er precies één, en de machine leest er precies één — een plafond naast een keuzelijst zou nooit gebruikt worden, dus het formulier laat je kiezen.

SoortVoorVoorbeeld
Plafondeen hoeveelheidmemory_limit, maximaal 512M
Keuzelijsteen keuzedisplay_errors, On of Off
Begint metvrije tekst die binnen een vorm moet blijvensession.save_path, beginnend met tcp://

De derde bestaat om één reden. Het paar session.save_handler / session.save_path zit in de klantenset zodat redis-sessies mogelijk zijn, en een pad op jouw machine mag nooit iets zijn dat een klant kan intypen. De prefix-grens houdt het een sessieopslag-URL en verder niets.

Bereik is een feit, geen keuze

request betekent dat PHP de waarde per verzoek leest. pool betekent dat hij één keer gelezen wordt, als de interpreter start — alles van opcache, en de sessie-handler. Een pool-waarde is voor elke website van één account op één PHP-versie hetzelfde, en dat staat aan de klantkant onder het veld.

Dit verkeerd zetten is een stille fout: een opcache-instelling die per verzoek wordt toegepast, komt aan nadat het geheugen dat hij instelt al gereserveerd is.

Een directive toevoegen of wijzigen

Klik op Directive toevoegen, of klik op een rij om er een te wijzigen.

# een plafond
corectl php policy set memory_limit --scope request --max 512M

# een keuzelijst
corectl php policy set display_errors --scope request --values "On,Off"

# vrije tekst binnen een vorm
corectl php policy set session.save_path --scope pool \
  --prefixes "tcp://,redis://,unix://" \
  --note "the session store, never a directory"

Elke wijziging reconcilet de node meteen, zodat een versmalling nu effect heeft en niet pas bij de volgende wijziging die er toevallig langskomt.

Versmallen, en wat er gebeurt met websites die eroverheen zitten

Haal een directive weg, of verlaag een plafond onder een waarde die iemand al gezet had:

corectl php policy unset max_input_time
corectl php policy set memory_limit --scope request --max 256M

Bij de eerstvolgende reconcile wordt de waarde in geen enkele pool meer gerenderd. De website houdt hem wel in zijn eigen administratie — verruim je het beleid later weer, dan komt hij terug zonder dat iemand de site aanraakt — en op het PHP-scherm van die website staat Niet actief met de reden erbij, in plaats van een instelling die niets doet.

Extensies

De schakelaars zijn wat klanten mogen aanzetten. Toestaan is niet installeren: alleen wat de PHP-builds op deze machine meeleveren kan echt geladen worden, en een schakelaar voor een module die geen enkele build heeft is als zodanig gemarkeerd.

corectl php policy ext-allow redis
corectl php policy ext-deny imagick

Weghalen herstart de pools die hem hadden, zonder hem.

Wat geen beleid mag bevatten

Tien directives worden botweg geweigerd, op de node, vanaf dit scherm én vanaf de commandoregel:

open_basedir, disable_functions, disable_classes, sys_temp_dir,
upload_tmp_dir, error_log, extension_dir, include_path,
auto_prepend_file, auto_append_file

De eerste drie zijn de isolatie van een account, opgeschreven — PHP zelf laat open_basedir alleen aanscherpen, nooit verruimen — en de rest wijst naar een plek op jouw machine. Ze worden allemaal door de reconcile gerenderd uit de eigen home van het account, en geen ervan is van de klant om te verplaatsen.

corectl php policy set open_basedir --max 1G
# open_basedir is never a customer setting on a shared node: it is the
# isolation of an account …

Pakketten zijn de andere helft

Een pakket kan per directive strenger zijn dan de machine, via het instellingenregister (php.max.memory_limit en zijn broertjes). De effectieve grens voor een website is de strengste van de twee, en het paneel noemt altijd welke van de twee het was. Zie Pakketten en limieten voor de pakketkant.

Je werk controleren

# het bestand, zoals de node het leest
corectl php policy show --json | jq .directives.memory_limit

# wat één website daadwerkelijk krijgt
corectl php override list voorbeeld.nl

# en dat een tweede reconcile niets verandert
corectl reconcile && corectl reconcile