v2.9.0
caddyserver/caddyv2.9.0Dec 31, 2024by github-actions[bot]
AI Summary
A year-end release focused on refinements, performance improvements, and bug fixes across config loading, events, logging, and reverse proxy.
Key Highlights
- Upgrades to ACMEz and CertMagic.
- Performance improvements in logging, encoding, and reverse proxy.
- New `{?query}` placeholder for request query strings.
- Graceful closure of HTTP/3 server.
Breaking Changes
- Deprecated `rate_limit` and `burst` settings have been removed.
- Experimental `auto_https prefer_wildcard` option implemented.
New Features
- New `MatchWithError` matcher.
- `first_exist_fallback` strategy for `try_files`.
- `file_limit` option for file browsing.
- Experimental `force_automate` option.
Full Release Notes
Happy New Year! We're pleased to release Caddy 2.9. Aside from some minor new features, this release is mainly focused on refinements and bug fixes in many areas, including:
- Config loading
- Events
- Logging
- Placeholders
- Reverse proxy and HTTP server performance
- Matchers
- HTTP (esp. HTTP/3)
- Metrics (per-host metrics)
- Security
- TLS automation & ACME ARI
We realize there is extensive interest in Encrypted Client Hello (ECH) and post-quantum ciphers. These are slated to be supported in Go 1.24, which is scheduled for a stable release in approximately February. We did not want to force users to go through the inconvenience of installing pre-release, non-stock installations of Go, even though the RCs are quite stable and production-ready, in order to even compile Caddy, which is quite common given our plugin ecosystem. We anticipate a Caddy 2.10 release in the near future with these capabilities, built on Go 1.24.
We hope you will enjoy the 2.9 release. Thanks to all contributors, bug reporters, and helpers, and those organizations which deployed pre-release versions to production to help verify patches and features.
## Changelog
* ef4e0224a8495fc29847d865087febdee8736e3b caddyfile: Fix comma edgecase in address parsing (#6616)
* b116dcea3d022cd2b060a978c499ac17e5d0a2e1 caddyhttp: Add `{?query}` placeholder (#6714)
* c216cf551dcbd2de1da1b9fe8a7e179b76827753 caddyhttp: Allow matching Transfer-Encoding, add to access logs (#6629)
* 197c564f2032becba14aeec0152fe5eeb639d6c1 caddyhttp: Set default ReadHeaderTimeout (1 min)
* 09b2cbcf4d839adec91b189fea549d64a69e0595 caddyhttp: Add `MatchWithError` to replace SetVar hack (#6596)
* c6f2979986d87d7236b132c687c8887c92248dd8 caddyhttp: Close http3 server gracefully (#6213)
* 88fd5f3491ab888f69f0be02cea68a49164298eb caddyhttp: Use internal issuer for IPs when no APs configured
* 5c8dc344181c49bc7feade4a293bb4eed882b838 caddytls: Allow disabling storage cleaning, avoids writing two files (#6593)
* d7564d632fbed209e81978c5c2c529a7bf1836f7 caddytls: Drop `rate_limit` and `burst`, has been deprecated (#6611)
* d398898b352a6a7e8ac5c24da01dd948fc334d77 cmd: Allow `add-package` to select version of package (#6665)
* 66c80caf236e2d98e61bf1bc8bb062d7b8c25430 cmd: Disable go1.23 tlskyber=1 experiment
* fb72793269d419b2b37b5f1db8141c63818be514 cmd: Reject multiple configs for fmt command (#6717)
* b3ce260389a88a35c9b0e0a19a93abfe92fb6e9f cmd: ignore missing keys during storage export (#6697)
* 0182fb87fa7276463086c2360431a1c0dc797edf core: addresses.go funcs renames (#6622)
* e76405d55058b0a3e5ba222b44b5ef00516116aa core: Change ListenerFunc signature (#6651)
* 315715e90ffa25c4ad0d8a96e828dbdf6f638583 core: Implement FastAbs to avoid repeated os.Getwd calls (#6687)
* d0e209e1da6cd6d7d61e83b851f2913ee31454f8 encode: good defaults (#6737)
* 5ba1e06fd661aac2cbaab6d4a2ef63a9eb877a46 encode: try to use sendfile when compression is not used (#6749)
* bcaa8aaf114629031d10dcef0ca7680ae8163e32 encode: write status immediate for success response for CONNECT requests (#6738)
* 1d156527ea8fef0a96faa54d7ff61244e4be4094 events: Use `WithLazy` to prevent eager serialization of the event data (#6671)
* 6790c0e38abcc534c4b3365b6e438148001fd6df fastcgi: check for CONTENT_LENGTH when sending requests (#6661)
* eddbccd298f637c4785c891f5f96dbf103580fa8 fastcgi: remove dir redirection when useless in php_fastcgi (#6698)
* efd9251ad38a4fd9f7d900445400ac3c8e564c28 fileserver: Add `first_exist_fallback` strategy for `try_files` (#6699)
* d0123bd760f6c140f3b935159a55ba64899c84f8 fileserver: Fix policy `Validate()` oversight (#6727)
* 290cfea08f2486fb86dbc11eec96d79751180eda fileserver: add a test for precompressed defaults (#6743)
* 5c2617ebf9303100fc8c6be2a80b966b2c7fb7f1 fileserver: good default for precompressed (#6736)
* cc23ad6402e6dace30b04f0d9113530a4d9541a9 fileserver: Add `file_limit` option for browse (to be experimental) (#6648)
* 350ad38f63f7a49ceb3821c58d689b85a27ec4e5 fileserver: Fix Caddyfile parsing
* 9753c4451077d4459ec10cb3df27ab9dc4456290 fileserver: fix try_policy when instantiating file matcher from CEL (#6624)
* 05cfb121ec3f214c0e45206c188f34bad4d4eb8c forwardauth: Skip copying missing response headers (#6608)
* ed1c594cdbddf89829eaf1174f414028577b432d go.mod: Upgrade ACMEz to v3; and upgrade CertMagic
* 3f3f8b3d5270add46d5fc7d99bdcc705ad2d5df4 go.mod: Upgrade CertMagic to v0.21.5
* 91e34139a17b8914a62669b275084b5d225e0624 go.mod: upgrade only some otel deps (#6676)
* 22b9d512687cdcfbf0c574a645fcf0edd23a584f go.mod: Upgrade quic-go to 0.48.2
* b129ed6be88e40667a843bfab74abb3e5239bc8f httpcaddyfile: Fixes for `prefer_wildcard` mode (#6636)
* afa778ae05503f563af0d1015cdf7e5e78b1eeec httpcaddyfile: Implement experimental `force_automate` option (#6712)
* b183aec83c2d467706583ad9ea0e4e9c56077c55 httpcaddyfile: Implement log `sampling` config (#6682)
* 1d106fa14d7bc150acb1107ea7d034d669f9f80d metrics: add `go` and `process` collectors (#6704)
* 388c7e898c6cbcddd2c59e8a902238a0b4f06857 metrics: move `metrics` up, outside `servers` (#6606)
* 8c3dd3de709040d72bd98a756a044c453d7e871e requestbody: Type-based error handling for `MaxBytesError` (#6701)
* 5e6024c48da68492761837af3806be1951fa4c24 reverseproxy: Fix log message
* 48ce47f1d44da485fbbf6be536a0e3822763f313 reverseproxy: Use correct cases for websocket related headers (#6621)
* 825fe48e0654dc6e4e065df364a51ea79488e44b reverseproxy: Allow `0` as weights for `weighted_round_robin` (#6681)
* 328fb614f0e9996b184f41d59b7092c21dd9c712 reverseproxy: Only handle websocket protocol (#6740)
* 238f1108e6600049d9041abc88db24526ee4f882 reverseproxy: Revert #4952 - don't ignore context cancellation in stream mode
* 9c0c71e5774593e15a555d5c88de0af011e46394 reverseproxy: Rewrite requests and responses for websocket over http2 (#6567)
* c864b82ae13f9dc920ebd8782fe7c5b7007a3e1b reverseproxy: Set Content-Length when body is fully buffered (#6638)
* fbf0f4c425b23c39dbddd975d36df506cca5f45b reverseproxy: Sync changes from stdlib for 1xx handling (#6656)
* 5823eccf99d9fc6b4ffba8a78acfdb59c4ec0c97 rewrite: Don't add / in Caddyfile, do it after replacer (#6662)
* b443190b66055089d1e112abc992512ca4f6bfba sigtrap: always ignore SIGPIPE (#6645)
* f2c17d1f3fc4d9ad6324e05bab0c29aafb23e2e1 testing: sort force-automated hosts (#6756)
* 669fc41e6321115df554d5f7d8eb55fdfbdaab18 tracing: Add `spanID` field to access logs and `http.vars.span_id` placeholder (#6646)
## What's Changed
* Make it possible to configure the `DisableStorageCheck` setting for certmagic by @ankon in https://github.com/caddyserver/caddy/pull/6368
* caddyhttp: Add test case to corpus by @mholt in https://github.com/caddyserver/caddy/pull/6374
* cmd: remove zealous check of Caddyfile auto-detection by @mohammed90 in https://github.com/caddyserver/caddy/pull/6370
* ci: upgrade to goreleaser v2 by @mohammed90 in https://github.com/caddyserver/caddy/pull/6376
* logging: Allow setting log file permissions by @ririsoft in https://github.com/caddyserver/caddy/pull/6314
* Split `run` into a public `BuildContext` and a private part by @ankon in https://github.com/caddyserver/caddy/pull/6378
* Write the header if none had been written in WriteResponse by @ankon in https://github.com/caddyserver/caddy/pull/6380
* fix file mode configuration parsing by @ririsoft in https://github.com/caddyserver/caddy/pull/6383
* go.mod: update tscert package by @willnorris in https://github.com/caddyserver/caddy/pull/6384
* logging: Customizable `zapcore.Core` by @kkroo in https://github.com/caddyserver/caddy/pull/6381
* logging: set file mode when the file already exist. by @ririsoft in https://github.com/caddyserver/caddy/pull/6391
* caddyfile: Pass blocks to `import` for snippets by @elee1766 in https://github.com/caddyserver/caddy/pull/6130
* reverseproxy: add Max-Age option to sticky cookie by @JasonYuan869 in https://github.com/caddyserver/caddy/pull/6398
* fileserver: Remove newline characters from precomputed etags by @armadi1809 in https://github.com/caddyserver/caddy/pull/6394
* fix: http.intercept.header.* placeholders by @dunglas in https://github.com/caddyserver/caddy/pull/6429
* reverseproxy: Only log host is up status on change by @klaxa in https://github.com/caddyserver/caddy/pull/6419
* fix: don't compress already compressed fonts by @dunglas in https://github.com/caddyserver/caddy/pull/6432
* caddyhttp: Reject 0-RTT early data in IP matchers and set Early-Data header when proxying by @mholt in https://github.com/caddyserver/caddy/pull/6427
* reverseproxy: Add placeholder for host in active health check headers by @francislavoie in https://github.com/caddyserver/caddy/pull/6440
* browse: add Content-Security-Policy w/ nonce by @steffenbusch in https://github.com/caddyserver/caddy/pull/6425
* browse: fix Content-Security-Policy warnings in Firefox by @steffenbusch in https://github.com/caddyserver/caddy/pull/6443
* fileserver: Exclude symlink target size from total, show arrow on size by @francislavoie in https://github.com/caddyserver/caddy/pull/6412
* reverseproxy: Fix dynamic upstreams ip version by @armadi1809 in https://github.com/caddyserver/caddy/pull/6448
* reverseproxy: Add placeholder for networkAddr in active health check headers by @dylanschultzie in https://github.com/caddyserver/caddy/pull/6450
* Add option to set which HTTP method to use for active health checks by @jbro in https://github.com/caddyserver/caddy/pull/6453
* reverseproxy: Caddyfile support for health_method by @jbro in https://github.com/caddyserver/caddy/pull/6454
* reverseproxy: add health_upstream subdirective by @dylanschultzie in https://github.com/caddyserver/caddy/pull/6451
* ci: correct `-tags nobadger` on binary build by @girlbossceo in https://github.com/caddyserver/caddy/pull/6470
* Caddyfile support for TLS handshake matchers by @vnxme in https://github.com/caddyserver/caddy/pull/6461
* Caddyfile support for TLS connection and certificate selection policies by @vnxme in https://github.com/caddyserver/caddy/pull/6462
* chore: update golangci config by @mohammed90 in https://github.com/caddyserver/caddy/pull/6479
* encode: flush already compressed data to the stream by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6471
* proxyprotocol: Update WrapListener to use ConnPolicyFunc for PROXY protocol by @pi-prakhar in https://github.com/caddyserver/caddy/pull/6485
* fileserver: add `sort` options by @lollipopkit in https://github.com/caddyserver/caddy/pull/6468
* go.mod: update quic-go package by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6498
* Runtime placeholders for selected TLS and HTTP matchers by @vnxme in https://github.com/caddyserver/caddy/pull/6480
* replacer: `{file.*}` global placeholder strips trailing newline by @steffenbusch in https://github.com/caddyserver/caddy/pull/6411
* go.mod: update update golang/x/net by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6500
* reverse_proxy: apply keep-alive setting for h2c requests by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6343
* Fix a regression in #6480: the context may have no replacer by @vnxme in https://github.com/caddyserver/caddy/pull/6510
* caddyhttp: Export PrivateRangesCIDR() for plugins after #6480 by @vnxme in https://github.com/caddyserver/caddy/pull/6514
* ignore exec.ErrDot when starting caddy in background by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6512
* ci: don't exit early on error in remote CI machine by @mohammed90 in https://github.com/caddyserver/caddy/pull/6519
* reverseproxy: Active health checks request body option by @jbro in https://github.com/caddyserver/caddy/pull/6520
* reverseproxy: Change logs for write errors to warn level by @jum in https://github.com/caddyserver/caddy/pull/6532
* cmd: Use a factory to create the caddy root command by @elee1766 in https://github.com/caddyserver/caddy/pull/6533
* chore: Fix a typo by @sunnyagain in https://github.com/caddyserver/caddy/pull/6534
* error: run `error` (msg) through replacer by @mohammed90 in https://github.com/caddyserver/caddy/pull/6536
* reverseproxy: allow user to define source address by @mohammed90 in https://github.com/caddyserver/caddy/pull/6504
* chore: build and test with Go 1.23 by @dunglas in https://github.com/caddyserver/caddy/pull/6526
* tls: use Go default kex for the moment that include PQC by @bwesterb in https://github.com/caddyserver/caddy/pull/6542
* ci: prepare syso files for windows embedding in release by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6406
* Performance: Prevents the zap logger from serializing the request in rewrite.go. by @AlliBalliBaba in https://github.com/caddyserver/caddy/pull/6541
* fileserver: move `sort` to `browse` by @lollipopkit in https://github.com/caddyserver/caddy/pull/6502
* reverse_proxy: add placeholder http.reverse_proxy.retries by @steffenbusch in https://github.com/caddyserver/caddy/pull/6553
* fix(#6551): Unexpected behaviour if caddyhttp.Route is provisioned twice by @jbro in https://github.com/caddyserver/caddy/pull/6558
* caddytls: Add sni_regexp matcher by @vnxme in https://github.com/caddyserver/caddy/pull/6569
* rewrite: Avoid panic on bad arg count for `uri` by @mister-turtle in https://github.com/caddyserver/caddy/pull/6571
* perf: use zap's Check() to prevent useless allocs by @dunglas in https://github.com/caddyserver/caddy/pull/6560
* ci: update the linter action version by @mohammed90 in https://github.com/caddyserver/caddy/pull/6575
* update quic-go to v0.47.0 by @marten-seemann in https://github.com/caddyserver/caddy/pull/6582
* quic: enable qlog, controlled by QLOGDIR env by @marten-seemann in https://github.com/caddyserver/caddy/pull/6581
* caddytls: Give a better error message when given encrypted private keys by @francislavoie in https://github.com/caddyserver/caddy/pull/6591
* chore: Use slices package where possible by @francislavoie in https://github.com/caddyserver/caddy/pull/6585
* caddyhttp: Optimize logs using zap's WithLazy() by @AlliBalliBaba in https://github.com/caddyserver/caddy/pull/6590
* doc: remove docs of deprecated directives by @mohammed90 in https://github.com/caddyserver/caddy/pull/6566
* Implement issue #6296 passing FDs / socket activation by @MayCXC in https://github.com/caddyserver/caddy/pull/6573
* caddyhttp: Fix listener wrapper regression from #6573 by @MayCXC in https://github.com/caddyserver/caddy/pull/6599
* chore: Adjust incorrect `reverse_proxy` Caddyfile comment by @francislavoie in https://github.com/caddyserver/caddy/pull/6598
* http: ReponseWriter prefer ReadFrom if available by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6565
* caddytls: Support new tls.context module by @mholt in https://github.com/caddyserver/caddy/pull/6369
* Better errors when reloading by @mholt in https://github.com/caddyserver/caddy/pull/6601
* caddyhttp: Escaping placeholders in CEL, add `vars` and `vars_regexp` by @francislavoie in https://github.com/caddyserver/caddy/pull/6594
* autohttps: Implement `auto_https prefer_wildcard` option by @francislavoie in https://github.com/caddyserver/caddy/pull/6146
* metrics: scope metrics to active config, add optional per-host metrics by @mohammed90 in https://github.com/caddyserver/caddy/pull/6531
* ci: install xcaddy to fix release flow by @mohammed90 in https://github.com/caddyserver/caddy/pull/6602
* caddytls: Drop `rate_limit` and `burst`, has been deprecated by @francislavoie in https://github.com/caddyserver/caddy/pull/6611
* tests: Fix adapt test warning by @mohammed90 in https://github.com/caddyserver/caddy/pull/6619
* docs: expand proxy protocol docs by @mohammed90 in https://github.com/caddyserver/caddy/pull/6620
* caddyfile: Fix comma edgecase in address parsing by @francislavoie in https://github.com/caddyserver/caddy/pull/6616
* reverseproxy: Use correct cases for websocket related headers by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6621
* chore: update quic-go to v0.48.0 by @marten-seemann in https://github.com/caddyserver/caddy/pull/6627
* caddyhttp: Close http3 server gracefully by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6213
* metrics: move `metrics` up, outside `servers` by @mohammed90 in https://github.com/caddyserver/caddy/pull/6606
* fix: always ignore SIGPIPE by @dunglas in https://github.com/caddyserver/caddy/pull/6645
* fileserver: fix try_policy when instantiating file matcher from CEL by @effleurager in https://github.com/caddyserver/caddy/pull/6624
* chore: fix some function names in comment by @davidwoood in https://github.com/caddyserver/caddy/pull/6650
* core: addresses.go funcs renames by @MayCXC in https://github.com/caddyserver/caddy/pull/6622
* tracing: Add `spanID` field to access logs and `http.vars.span_id` placeholder by @YifanYang6 in https://github.com/caddyserver/caddy/pull/6646
* reverseproxy: Sync changes from stdlib for 1xx handling by @francislavoie in https://github.com/caddyserver/caddy/pull/6656
* chore: Bump quic-go to 0.48.1, fixing a panic by @francislavoie in https://github.com/caddyserver/caddy/pull/6654
* chore: compile without nosql's support for Postgres and MySQL by @dunglas in https://github.com/caddyserver/caddy/pull/6655
* cmd: Allow `add-package` to select version of package by @Botelho31 in https://github.com/caddyserver/caddy/pull/6665
* httpcaddyfile: Fixes for `prefer_wildcard` mode by @francislavoie in https://github.com/caddyserver/caddy/pull/6636
* Use `WithLazy` to prevent eager serialization of the event data by @ankon in https://github.com/caddyserver/caddy/pull/6671
* forwardauth: Skip copying missing response headers by @francislavoie in https://github.com/caddyserver/caddy/pull/6608
* caddyhttp: Add `MatchWithError` to replace SetVar hack by @francislavoie in https://github.com/caddyserver/caddy/pull/6596
* go.mod: upgrade only some otel deps by @mohammed90 in https://github.com/caddyserver/caddy/pull/6676
* fileserver: Add `file_limit` option for browse by @atakanyenel in https://github.com/caddyserver/caddy/pull/6648
* rewrite: Don't add `/` in Caddyfile, do it after replacer by @francislavoie in https://github.com/caddyserver/caddy/pull/6662
* caddytls: Allow disabling storage cleaning, avoids writing two files by @francislavoie in https://github.com/caddyserver/caddy/pull/6593
* ci: use commit sha in goreleaser-check by @mohammed90 in https://github.com/caddyserver/caddy/pull/6677
* reverseproxy: Allow `0` as weights for `weighted_round_robin` by @suciptoid in https://github.com/caddyserver/caddy/pull/6681
* httpcaddyfile: Implement log `sampling` config by @nikonhub in https://github.com/caddyserver/caddy/pull/6682
* core: Implement FastAbs to avoid repeated os.Getwd calls by @francislavoie in https://github.com/caddyserver/caddy/pull/6687
* chore: Add `provides` to `.deb` releases by @francislavoie in https://github.com/caddyserver/caddy/pull/6691
* chore: make FastAbs comment easier to understand by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6692
* cmd: ignore missing keys during storage export by @santhoshTpixler in https://github.com/caddyserver/caddy/pull/6697
* perf: remove dir redirection when useless in php_fastcgi by @dunglas in https://github.com/caddyserver/caddy/pull/6698
* requestbody: Type-based error handling for `MaxBytesError` by @rishitashaw in https://github.com/caddyserver/caddy/pull/6701
* metrics: add `go` and `process` collectors by @mohammed90 in https://github.com/caddyserver/caddy/pull/6704
* ci: prevent jobs running on PRs from forks by @mohammed90 in https://github.com/caddyserver/caddy/pull/6720
* caddyhttp: Add `{?query}` placeholder by @francislavoie in https://github.com/caddyserver/caddy/pull/6714
* fileserver: Add `first_exist_fallback` strategy for `try_files` by @dunglas in https://github.com/caddyserver/caddy/pull/6699
* cmd: `fmt` prevents multiple files passed as args, add support for `--config` by @armadi1809 in https://github.com/caddyserver/caddy/pull/6717
* fileserver: Fix policy `Validate()` oversight by @francislavoie in https://github.com/caddyserver/caddy/pull/6727
* chore: bump golang.org/x/net to v0.32.0 by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6728
* reverseproxy: Rewrite requests and responses for websocket over http2 by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6567
* chore: fix some typo in HTTPLoader comment by @jpadilla in https://github.com/caddyserver/caddy/pull/6735
* feat: good default for file_server.precompressed by @dunglas in https://github.com/caddyserver/caddy/pull/6736
* test: add a test for precompressed defaults by @dunglas in https://github.com/caddyserver/caddy/pull/6743
* feat: good default for encode by @dunglas in https://github.com/caddyserver/caddy/pull/6737
* encode: write status immediate for success response for CONNECT requests by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6738
* reverseproxy: Only handle extended connect for websockets by @bt90 in https://github.com/caddyserver/caddy/pull/6740
* core: Change getListenerFromPlugin signature by @MayCXC in https://github.com/caddyserver/caddy/pull/6651
* reverseproxy: Set `Content-Length` when body is fully buffered by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6638
* fastcgi: check for CONTENT_LENGTH when sending requests by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6661
* caddyhttp: Allow matching Transfer-Encoding, add to access logs by @francislavoie in https://github.com/caddyserver/caddy/pull/6629
* encode: try to use sendfile when compression is not used by @WeidiDeng in https://github.com/caddyserver/caddy/pull/6749
* httpcaddyfile: Implement `force_automate` by @francislavoie in https://github.com/caddyserver/caddy/pull/6712
* testing: sort force-automated hosts by @mohammed90 in https://github.com/caddyserver/caddy/pull/6756
## New Contributors
* @ririsoft made their first contribution in https://github.com/caddyserver/caddy/pull/6314
* @JasonYuan869 made their first contribution in https://github.com/caddyserver/caddy/pull/6398
* @klaxa made their first contribution in https://github.com/caddyserver/caddy/pull/6419
* @dylanschultzie made their first contribution in https://github.com/caddyserver/caddy/pull/6450
* @jbro made their first contribution in https://github.com/caddyserver/caddy/pull/6453
* @girlbossceo made their first contribution in https://github.com/caddyserver/caddy/pull/6470
* @vnxme made their first contribution in https://github.com/caddyserver/caddy/pull/6461
* @pi-prakhar made their first contribution in https://github.com/caddyserver/caddy/pull/6485
* @lollipopkit made their first contribution in https://github.com/caddyserver/caddy/pull/6468
* @sunnyagain made their first contribution in https://github.com/caddyserver/caddy/pull/6534
* @AlliBalliBaba made their first contribution in https://github.com/caddyserver/caddy/pull/6541
* @mister-turtle made their first contribution in https://github.com/caddyserver/caddy/pull/6571
* @MayCXC made their first contribution in https://github.com/caddyserver/caddy/pull/6573
* @effleurager made their first contribution in https://github.com/caddyserver/caddy/pull/6624
* @davidwoood made their first contribution in https://github.com/caddyserver/caddy/pull/6650
* @YifanYang6 made their first contribution in https://github.com/caddyserver/caddy/pull/6646
* @Botelho31 made their first contribution in https://github.com/caddyserver/caddy/pull/6665
* @atakanyenel made their first contribution in https://github.com/caddyserver/caddy/pull/6648
* @suciptoid made their first contribution in https://github.com/caddyserver/caddy/pull/6681
* @nikonhub made their first contribution in https://github.com/caddyserver/caddy/pull/6682
* @santhoshTpixler made their first contribution in https://github.com/caddyserver/caddy/pull/6697
* @rishitashaw made their first contribution in https://github.com/caddyserver/caddy/pull/6701
* @jpadilla made their first contribution in https://github.com/caddyserver/caddy/pull/6735
**Full Changelog**: https://github.com/caddyserver/caddy/compare/v2.8.4...v2.9.0