Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
433e74975c | ||
|
|
cc72fda741 | ||
|
|
a865a13940 | ||
|
|
8dbfdf599a | ||
|
|
2e85f458d3 |
@@ -54,6 +54,12 @@ RUN bash -c 'set -e; \
|
|||||||
cp /etc/lsws-templates/lsphp-overrides.ini "$SCAN_DIR/99-prod-overrides.ini"; \
|
cp /etc/lsws-templates/lsphp-overrides.ini "$SCAN_DIR/99-prod-overrides.ini"; \
|
||||||
echo "wrote overrides to $SCAN_DIR"'
|
echo "wrote overrides to $SCAN_DIR"'
|
||||||
|
|
||||||
|
## php-lsapi gates .user.ini parsing behind this env var (see entrypoint-lsphp.sh
|
||||||
|
## for the full explanation). Set here so the value is visible in `docker inspect`
|
||||||
|
## and survives an entrypoint override; the entrypoint re-exports it with the same
|
||||||
|
## default so the runuser exec path can't drop it.
|
||||||
|
ENV LSPHP_ENABLE_USER_INI=on
|
||||||
|
|
||||||
EXPOSE 9000
|
EXPOSE 9000
|
||||||
|
|
||||||
## TCP-connect + lsphp-alive check (LSAPI isn't FastCGI, so no cgi-fcgi ping).
|
## TCP-connect + lsphp-alive check (LSAPI isn't FastCGI, so no cgi-fcgi ping).
|
||||||
|
|||||||
@@ -9,21 +9,34 @@
|
|||||||
serverName shared-ols
|
serverName shared-ols
|
||||||
|
|
||||||
## Real client IP behind HAProxy. HAProxy sets X-Forwarded-For (the real
|
## Real client IP behind HAProxy. HAProxy sets X-Forwarded-For (the real
|
||||||
## client) and X-Forwarded-Proto. Mode 2 = trust the proxy header. HAProxy is
|
## client) and X-Forwarded-Proto. Mode 1 = always use X-Forwarded-For as the
|
||||||
## the only thing that ever connects to this tier (it's not publicly exposed),
|
## client IP. HAProxy is the ONLY thing that ever connects to this tier (it's on
|
||||||
## so trusting the header from the docker-network peer is safe — same trust
|
## client-net with no host-published ports) and it OVERWRITES X-Forwarded-For
|
||||||
## model as the shared httpd's RemoteIPInternalProxy.
|
## with %[src] (set-header, not add-header), so a client can't spoof it — mode 1
|
||||||
useIpInProxyHeader 2
|
## is safe here and matches the working standalone litespeed config.
|
||||||
|
## NOTE: mode 2 ("trusted IP only") does NOT mean "trust the proxy header" — it
|
||||||
|
## extracts the real IP ONLY when the connecting peer is in a TRUSTED access
|
||||||
|
## list, which this tier never configured. With mode 2 + no trusted IP, OLS kept
|
||||||
|
## HAProxy's container IP as REMOTE_ADDR for every request, so WP security
|
||||||
|
## plugins saw all tenants as one IP and blocking it locked everyone out.
|
||||||
|
useIpInProxyHeader 1
|
||||||
|
|
||||||
## LSCache enabled at MODULE scope for the whole tier (dedicated cache volume,
|
## LSCache enabled at MODULE scope for the whole tier (dedicated cache volume,
|
||||||
## ephemeral across rebuilds; OLS auto-keys a per-vhost subdir under storagePath).
|
## ephemeral across rebuilds; OLS auto-keys a per-vhost subdir under storagePath).
|
||||||
## enableCache/enablePrivateCache ON here means the cache module is ACTIVE, but a
|
## PUBLIC (anonymous) caching ONLY: enableCache 1 + checkPublicCache 1 let OLS
|
||||||
## response is only cached if it's marked cacheable — the LiteSpeed Cache WP
|
## serve cacheable, non-logged-in responses marked by the LiteSpeed Cache WP
|
||||||
## plugin sets X-LiteSpeed-Cache-Control headers, and checkPublic/PrivateCache +
|
## plugin's X-LiteSpeed-Cache-Control headers (ignoreRespCacheCtrl=0 honors them).
|
||||||
## ignoreRespCacheCtrl=0 make OLS honor them. No plugin → nothing cached (safe).
|
##
|
||||||
|
## PRIVATE caching is intentionally OFF (enablePrivateCache 0 + checkPrivateCache 0).
|
||||||
|
## Logged-in / cookie-bearing pages must NEVER be cached at the tier. We previously
|
||||||
|
## left enablePrivateCache=1 assuming "no plugin -> nothing cached," but that was
|
||||||
|
## WRONG: with private storage + reqCookieCache on, OLS privately cached logged-in
|
||||||
|
## responses regardless of plugin, serving stale wp-admin (e.g. a "failed update"
|
||||||
|
## nag that persisted for the full privateExpireInSeconds TTL). Keeping private
|
||||||
|
## cache off guarantees logged-in pages are always served fresh.
|
||||||
module cache {
|
module cache {
|
||||||
storagePath ${LSCACHE_ROOT}
|
storagePath ${LSCACHE_ROOT}
|
||||||
checkPrivateCache 1
|
checkPrivateCache 0
|
||||||
checkPublicCache 1
|
checkPublicCache 1
|
||||||
maxCacheObjSize 10000000
|
maxCacheObjSize 10000000
|
||||||
maxStaleAge 200
|
maxStaleAge 200
|
||||||
@@ -33,6 +46,6 @@ module cache {
|
|||||||
ignoreReqCacheCtrl 0
|
ignoreReqCacheCtrl 0
|
||||||
ignoreRespCacheCtrl 0
|
ignoreRespCacheCtrl 0
|
||||||
enableCache 1
|
enableCache 1
|
||||||
enablePrivateCache 1
|
enablePrivateCache 0
|
||||||
}
|
}
|
||||||
## ---- end shared-ols server append ----
|
## ---- end shared-ols server append ----
|
||||||
|
|||||||
@@ -78,7 +78,26 @@ export LSAPI_EXTRA_CHILDREN="${LSAPI_EXTRA_CHILDREN:-5}"
|
|||||||
export LSAPI_AVOID_FORK="${LSAPI_AVOID_FORK:-0}"
|
export LSAPI_AVOID_FORK="${LSAPI_AVOID_FORK:-0}"
|
||||||
LSPHP_BIND="${LSPHP_BIND:-0.0.0.0:9000}"
|
LSPHP_BIND="${LSPHP_BIND:-0.0.0.0:9000}"
|
||||||
|
|
||||||
echo "Container memory: ${CONTAINER_MEMORY_MB}MB | PHP_LSAPI_CHILDREN=${PHP_LSAPI_CHILDREN} | LSAPI_MAX_IDLE=${LSAPI_MAX_IDLE} | PHPVER=${PHPVER} | bind=${LSPHP_BIND}"
|
## ---- .user.ini support ----
|
||||||
|
## php-lsapi compiles .user.ini support in but leaves it DISABLED by default:
|
||||||
|
## sapi/litespeed/lsapi_main.c has `static int parse_user_ini = 0;` and only
|
||||||
|
## sets it in PHP_MINIT_FUNCTION(litespeed) when the PROCESS ENV contains
|
||||||
|
## LSPHP_ENABLE_USER_INI=on. Without it, lsphp never enters the user-ini chain
|
||||||
|
## at all — and does so SILENTLY, because `user_ini.filename` / `user_ini.cache_ttl`
|
||||||
|
## still report their core defaults in phpinfo(). Every other WHP PHP tier
|
||||||
|
## (cac, cac-fpm, cac-litespeed) honors .user.ini, so leaving it off here made
|
||||||
|
## the shared-ols tier quietly inconsistent: customer memory_limit /
|
||||||
|
## max_input_vars overrides were ignored, and — the reason this was found —
|
||||||
|
## Wordfence's `auto_prepend_file` WAF never loaded on ANY shared-ols site.
|
||||||
|
##
|
||||||
|
## Exported here rather than relying solely on the Dockerfile ENV because the
|
||||||
|
## runuser fallback below resets the environment; an export survives all three
|
||||||
|
## exec paths. Still overridable per-container (set LSPHP_ENABLE_USER_INI=off in
|
||||||
|
## the site's env) as an escape hatch for a site whose legacy cPanel-generated
|
||||||
|
## .user.ini has not been remediated yet.
|
||||||
|
export LSPHP_ENABLE_USER_INI="${LSPHP_ENABLE_USER_INI:-on}"
|
||||||
|
|
||||||
|
echo "Container memory: ${CONTAINER_MEMORY_MB}MB | PHP_LSAPI_CHILDREN=${PHP_LSAPI_CHILDREN} | LSAPI_MAX_IDLE=${LSAPI_MAX_IDLE} | PHPVER=${PHPVER} | bind=${LSPHP_BIND} | user_ini=${LSPHP_ENABLE_USER_INI}"
|
||||||
|
|
||||||
## ---- per-site ini drop-ins (identical mechanism to entrypoint-litespeed.sh) ----
|
## ---- per-site ini drop-ins (identical mechanism to entrypoint-litespeed.sh) ----
|
||||||
## error_log → the same customer-visible path cac:phpNN / cac-litespeed use, so
|
## error_log → the same customer-visible path cac:phpNN / cac-litespeed use, so
|
||||||
|
|||||||
Reference in New Issue
Block a user