2019

Unit 1.14.0 Released

Hi,

I’m glad to announce a new release of NGINX Unit.

Besides improving the request routing abilities, this release simplifies operations concerning the Go module. Now it can also be installed with the go get command:

$ go get unit.nginx.org/go

Mind, however, that it requires the unit-dev/unit-devel package.

Great effort went into improving the efficiency and avoiding memory bloat in cases where an application generates gigabytes of response body. Now Unit can deal with that without much hassle. We will continue improving the performance and increasing efficiency, as this is one of our primary priorities.

Changes with Unit 1.14.0                                         26 Dec 2019

    *) Change: the Go package import name changed to "unit.nginx.org/go".

    *) Change: Go package now links to libunit instead of including library
       sources.

    *) Feature: ability to change user and group for isolated applications
       when Unit daemon runs as an unprivileged user.

    *) Feature: request routing by source and destination addresses and
       ports.

    *) Bugfix: memory bloat on large responses.

We also updated our Docker images and switched them from Debian 9 to 10 as the base, so the language module versions have been updated respectively: https://docs.nginx.com/nginx-unit/installation/#docker-images

Python 3.6 module packages were added to CentOS and RHEL 7 repositories, and Python 3.7 package was added to Amazon Linux 2 LTS. Please note that the name of Python 2.7 package in these repositories was changed from unit-python to unit-python27.

The Go package now has the same name unit-go across all our repositories and depends on unit-dev.

This is the last release of 2019, so I’ll use this opportunity to wish a Happy New Year to our strong community. Thank you for your requests, bug reports, ideas, and suggestions. Everything that we do, we primarily do for you, our users.

This year, we made 8 releases, with 427 commits to the repository, where 65242 lines were added and 8219 removed. The biggest features of the year are:

  • Support for Java Servlet Containers, which means that now Unit supports 7 languages

  • Advanced internal request routing that allows to filter requests by various parameters, including: URI, header fields, arguments, cookies, addresses, and ports

  • Built-in WebSocket server offloading for Node.js and Java

  • Isolation of application processes

  • Serving of static files

  • Reverse proxying

These features establish a firm basis for further development of Unit as a general-purpose web server that is able to perform absolutely any task related to handling and processing web protocols in the most efficient way. This is our ultimate goal, and we are eager to achieve it over the coming years.

I’d like to thank everyone who worked hard with me on Unit through the year:

  • Andrei Belov - system engineer, who maintained repositories and prepared packages

  • Andrei Zeliankou - QA engineer, who wrote functional tests and ran fuzzing

  • Artem Konev - technical writer, who wrote documentation and blog posts, improved the website, and sometimes helped us to arrange words in sentences the right way

  • Axel Duch - junior developer, who improved request routing

  • Igor Sysoev - senior developer and architect, who worked on request routing, proxying, and many internal aspects

  • Konstantin Pavlov - system engineer, who prepared Docker images and packages

  • Maxim Romanov - senior developer, who worked on Java, WebSockets, and internal IPC

  • Tiago Natel de Moura - senior developer, who worked on isolation features

Thank you guys, I’m happy to work with you.


Unit 1.13.0 Released

Hi,

I’m glad to announce a new release of NGINX Unit.

This release expands Unit’s functionality as a generic web server by introducing basic HTTP reverse proxying.

See the details in our documentation: https://docs.nginx.com/nginx-unit/configuration/#proxying

Compared to mature proxy servers and load balancers, Unit’s proxy features are limited now, but we’ll continue the advance.

Also, this release improves the user experience for Python and Ruby modules and remediates compatibility issues with existing applications in these languages.

Our long-term goal is to turn Unit into the ultimate high-performance building block that will be helpful and easy to use with web services of any kind. To accomplish this, Unit’s future releases will focus on the following aspects:

  • security, isolation, and DoS protection
  • ability to run various types of dynamic applications
  • connectivity with load balancing and fault tolerance
  • efficient serving of static media assets
  • statistics and monitoring
