FreeUnit Docker images for PHP 7.1–7.4 – a migration bridge to PHP 8.x (Nginx Unit-based) https://freeunit.org
  • C 59.3%
  • Python 19.4%
  • Java 9.7%
  • Rust 5.4%
  • Shell 2.7%
  • Other 3.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Andy Postnikov 4fef769dd8 test: name the descriptor kinds a leak assert found
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
2026-10-11 03:10:32 +02:00
.github ci: keep the old-style tag list next to the variant list 2026-10-11 01:24:06 +02:00
auto build: set _FILE_OFFSET_BITS=64 for each source file on Linux 2026-10-11 01:24:55 +02:00
docs libunit: free the waiting read buffers of a context 2026-10-11 00:57:03 +02:00
fuzzing ci(fuzz): run the three new targets in CI 2026-09-27 19:49:02 +02:00
go socket: refuse a port message whose control data was truncated 2026-09-09 03:31:26 +02:00
pkg ci: run the runner strict and openssl4 jobs nightly 2026-10-10 05:14:59 +02:00
scripts feat(scripts): add unfreeze-sync.sh and unfreeze-labels.sh 2026-05-01 10:24:09 +03:00
src build: set _FILE_OFFSET_BITS=64 for each source file on Linux 2026-10-11 01:24:55 +02:00
test test: name the descriptor kinds a leak assert found 2026-10-11 03:10:32 +02:00
tools ci: check the layout of the shared-memory structs 2026-10-10 16:53:53 +02:00
.editorconfig .editorconfig: fix bracket balance of editorconfig file 2024-11-12 09:50:02 -08:00
.gitattributes do not exclude unit-openapi.yaml from releases 2025-10-06 17:31:10 +01:00
.gitignore feat(otel)!: upgrade opentelemetry crates 0.24 → 0.32 2026-05-30 12:48:22 +03:00
.mailmap .mailmap: Add entry for Dave McAllister 2025-09-03 21:06:15 +01:00
.rustfmt.toml Add a .rustfmt.toml file 2024-02-21 16:20:32 +00:00
CHANGES build: set _FILE_OFFSET_BITS=64 for each source file on Linux 2026-10-11 01:24:55 +02:00
CODE_OF_CONDUCT.md feat(pkg): rebrand RPM packaging and add EOL/community docs 2026-04-28 02:26:01 +03:00
configure build: add --hardening and the checked/span helpers 2026-09-27 01:05:42 +02:00
CONTRIBUTING.md ci: add the ast-grep baseline and require-tests gates 2026-10-10 02:35:59 +02:00
EOL.md ci: run the runner strict and openssl4 jobs nightly 2026-10-10 05:14:59 +02:00
LICENSE Added LICENSE and NOTICE files. 2017-09-06 18:26:37 +03:00
NOTICE Update copyright notice 2025-01-14 04:17:34 +00:00
README.md docker: add Go 1.27, Perl 5.44 and Java 27, and upgrade base packages 2026-10-04 19:47:23 +02:00
RELEASE-PROCESS.md tools: add bump-version.sh to set the release version 2026-10-08 16:05:51 +02:00
SECURITY.md chore(security): supported-versions matrix for 1.37.0 2026-10-08 16:05:51 +02:00
TODO.md ci: build OpenSSL 3.5 LTS in place of 3.6 2026-10-08 17:11:18 +02:00
UNFREEZE.md feat(scripts): add unfreeze-sync.sh and unfreeze-labels.sh 2026-05-01 10:24:09 +03:00
version release: prepare 1.37.0 2026-10-04 20:55:30 +03:00

FreeUnit — Community LTS fork of Unit

Project Status: Active – The project has reached a stable, usable state and is being actively developed. Build & Test Docker GitHub Discussions

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

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.