- C 59.3%
- Python 19.4%
- Java 9.7%
- Rust 5.4%
- Shell 2.7%
- Other 3.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
The descriptor check compared only counts, so a failure said "descriptors leak router" and nothing about what leaked. The Alpine aarch64 build runs with --fds-threshold=160, and https://github.com/nginx/unit/issues/1129 is still open because nobody could tell which descriptors they were. Each baseline now also records the kinds behind the count, read from /proc/<pid>/fd: pipe, memfd, the anon_inode name (eventfd, signalfd, eventpoll, io_uring), the file path, and for sockets the protocol found by inode in /proc/<pid>/net: "tcp listen", "tcp close-wait", "tcp time-wait", "udp6", "netlink", "unix" or "unix:<path>". Kernel autobind names are folded into "unix:@autobind" so that equal sockets add up. A failing assert lists what changed: descriptors leak router: eventfd +1, unix +1 /proc/net/unix is read as bytes and decoded with backslashreplace, so a socket path with non-UTF-8 bytes cannot crash the teardown. A unix line is split with maxsplit=7, so a path with spaces is kept whole. File names that are not UTF-8 are escaped. The socket tables are read once per descriptor check. The line parsing is a helper, and test/test_conftest_fd_kinds.py pins it. The threshold and the counting are unchanged. Without /proc the message says so. Co-Authored-By: DeepSeek V4.1 Flash Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Reviewed-by: DeepSeek V4.1 Flash |
||
| .github | ||
| auto | ||
| docs | ||
| fuzzing | ||
| go | ||
| pkg | ||
| scripts | ||
| src | ||
| test | ||
| tools | ||
| .editorconfig | ||
| .gitattributes | ||
| .gitignore | ||
| .mailmap | ||
| .rustfmt.toml | ||
| CHANGES | ||
| CODE_OF_CONDUCT.md | ||
| configure | ||
| CONTRIBUTING.md | ||
| EOL.md | ||
| LICENSE | ||
| NOTICE | ||
| README.md | ||
| RELEASE-PROCESS.md | ||
| SECURITY.md | ||
| TODO.md | ||
| UNFREEZE.md | ||
| version | ||
FreeUnit — Community LTS fork of Unit
Free as in freedom.
Unit application server, continued by the community.
The original Unit repository was archived in October 2025. The maintainers noted: "A new maintainer is desired." FreeUnit is that maintainer.
Forked from the original Unit project to ensure:
- Long-term security maintenance
- PHP 8.4+ and PHP 8.5+ runtime support
- Predictable release cycle
- Independent, community-driven governance
In the lineage of: freenginx · MariaDB · LibreOffice · OpenSSH — when corporations step back, community takes over.
Universal Web App Server
FreeUnit is a lightweight and versatile open-source server with two primary capabilities:
- serves static media assets
- runs application code in eight languages
Unit compresses several layers of the modern application stack into a potent, coherent solution with a focus on performance, low latency, and scalability. It is intended as a universal building block for any web architecture, regardless of its complexity, from enterprise-scale deployments to your pet's homepage.
Its native RESTful JSON API enables dynamic updates with zero interruptions and flexible configuration, while its out-of-the-box productivity reliably scales to production-grade workloads. We achieve that with a complex, asynchronous, multithreading architecture comprising multiple processes to ensure security and robustness while getting the most out of today's computing platforms.
Installation
Docker
Images are published to the GitHub Container Registry (GHCR) on every release
and are available for linux/amd64 and linux/arm64.
| Variant | Image |
|---|---|
| minimal | ghcr.io/freeunitorg/freeunit:latest-minimal |
| PHP 8.5 | ghcr.io/freeunitorg/freeunit:latest-php-8.5 |
| PHP 8.4 | ghcr.io/freeunitorg/freeunit:latest-php-8.4 |
| PHP 8.3 | ghcr.io/freeunitorg/freeunit:latest-php-8.3 |
| Python 3.14 | ghcr.io/freeunitorg/freeunit:latest-python-3.14 |
| Python 3.13 | ghcr.io/freeunitorg/freeunit:latest-python-3.13 |
| Python 3.12 | ghcr.io/freeunitorg/freeunit:latest-python-3.12 |
| Node.js 26 | ghcr.io/freeunitorg/freeunit:latest-node-26 |
| Node.js 24 | ghcr.io/freeunitorg/freeunit:latest-node-24 |
| Node.js 22 | ghcr.io/freeunitorg/freeunit:latest-node-22 |
| Node.js 20 | ghcr.io/freeunitorg/freeunit:latest-node-20 |
| Go 1.27 | ghcr.io/freeunitorg/freeunit:latest-go-1.27 |
| Go 1.26 | ghcr.io/freeunitorg/freeunit:latest-go-1.26 |
| Go 1.25 | ghcr.io/freeunitorg/freeunit:latest-go-1.25 |
| Ruby 4.0 | ghcr.io/freeunitorg/freeunit:latest-ruby-4.0 |
| Ruby 3.4 | ghcr.io/freeunitorg/freeunit:latest-ruby-3.4 |
| WebAssembly | ghcr.io/freeunitorg/freeunit:latest-wasm |
Full list of variants (including python-3.14, perl-5.40, ruby-3.3, slim
Python variants, etc.) is in the
docker workflow.
$ docker pull ghcr.io/freeunitorg/freeunit:latest-minimal
$ mkdir /tmp/unit-control
$ docker run -d \
--mount type=bind,src=/tmp/unit-control,dst=/var/run \
--mount type=bind,src=.,dst=/www \
--network host \
ghcr.io/freeunitorg/freeunit:latest-minimal
Build from Source
$ git clone https://github.com/freeunitorg/freeunit
$ cd freeunit
$ ./configure --openssl --otel
$ make
$ sudo make unitd-install
Getting Started with unitctl
unitctl streamlines the management of FreeUnit processes
through an easy-to-use command line interface. Download it from the
releases page.
$ tar xzvf unitctl-master-x86_64-unknown-linux-gnu.tar.gz
# mv unitctl /usr/local/bin/
Quick Start: PHP
Save /www/helloworld/index.php:
<?php echo "Hello, PHP on FreeUnit!"; ?>
Configure via Unix socket:
# curl -X PUT --data-binary @config.json \
--unix-socket /var/run/control.unit.sock \
http://localhost/config/applications
# curl -X PUT -d '{"127.0.0.1:8080": {"pass": "applications/helloworld"}}' \
--unix-socket /var/run/control.unit.sock \
http://localhost/config/listeners
$ curl 127.0.0.1:8080
Hello, PHP on FreeUnit!
PHP 8.4 and PHP 8.5 Support
FreeUnit provides first-class PHP 8.4 and PHP 8.5 support — the primary motivation for this fork.
$ docker pull ghcr.io/freeunitorg/freeunit:latest-php-8.5
$ docker pull ghcr.io/freeunitorg/freeunit:latest-php-8.4
OpenTelemetry
FreeUnit includes built-in OpenTelemetry support (compiled with --otel):
{
"settings": {
"telemetry": {
"endpoint": "http://localhost:4317/v1/traces",
"protocol": "grpc",
"sampling_ratio": 1.0,
"batch_size": 20
}
}
}
WebAssembly
FreeUnit supports running WebAssembly Components (WASI 0.2). For configuration details see the OpenAPI spec.
OpenAPI Specification
The OpenAPI specification aims to simplify configuring and integrating FreeUnit deployments and provides an authoritative source of knowledge about the control API.
Community
- Discussions: github.com/freeunitorg/freeunit/discussions
- Issues: github.com/freeunitorg/freeunit/issues
- Website: freeunit.org
- Chat: t.me/freeunit_support
- Contact: team@freeunit.org
- Contributing: see CONTRIBUTING.md
- Security: see SECURITY.md
License
FreeUnit is distributed under the Apache 2.0 License, same as the original Unit project.
Forked from nginx/unit — original authors retain full credit.