A fast, memory-safe web server written in Rust. https://ferron.sh
  • Rust 89.9%
  • Shell 7.3%
  • PowerShell 0.9%
  • Dockerfile 0.7%
  • CSS 0.4%
  • Other 0.8%
Find a file
2026-02-26 11:47:02 +01:00
.github chore(deps): update actions/attest-build-provenance action to v4 2026-02-26 01:52:51 +00:00
.shiba Merge branch 'develop-2.x' into 2.x 2026-02-10 16:19:11 +01:00
.zed chore: move build directories into a new build directory 2026-02-12 10:25:40 +01:00
assets chore: use darker link color for light mode for better accessibility 2026-02-14 19:13:27 +01:00
build chore(deps): update rust crate toml to v1.0.3 2026-02-18 22:35:56 +00:00
configs docs: reorganize the Ferron documentation file structure 2026-02-16 16:18:26 +01:00
dockertest test(dockertest): update the expected hostname in the reverse proxy test 2026-02-25 11:18:31 +01:00
docs fix: don't rewrite Host header in reverse proxy for plaintext HTTP 2026-02-25 10:57:45 +01:00
ferron fix: fix panic when accepting a QUIC connection 2026-02-26 11:30:27 +01:00
ferron-common test: add unit tests for load balancing algorithms 2026-02-26 11:47:02 +01:00
ferron-dns-builtin chore: release Ferron 2.5.5 2026-02-11 22:33:15 +01:00
ferron-load-modules chore: release Ferron 2.5.5 2026-02-11 22:33:15 +01:00
ferron-modules-builtin fix: don't rewrite Host header in reverse proxy for plaintext HTTP 2026-02-25 10:57:45 +01:00
ferron-observability-builtin chore: release Ferron 2.5.5 2026-02-11 22:33:15 +01:00
ferron-passwd Revert "chore: move CLI utilities into a new utils directory" 2026-02-12 11:00:00 +01:00
ferron-precompress Revert "chore: move CLI utilities into a new utils directory" 2026-02-12 11:00:00 +01:00
ferron-yaml2kdl Revert "chore: move CLI utilities into a new utils directory" 2026-02-12 11:00:00 +01:00
ferron-yaml2kdl-core Revert "chore: rename ferron-yaml2kdl-core directory" 2026-02-12 10:59:50 +01:00
installer docs: reorganize the Ferron documentation file structure 2026-02-16 16:18:26 +01:00
manualtest fix: don't rewrite Host header in reverse proxy for plaintext HTTP 2026-02-25 10:57:45 +01:00
packaging build(packaging): remove forced directory removal from RPM spec 2026-02-24 12:41:23 +01:00
smoketest chore: add curl connection timeout to the smoke test 2025-12-20 08:09:09 +01:00
wwwroot chore: use darker link color for light mode for better accessibility 2026-02-14 19:13:27 +01:00
.dockerignore chore: move build directories into a new build directory 2026-02-12 10:25:40 +01:00
.gitignore chore(packaging): ignore *.list files in RPM package build 2026-02-24 11:35:28 +01:00
.rumdl.toml chore: add documentation linting in Git hooks and GitHub Action workflow 2026-02-01 06:42:29 +01:00
build.ps1 chore: move build directories into a new build directory 2026-02-12 10:25:40 +01:00
Cargo.lock chore: update dependencies to latest versions 2026-02-25 18:42:21 +01:00
Cargo.toml Revert "chore: move CLI utilities into a new utils directory" 2026-02-12 11:00:00 +01:00
CHANGELOG.md fix: improve least-connections correctness 2026-02-26 11:35:03 +01:00
CODE_OF_CONDUCT.md chore: change email domain to "ferron.sh" 2025-09-10 16:08:44 +02:00
COMPILATION.md docs: add more examples for observability backend support in compilation 2025-12-01 12:57:19 +01:00
CONTRIBUTING.md docs: replace a link to contributing page with actual contents 2026-02-20 14:35:58 +01:00
CONTRIBUTORS.svg chore: update contributors [skip ci] 2026-02-24 10:56:08 +00:00
Cross.toml build: use non-interactive apt frontend 2025-10-11 15:02:02 +02:00
Dockerfile chore: move build directories into a new build directory 2026-02-12 10:25:40 +01:00
Dockerfile.alpine chore: move build directories into a new build directory 2026-02-12 10:25:40 +01:00
Dockerfile.debian chore: move build directories into a new build directory 2026-02-12 10:25:40 +01:00
Dockerfile.test chore: move build directories into a new build directory 2026-02-12 10:25:40 +01:00
ferron-build.yaml feat: add directives for logging into standard I/O 2026-02-10 14:52:52 +01:00
LICENSE chore: update the copyright date in the license 2026-01-01 11:30:12 +01:00
Makefile build: try fixing issues with CARGO_FINAL_EXTRA_ARGS in Makefile 2026-02-17 09:30:37 +01:00
MODULES.md docs: add mention about the example observability backend support in 2025-12-01 23:18:14 +01:00
README.md docs: reorganize the Ferron documentation file structure 2026-02-16 16:18:26 +01:00
renovate.json chore: configure Renovate 2025-10-19 15:38:52 +02:00
rustfmt.toml chore: configuire the maximum line width in rustfmt and format Rust 2025-07-15 18:08:35 +02:00
SECURITY.md chore: remove some remnants of the old domain name 2025-11-24 13:29:43 +01:00

