https://github.com/ferronweb/ferron
A fast, memory-safe web server written in Rust.
https://github.com/ferronweb/ferron
http http-server rust server web web-server webserver
Last synced: 9 days ago
JSON representation
A fast, memory-safe web server written in Rust.
- Host: GitHub
- URL: https://github.com/ferronweb/ferron
- Owner: ferronweb
- License: mit
- Created: 2025-02-09T13:20:22.000Z (about 1 year ago)
- Default Branch: develop-2.x
- Last Pushed: 2026-02-10T05:33:08.000Z (10 days ago)
- Last Synced: 2026-02-10T10:47:13.429Z (9 days ago)
- Topics: http, http-server, rust, server, web, web-server, webserver
- Language: Rust
- Homepage: https://ferron.sh
- Size: 23.6 MB
- Stars: 1,852
- Watchers: 4
- Forks: 83
- Open Issues: 86
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Security: SECURITY.md
Awesome Lists containing this project
- awesome-starred - ferronweb/ferron - A fast, memory-safe web server written in Rust. (Rust)
README
Ferron - a fast, modern, and easily configurable web server with automatic TLS
* * *
## Why Ferron?
- **High performance** - thoroughly optimized for speed with support for high concurrency.
- **Memory-safe** - built with [Rust](https://rust-lang.org/), 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](https://letsencrypt.org/) integration.
- **Easy configuration** - simple, intuitive configuration with sensible, secure defaults and [comprehensive documentation](https://ferron.sh/docs).
- **Extensibility** - modular architecture for easy customization.
- **Powerful reverse proxy** - advanced reverse proxy capabilities with support for load balancing and health checks.
## Components
Ferron consists of multiple components:
- **`ferron`** - the main web server.
- **`ferron-passwd`** - a tool for generating hashed passwords, which can be copied into the web server's configuration file.
- **`ferron-precompress`** - a tool for precompressing static files for Ferron.
- **`ferron-yaml2kdl`** - a tool for attempting to convert the Ferron 1.x YAML configuration to Ferron 2.x KDL configuration.
Ferron also consists of:
- **`build-prepare`** - internal tool for preparation when building Ferron with modules.
- **`ferron-common`** - code common for Ferron and its modules.
- **`ferron-dns-builtin`** - built-in Ferron DNS providers.
- **`ferron-load-modules`** - functions for loading Ferron modules.
- **`ferron-modules-builtin`** - built-in Ferron modules.
- **`ferron-observability-builtin`** - built-in Ferron observability backend support.
- **`ferron-yaml2kdl-core`** - the core library behind the `ferron-yaml2kdl` tool.
## 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:
- [Installer (GNU/Linux)
](https://ferron.sh/docs/installation/installer-linux)
- [Installer (Windows Server)
](https://ferron.sh/docs/installation/installer-windows)
- [Package managers (Debian/Ubuntu)](https://ferron.sh/docs/installation/debian)
- [Package managers (RHEL/Fedora)](https://ferron.sh/docs/installation/rpm)
- [Docker](https://ferron.sh/docs/installation/docker)
- [Package managers (community)](https://ferron.sh/docs/installation/package-managers)
- [Manual installation](https://ferron.sh/docs/installation/manual)
## Configuration examples
### Basic static file serving
```kdl
// 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
```kdl
// 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](https://ferron.sh/docs).
## Building Ferron from source
You can clone the repository and explore the existing code:
```sh
git clone https://github.com/ferronweb/ferron.git
cd ferron
```
You can then build and run the web server using Cargo:
```sh
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 ferron-test.kdl ferron.kdl
target/release/ferron
```
You can also, for convenience, use `make`:
```sh
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:
```batch
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:
```sh
make build-with-package
```
Or if you're on Windows:
```batch
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:
```sh
# 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:
```sh
cargo build -r
./target/release/ferron
```
For compilation notes, see the [compilation notes page](./COMPILATION.md).
## Modules
If you would like to develop Ferron modules, you can find the [Ferron module development notes](./MODULES.md).
## Server configuration
You can check the [Ferron documentation](https://ferron.sh/docs/configuration-kdl) to see configuration properties used by Ferron.
## Contributing
See [Ferron contribution page](https://ferron.sh/contribute) for details.
Below is a list of contributors to Ferron. **Thank you to all of them!**
[](https://github.com/ferronweb/ferron/graphs/contributors)
## License
Ferron is licensed under the MIT License. See `LICENSE` for details.