Changes with Unit 1.13.0                                         14 Nov 2019

   *) Feature: basic support for HTTP reverse proxying.

   *) Feature: compatibility with Python 3.8.

   *) Bugfix: memory leak in Python application processes when the close
      handler was used.

   *) Bugfix: threads in Python applications might not work correctly.

   *) Bugfix: Ruby on Rails applications might not work on Ruby 2.6.

   *) Bugfix: backtraces for uncaught exceptions in Python 3 might be
      logged with significant delays.

   *) Bugfix: explicit setting a namespaces isolation option to false might
      have enabled it.

Please feel free to share your experiences and ideas on GitHub: https://github.com/nginx/unit/issues

Or via Unit mailing list: https://mailman.nginx.org/mailman/listinfo/unit


Unit 1.12.0 Released

Hi,

I’m glad to announce a new release of NGINX Unit.

This is an ad-hoc release that focuses on fixing several annoying bugs and adds compatibility with the upcoming PHP 7.4, scheduled for release on November 28, 2019.

Changes with Unit 1.12.0                                         03 Oct 2019

    *) Feature: compatibility with PHP 7.4.

    *) Bugfix: descriptors leak on process creation; the bug had appeared in
       1.11.0.

    *) Bugfix: TLS connection might be closed prematurely while sending
       response.

    *) Bugfix: segmentation fault might have occurred if an irregular file
       was requested.

Regarding our plans for the near future, see our earlier announcement.

To know more about some features introduced recently, you can follow posts about Unit in the official blog: https://www.nginx.com/blog/tag/nginx-unit/

We also updated our Docker images with an initialization script that significantly simplifies the initial configuration of Unit daemon inside a container. Please check the documentation for instructions: https://docs.nginx.com/nginx-unit/installation/#initial-configuration


Unit 1.11.0 Released

Hi,

I’m glad to announce a new release of NGINX Unit.

This release improves the stability of Go applications and introduces three major features:

1. Ability to Serve Static Media Assets

With this feature, we’re only at the beginning of a long road to transform Unit into a full-fledged web server, capable of acting as a building block for web services of any kind.

In this release, the support for static files is very simple; you can only specify the document root directory for Unit to handle:

{
    "share": "/data/www/example.com"
}

Also, you can fine-tune MIME types:

{
    "mime_types": {
        "text/plain": [
            "readme",
            ".c",
            ".h"
        ],

        "application/msword": ".doc"
    }
}

Use encoding to access object members with names that contain “/” characters directly by their URI: GET /config/settings/http/static/mime_types/text%2Fplain/

See the documentation for details: https://docs.nginx.com/nginx-unit/configuration/#static-files

In the upcoming releases, we’ll extend this area of functionality to handle more use cases in the most performant manner.

Unfortunately, basic proxying support did not make it to this release, as tests have revealed that it needs more work. There are excellent chances that the feature will be included in the next release in a month or so.

2. Application Isolation

This capability increases the security of running applications, allowing to run them in isolated environments based on Linux namespaces. This is very similar to how Docker containers work.

The configuration is pretty straightforward: you can customize the isolation level and configure UID/GID mapping between the host and the container:

{
    "namespaces": {
        "credential": true,
        "pid": true,
        "network": true,
        "mount": false,
        "uname": true,
        "cgroup": false
    },

    "uidmap": [
        {
            "container": 1000,
            "host": 812,
            "size": 1
        }
    ],

    "gidmap": [
        {
            "container": 1000,
            "host": 812,
            "size": 1
        }
    ]
}

See the documentation for details: https://docs.nginx.com/nginx-unit/configuration/#process-isolation

This feature was implemented by Tiago de Bem Natel de Moura, who has joined our team recently; he will continue working on security features hardening and container support of Unit.

3. WebSockets in Java Servlet Containers

WebSocket connection offloading was first introduced in the previous release for Node.js only; now it’s extended to JSC as well. We will continue advancing application language support further to provide equally broad opportunities, whichever language you may prefer.

Changes with Unit 1.11.0                                        19 Sep 2019

   *) Feature: basic support for serving static files.

   *) Feature: isolation of application processes with Linux namespaces.

   *) Feature: built-in WebSocket server implementation for Java Servlet
      Containers.

   *) Feature: direct addressing of API configuration options containing
      slashes "/" using URI encoding (%2F).

   *) Bugfix: segmentation fault might have occurred in Go applications
      under high load.

   *) Bugfix: WebSocket support was broken if Unit was built with some
      linkers other than GNU ld (e.g. gold or LLD).