Ferron logo

Ferron - a fast, modern, and easily configurable web server with automatic TLS


Static Badge Website Chat X (formerly Twitter) Follow Docker Pulls GitHub Repo stars

Why Ferron?

  • High performance - thoroughly optimized for speed with support for high concurrency.
  • Memory-safe - built with Rust, which is a programming language that can offer strong memory safety guarantees.
  • Automatic TLS - automatic SSL/TLS certificate acquisition and renewal with Let's Encrypt integration.
  • Easy configuration - simple, intuitive configuration with sensible, secure defaults and comprehensive documentation.
  • Extensibility - modular architecture for easy customization.
  • Powerful reverse proxy - advanced reverse proxy capabilities with support for load balancing and health checks.

Installing Ferron from pre-built binaries

The easiest way to install Ferron is installing it from pre-built binaries.

Below are the different ways to install Ferron:

Configuration examples

Basic static file serving

// Example configuration with static file serving. Replace "example.com" with your domain name.
example.com {
    root "/var/www/html" // Replace "/var/www/html" with the directory containing your static files
}

Basic reverse proxying

// Example configuration with reverse proxy. Replace "example.com" with your domain name.
example.com {
    proxy "http://localhost:3000/" // Replace "http://localhost:3000" with the backend server URL
}

More examples

You can find more configuration examples for common use cases in the Ferron documentation.

Building Ferron from source

You can clone the repository and explore the existing code:

git clone https://github.com/ferronweb/ferron.git
cd ferron

You can then build and run the web server using Cargo:

cargo run --manifest-path build/prepare/Cargo.toml
cd build/workspace
cargo update # If you experience crate conflicts
cargo build -r --target-dir ../../target
cd ..
cp configs/ferron.test.kdl ferron.kdl
target/release/ferron

You can also, for convenience, use make:

make build # Build the web server
make build-dev # Build the web server, for development and debugging
make run # Run the web server
make run-dev # Run the web server, for development and debugging
make smoketest # Perform a smoke test
make smoketest-dev # Perform a smoke test, for development and debugging
make package # Package the web server to a ZIP archive (run it after building it)
make package-deb # Package the web server to a Debian package (run it after building it)
make package-rpm # Package the web server to an RPM package (run it after building it)
make installer # Build installers for Ferron 2

Or a build.ps1 build script, if you're on Windows:

REM Build the web server
powershell -ExecutionPolicy Bypass .\build.ps1 Build

REM Build the web server, for development and debugging
powershell -ExecutionPolicy Bypass .\build.ps1 BuildDev

REM Run the web server
powershell -ExecutionPolicy Bypass .\build.ps1 Run

REM Run the web server, for development and debugging
powershell -ExecutionPolicy Bypass .\build.ps1 RunDev

REM Perform a smoke test
powershell -ExecutionPolicy Bypass .\build.ps1 Smoketest

REM Perform a smoke test, for development and debugging
powershell -ExecutionPolicy Bypass .\build.ps1 SmoketestDev

REM Package the web server to a ZIP archive (run it after building it)
powershell -ExecutionPolicy Bypass .\build.ps1 Package

REM Build installers for Ferron 2
powershell -ExecutionPolicy Bypass .\build.ps1 Installer

You can also create a ZIP archive that can be used by the Ferron installer:

make build-with-package

Or if you're on Windows:

powershell -ExecutionPolicy Bypass .\build.ps1 BuildWithPackage

The ZIP archive will be located in the dist directory.

You can also cross-compile the web server for a different target:

# Replace "i686-unknown-linux-gnu" with the target (as defined by the Rust target triple) you want to build for
make build TARGET="i686-unknown-linux-gnu" CARGO_FINAL="cross"

It's also possible to use only Cargo to build the web server, although you wouldn't be able to use external modules:

cargo build -r
./target/release/ferron

For compilation notes, see the compilation notes page.

Modules

If you would like to develop Ferron modules, you can find the Ferron module development notes.

Server configuration

You can check the Ferron documentation to see configuration properties used by Ferron.

Contributing

See Ferron contribution page for details.

Below is a list of contributors to Ferron. Thank you to all of them!

Contributor list

License

Ferron is licensed under the MIT License. See LICENSE for details.