8.5.10
⚠️ Upgrade notes
This release is the delivery of a full audit pass: 22 pull requests, most of them defects found by
measuring the published 8.5.9 image. Several of them change observable behaviour. Read this list
before rolling it out.
Actions that may be required
docker run --read-onlywithout mounts now refuses to start. The image no longer declares
VOLUME, so the four runtime paths —/opt/etc,/opt/sbin,/app/tmp,/app/var— are yours
to provide. The entrypoint names each unusable path and prints the exact--tmpfsline to add; on
Kubernetes/OpenShift, mount anemptyDirat each. A container started without--read-onlykeeps
working unchanged.- Apache monitoring endpoints moved off the application port.
/server-status,/statusand
/real-time-statusare served on9090, as nginx already did — they answer404on9000. Any
scrape targeting:9000/server-statushas to move to:9090, and that port must not be published
by a Service or a Route. - The nginx monitoring port serves monitoring and nothing else. It used to fall back to the
application docroot with no PHP handler, so:9090/secret.phpreturned the file as source and
:9090/.envreturned its contents, neither behindMONITORING_ALLOW. Everything but the exact
endpoints is now404, and dotfiles are denied on the application port too — a deployment that
legitimately served a dotfile from the docroot needs to move it. - php-fpm now drains in-flight requests, and that takes time. Rollouts, scale-downs and
evictions used to cut running requests (HTTP 502); the master now waits up to 15s. Kubernetes and
OpenShift need nothing (terminationGracePeriodSecondsdefaults to 30), but a plain
docker stopwants-t 30and compose wantsstop_grace_period: 30s, otherwise a long request
is killed at 10s with exit137. LowerPHP_FPM_PROCESS_CONTROL_TIMEOUTto cap the wait. - Any exit of nginx, php-fpm or apache stops the container, including exit code 0. A
SIGTERM
sent to the php-fpm master from outside supervisor used to leave the container up with no php-fpm
behind the web server.supervisorctl stopand a normal shutdown are unaffected. - A variable set by a late init hook no longer reaches the application. Late hooks now run as
child processes, so a hook ending inexit 0no longer kills the container silently and a failing
one is reported with its name and status. To inject a variable, use an early hook — those are
still sourced. - The php-fpm slowlog is
php-fpm-slow.log, no longerphp-fpm.log.slow: the old name fell
outside the*.logrotation glob and was never rotated. Update any collector that names it.
Changes you get for free, but should know about
- nginx worker count now follows the container's CPU quota instead of the host's core count: a
500mlimit gives 1 worker, not 8.NGINX_WORKER_PROCESSESoverrides it. - The FastCGI buffer knobs are wired.
NGINX_FASTCGI_BUFFER_SIZEand friends were declared,
documented, and read by no template — a response header above 4 KB answered502, and raising the
documented variable changed nothing. They now take effect. - PHP requests are logged. nginx had
access_log offin the PHP location and the apache vhost
logged to/dev/null; both are fixed, so expect roughly one additional access-log line per PHP
request. - nginx front-controller routing works:
/index.php/fr/blogreaches the application with
PATH_INFOset, gzip is actually applied, andclient_max_body_sizeno longer contradicts PHP's
upload_max_filesize. - The runtime directories accept an arbitrary
uid:gid.-u 1000:1000— a bare uid with a
matching gid, asid -u/id -gproduce — failed to start; the runtime paths are now sticky
world-writable, and nothing outside them is.
What's Changed
- ci: build pull requests targeting a version branch by @zebby76 in #44
- test: run the image suites in CI and pin them to the build under test by @zebby76 in #47
- fix(nginx): serve only the monitoring endpoints on the monitoring port by @zebby76 in #48
- fix(apache): harden the default configuration by @zebby76 in #49
- test: adopt upstream bats-assert and cover the apache hardening by @zebby76 in #51
- fix(fpm): let php-fpm drain in-flight requests on shutdown by @zebby76 in #55
- fix(nginx): wire the fastcgi buffer settings by @zebby76 in #57
- fix(logrotate): keep directive arguments intact and validate the config at boot by @zebby76 in #58
- fix(supervisor): treat any exit of a critical program as fatal by @zebby76 in #59
- fix(logging): log PHP requests and the default apache vhost by @zebby76 in #60
- chore(supervisor): quieten the startup and tick logging by @zebby76 in #62
- chore(nginx): correct the default tuning by @zebby76 in #63
- fix(app-init): serialise the run-once hooks and document them by @zebby76 in #64
- docs: correct the drifted documentation, and narrow the rendered credentials by @zebby76 in #65
- chore(logrotate): make the default value show the separator it documents by @zebby76 in #67
- fix(php): render the PHP configuration idempotently on a reused /opt/etc by @zebby76 in #69
- fix(aws): complete the file-based configuration and make the CLI wrapper dependable by @zebby76 in #71
- fix(image): drop the VOLUME declarations and fail loudly on an unusable runtime path by @zebby76 in #73
- fix(app-init): run the late hooks as child processes by @zebby76 in #75
- fix(apache): move the monitoring endpoints off the application port by @zebby76 in #77
- fix(logrotate): rotate the php-fpm slowlog and let stanzas be added by @zebby76 in #79
- fix(image): let the runtime directories accept an arbitrary uid:gid by @zebby76 in #81
Full Changelog: 8.5.9...8.5.10