That’s all for this release. Try, test, leave feedback, and stay tuned!


Unit 1.10.0 Released

Hi,

I’m glad to announce a new release of NGINX Unit.

This release includes a number of improvements in various language modules and, finally, basic handling of incoming WebSocket connections, currently only for Node.js. Next in line to obtain WebSocket support is the Java module; it’s almost ready but requires some polishing.

To handle WebSocket connections in your Node.js app via Unit, use the server object from the unit-http module instead of the default one:

var webSocketServer = require('unit-http/websocket').server;

Another interesting and long-awaited feature in this release is the splitting of PATH_INFO in the PHP module. Now, Unit can properly handle requests like /app.php/some/path?some=args, which are often used to implement “user-friendly” URLs in PHP applications.

Changes with Unit 1.10.0                                         22 Aug 2019

    *) Change: matching of cookies in routes made case sensitive.

    *) Change: decreased log level of common errors when clients close
       connections.

    *) Change: removed the Perl module's "--include=" ./configure option.

    *) Feature: built-in WebSocket server implementation for Node.js module.

    *) Feature: splitting PATH_INFO from request URI in PHP module.

    *) Feature: request routing by scheme (HTTP or HTTPS).

    *) Feature: support for multipart requests body in Java module.

    *) Feature: improved API compatibility with Node.js 11.10 or later.

    *) Bugfix: reconfiguration failed if "listeners" or "applications"
       objects were missing.

    *) Bugfix: applying a large configuration might have failed.

Please welcome our new junior developer, Axel Duch. For this release, he implemented scheme matching in request routing; now, he works to further extend the request routing capabilities with source and destination address matching.

In parallel, Tiago Natel de Moura, who also joined the development recently, has achieved significant progress in the effort to add various process isolation features to Unit. You can follow his recent work on Linux namespaces support in the following pull request: https://github.com/nginx/unit/pull/289

See also his email about the feature: https://mailman.nginx.org/pipermail/nginx/2019-August/058321.html

In the meantime, we are about to finish the first round of adding basic support for serving static media assets and proxying in Unit.


Unit 1.9.0 Released

Hi,

I’m glad to announce a new release of NGINX Unit.

In this release, we continue improving routing capabilities for more advanced and precise request matching. Besides that, the control API was extended with POST operations to simplify array manipulation in configuration.

Please check the documentation about new features:

If you prefer to perceive information visually, here’s a recording of NGINX Meetup that gives a good overview of dynamic application routing, although doesn’t discuss new features from this release: https://www.youtube.com/watch?v=5O4TjbbxTxw

Also, a number of annoying bugs were fixed; thanks to your feedback, the Node.js module now works fine with more applications.

Changes with Unit 1.9.0                                          30 May 2019

    *) Feature: request routing by arguments, headers, and cookies.

    *) Feature: route matching patterns allow a wildcard in the middle.

    *) Feature: POST operation for appending elements to arrays in
       configuration.

    *) Feature: support for changing credentials using CAP_SETUID and
       CAP_SETGID capabilities on Linux without running main process as
       privileged user.

    *) Bugfix: memory leak in the router process might have happened when a
       client prematurely closed the connection.

    *) Bugfix: applying a large configuration might have failed.

    *) Bugfix: PUT and DELETE operations on array elements in configuration
       did not work.

    *) Bugfix: request schema in applications did not reflect TLS
       connections.

    *) Bugfix: restored compatibility with Node.js applications that use
       ServerResponse._implicitHeader() function; the bug had appeared in
       1.7.

    *) Bugfix: various compatibility issues with Node.js applications.

With this release, packages for Ubuntu 19.04 “disco” are also available. See the website for a full list of available repositories: https://docs.nginx.com/nginx-unit/installation/

Meanwhile, we continue working on WebSocket support. It’s almost ready and has great chances to be included in the next release for Node.js and Java modules.

Work on proxying and static files serving is also in progress; this will take a bit more time.


Unit 1.8.0 Released

Hi,

I’m glad to announce a new release of NGINX Unit. This release contains two big features that we have been working on diligently during the last months.

Some of you wonder why listener sockets are separated from applications in Unit configuration API. That was done intentionally to introduce advanced routing between sockets and applications in the future, and this future is finally happening.

Now you will be able to specify quite handy rules that will direct your requests to a particular application depending on various parameters.

Please take a glance at the routing documentation: https://docs.nginx.com/nginx-unit/configuration/#routes

Currently, it only supports internal routing by Host, URI, and method request parameters. In the following releases, available options are going to be expanded to allow matching arbitrary headers, arguments, cookies, source and destination addresses. We will also add regular expression patterns.

In future releases, these routing abilities will be handy for issuing redirects and changing configuration on a per route basis.

As usual with Unit, all routing changes are fully dynamic and gracefully done through its control API.

The second feature is even bigger. We’ve merged the code that Maxim Romanov developed in a separate branch last year to support running applications leveraging certain technology described in the Java(tm) Servlet 3.1 (JSR-340) specification. This module is a BETA release as the module is untested and presumed incompatible with the JSR-340 specification.

Now everybody can easily install it from our packages, try it with their Java applications, and leave us feedback. If you’re a Jira user, please use this HowTo: https://docs.nginx.com/nginx-unit/howto/jira/

More documentation is available in Installation and Configuration sections.

We intend to use our open-development process to refine and improve the software and to eventually test and certify the software’s compatibility with the JSR-340 specification. Unless and until the software has been tested and certified, you should not deploy the software in support of deploying or providing Java Servlet 3.1 applications. You should instead deploy production applications on pre-built binaries that have been tested and certified to meet the JSR-340 compatibility requirements such as certified binaries published for the JSR-340 reference implementation available at https://javaee.github.io/glassfish/.

Note:
Java is a registered trademark of Oracle and/or its affiliates.
Changes with Unit 1.8.0                                          01 Mar 2019

    *) Change: now three numbers are always used for versioning: major,
       minor, and patch versions.

    *) Change: now QUERY_STRING is always defined even if the request does
       not include the query component.

    *) Feature: basic internal request routing by Host, URI, and method.

    *) Feature: experimental support for Java Servlet Containers.

    *) Bugfix: segmentation fault might have occurred in the router process.

    *) Bugfix: various potential memory leaks.

    *) Bugfix: TLS connections might have stalled.

    *) Bugfix: some Perl applications might have failed to send the response
       body.

    *) Bugfix: some compilers with specific flags might have produced
       non-functioning builds; the bug had appeared in 1.5.

    *) Bugfix: Node.js package had wrong version number when installed from
       sources.

Our versioning scheme is actually always supposed to have the third version number, but the “.0” patch version was hidden. In order to avoid any possible confusion, it was decided to always show “.0” in version numbers.

For those who are interested in running Unit on CentOS, Fedora, and RHEL with latest versions of PHP, the corresponding packages are now available in Remi’s RPM repository: https://docs.nginx.com/nginx-unit/installation/#community-remisrpm

Many kudos to Remi Collet for collaboration.

Note also that our technical writer Artem Konev has recently added more HowTos to the site about configuring various applications, including WordPress, Flask, and Django-based ones: https://docs.nginx.com/nginx-unit/howto/

He will continue discovering and writing instructions for other applications. If you’re interested in some specific use cases and applications, please don’t hesitate to leave a feature request on the documentation GitHub: https://github.com/nginx/unit-docs/issues

In the following releases, we will continue improving routing capabilities and support for Java applications. Among other big features we’re working on are WebSockets support and serving static media assets.

Stay tuned, give feedback, and help us to create the best software ever.


Unit 1.7.1 Released

Hi,

This is a bugfix release of NGINX Unit that eliminates a security flaw. All versions of Unit from 0.3 to 1.7 are affected.

Everybody is strongly advised to update to a new version.

Changes with Unit 1.7.1                                          07 Feb 2019

    *) Security: a heap memory buffer overflow might have been caused in the
       router process by a specially crafted request, potentially resulting
       in a segmentation fault or other unspecified behavior
       (CVE-2019-7401).

    *) Bugfix: install of Go module failed without prior building of Unit
       daemon; the bug had appeared in 1.7.

Release of Unit 1.8 with support for internal request routing and an experimental Java module is planned for end of February.


Last modified February 11, 2025