Skip to content

docs: add Apache HTTP Server reverse proxy guide - #161

Merged
majinghe merged 2 commits into
rustfs:mainfrom
majinghe:docs/reverse-proxy-httpd
Sep 23, 2026
Merged

majinghe merged 2 commits into
rustfs:mainfrom
majinghe:docs/reverse-proxy-httpd

Conversation

@majinghe

Copy link
Copy Markdown
Collaborator

Summary

Implements rustfs/rustfs#8070 (Add official Apache HTTP Server reverse proxy documentation).

  • Adds content/*/developer/integration/reverse-proxy/httpd.md: a complete Apache HTTP Server (httpd) reverse-proxy guide for the RustFS S3 API (:9000) and Console (:9001) behind separate hostnames with TLS termination at Apache.
  • Issue coverage: preserving the original Host and SigV4 inputs (ProxyPreserveHost On, nocanon, AllowEncodedSlashes NoDecode, X-Forwarded-Proto), presigned URLs, multipart uploads, large/streaming request bodies without unnecessary buffering, timeout guidance (Timeout, ProxyTimeout, RequestReadTimeout, LimitRequestBody), Console WebSocket upgrades (upgrade=websocket), Apache path-rewriting/subpath caveats, a Settings that do not suit RustFS section, and a multi-node balancer variant.
  • Navigation (meta.json, index.md) updated in all five locales.
  • Locales: en source and full zh translation; de/fr/ja follow the reverse-proxy section's existing pattern (English copies, same as the Nginx/Traefik/Caddy/HAProxy guides).

Verification (live on a test server)

The guide's exact artifacts (Dockerfile, config/rustfs.conf, compose.yaml, as published) were deployed against rustfs/rustfs:latest and httpd 2.4.68. Only the host HTTP port was mapped to 8088 because the test host's port 80 is occupied by another service; the published guide keeps 80:80.

  • docker compose config, httpd -t, and the guide's curl --fail checks pass for both endpoints; the Console UI loads at /rustfs/console/
  • HTTP to HTTPS redirect answers 301 Moved Permanently with Location: https://s3.example.com/
  • aws CLI v2 round trip with byte-identical cmp; 50 MB multipart upload (ETag ...-7, confirmed with aws CLI and boto3)
  • Presigned PUT and GET of a 50 MB object, byte-identical
  • httpd -t + httpd -k graceful certificate reload keeps the service healthy
  • Signature failure modes reproduced and documented: ProxyPreserveHost Off and a missing nocanon each yield SignatureDoesNotMatch; the AllowEncodedSlashes default returns 404 for %2F keys; ProxyErrorOverride On replaces RustFS S3 XML errors with Apache HTML pages
  • Body handling measured at the upstream: the default mode streams Content-Length and chunked bodies with zero disk I/O; proxy-sendcl spools bodies to disk (a 23 MB temp file observed for a 24 MB body)

Settings marked as unsuitable for RustFS (issue request)

The guide marks, with verified symptoms: ProxyPreserveHost Off (default), ProxyPass without nocanon, AllowEncodedSlashes Off (default), path prefixes such as ProxyPass /s3/, ProxyErrorOverride On, SetEnv proxy-sendcl 1 / SetEnv force-proxy-request-1.0 1, SetEnv proxy-sendchunked 1, and the deprecated mod_proxy_wstunnel. RustFS-side limits are marked as well, because no proxy setting can remove them: request bodies arriving as Transfer-Encoding: chunked are rejected with 400 UnexpectedContent; a presigned upload that adds an unsigned Content-Type fails with 403 SignatureDoesNotMatch; object keys with empty (//) or dot (.) segments are rejected with InvalidArgument; and the v2.x Console lives under /rustfs/console/.

Drive-by fixes (same section, same bug class)

Applied to the sibling reverse-proxy guides in all five locales, with the failure reproduced on the test server first:

  • RUSTFS_OBS_LOG_DIRECTORY: /var/log/rustfs/ -> /logs: the rootless RustFS image cannot create /var/log/rustfs/ and exits at startup with Permission denied.
  • Sign-in URL https://console.example.com -> https://console.example.com/rustfs/console/ (the v2.x Console path).

Flagged, not fixed (separate follow-up recommended): the same log-directory value appears in container contexts outside this section: installation/container/docker.md (3x), installation/container/podman.md, operations/upgrade/container/index.md (2x), and developer/integration/big-data/iceberg.md / milvus.md (compose style), in every locale. The systemd/env-file usages (installation/linux/*, operations/observability.md) are correct as written.

Commands run

  • npm run docs:check - OK (6/6 checks)
  • npm run build - OK (3235 files generated; zh anchor #多节点后端 confirmed in the generated HTML)
  • node .agents/skills/localize-rustfs-docs/scripts/audit-locales.mjs --locales zh,de,fr,ja - reports UNTRANSLATED_FILE for de/fr/ja, consistent with the section's pre-existing state (the four sibling guides report identically)

Drive-by fixes in the Nginx/Traefik/Caddy/HAProxy guides (all five
locales), noted in the Apache HTTP Server guide PR:

- RUSTFS_OBS_LOG_DIRECTORY: /var/log/rustfs/ makes the rootless RustFS
  container exit at startup with Permission denied; use /logs.
- The RustFS v2.x Console lives at /rustfs/console/; the sign-in URL
  now points there.
Implements rustfs/rustfs#8070. Adds a verified httpd reverse-proxy
guide for the S3 API and Console with TLS termination, SigV4-preserving
settings, request-body and timeout guidance, a table of settings that
do not suit RustFS, and a multi-node balancer configuration. English
plus Chinese translation; de/fr/ja follow the section's existing
pattern of English copies. Navigation updated in all five locales.
@vercel

vercel Bot commented Sep 23, 2026

Copy link
Copy Markdown

@majinghe is attempting to deploy a commit to the overtrue's projects Team on Vercel.

A member of the Team first needs to authorize it.

@majinghe
majinghe merged commit b54617f into rustfs:main Sep 23, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant