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
- Ga naar Servers en open de machine.
- Kies onder Snelle acties de optie PHP-beleid instellen.
Of ga er rechtstreeks naartoe:
https://paneel.voorbeeld.nl/nodes/stck1.voorbeeld.nl/php-policyWaar 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 showPHP 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, gmp, igbinary, imagick, imap, ldap, memcached, mongodb,
msgpack, opcache, redis, tidy, yamlDe 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.
| Soort | Voor | Voorbeeld |
|---|---|---|
| Plafond | een hoeveelheid | memory_limit, maximaal 512M |
| Keuzelijst | een keuze | display_errors, On of Off |
| Begint met | vrije tekst die binnen een vorm moet blijven | session.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 256MBij 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. Onder elke schakelaar staat één regel waarvoor de module dient, zodat je geen woord aanzet.
Een machine biedt alleen aan wat hij heeft. De lijst van een verse node komt uit de modules die zijn eigen PHP-pakketten dragen, en een module toestaan die geen enkele build hier meelevert wordt geweigerd in plaats van geaccepteerd en stilletjes nutteloos:
corectl php policy ext-allow redis
corectl php policy ext-deny imagick
corectl php policy ext-allow sodium
# no PHP build on this node ships sodium.so, so allowing it would offer a
# switch that cannot work. The builds here have: …Een module kan wél op de ene PHP-serie zitten en niet op de andere — sommige lieten oude PHP jaren geleden vallen. Dat is geen fout: het PHP-scherm van een website biedt elke site aan wat zijn serie heeft, en noemt de rest apart.
xdebug zit in elke build en in geen enkel standaardbeleid: hij maakt elk verzoek een paar keer trager, dus je staat hem toe voor het account dat erom vroeg en haalt hem daarna weer weg.
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_fileDe 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