unit/docs/changes.xml

3584 lines
74 KiB
XML
Raw Normal View History

2017-10-19 14:48:58 +00:00
<?xml version="1.0" ?>
<!DOCTYPE change_log SYSTEM "changes.dtd" >
<change_log title="unit">
2022-12-16 12:42:53 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8 unit-python3.9 unit-python3.10 unit-python3.11
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11 unit-jsc13
unit-jsc14 unit-jsc15 unit-jsc16 unit-jsc17 unit-jsc18
unit-jsc19"
ver="1.30.0" rev="1"
date="" time=""
packager="Nginx Packaging &lt;nginx-packaging@f5.com&gt;">
<change>
<para>
NGINX Unit updated to 1.30.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.30.0" rev="1"
date="" time=""
packager="Nginx Packaging &lt;nginx-packaging@f5.com&gt;">
</changes>
2022-09-19 10:59:59 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8 unit-python3.9 unit-python3.10 unit-python3.11
2022-09-19 10:59:59 +00:00
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11 unit-jsc13
unit-jsc14 unit-jsc15 unit-jsc16 unit-jsc17 unit-jsc18
unit-jsc19"
2022-09-19 10:59:59 +00:00
ver="1.29.0" rev="1"
2022-12-15 12:32:46 +00:00
date="2022-12-15" time="18:00:00 +0300"
2022-09-19 10:59:59 +00:00
packager="Nginx Packaging &lt;nginx-packaging@f5.com&gt;">
<change>
<para>
NGINX Unit updated to 1.29.0.
</para>
</change>
</changes>
<changes apply="unit-jsc19" ver="1.29.0" rev="1"
date="2022-11-18" time="15:00:00 +0400"
packager="Nginx Packaging &lt;nginx-packaging@f5.com&gt;">
<change>
<para>
Initial release of Java 19 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-python3.11" ver="1.29.0" rev="1"
date="2022-12-15" time="08:00:00 -0800"
packager="Nginx Packaging &lt;nginx-packaging@f5.com&gt;">
<change>
<para>
Initial release of Python 3.11 module for NGINX Unit.
</para>
</change>
</changes>
2022-09-19 10:59:59 +00:00
<changes apply="unit" ver="1.29.0" rev="1"
2022-12-15 12:32:46 +00:00
date="2022-12-15" time="18:00:00 +0300"
2022-09-19 10:59:59 +00:00
packager="Nginx Packaging &lt;nginx-packaging@f5.com&gt;">
<change type="change">
<para>
removed $uri auto-append for "share" when loading configuration.
</para>
</change>
<change type="change">
<para>
prefer system crypto policy instead of hardcoding a default.
</para>
</change>
Isolation: wired up cgroup support to the config system. This hooks the cgroup support up to the config system so it can actually be used. To make use of this in unit a new "cgroup" section has been added to the isolation configuration. e.g "applications": { "python": { "type": "python", "processes": 5, "path": "/opt/unit/unit-cgroup-test/", "module": "app", "isolation": { "cgroup": { "path": "app/python" } } } } Now there are two ways to specify the path, relative, like the above (without a leading '/') and absolute (with a leading '/'). In the above case the "python" application is placed into its own cgroup under CGROUP_ROOT/<main unit process cgroup>/app/python. Whereas if you specified say "path": "/unit/app/python" Then the python application would be placed under CGROUP_ROOT/unit/app/python The first option allows you to easily take advantage of any resource limits that have already been configured for unit. With the second method (absolute pathname) if you know of an already existing cgroup where you'd like to place it, you can, e.g "path": "/system.slice/unit/python" Where system.slice has already been created by systemd and may already have some overall system limits applied which would also apply to unit. Limits apply down the hierarchy and lower groups can't exceed the previous group limits. So what does this actually look like? Lets take the unit-calculator application[0] and have each of its applications placed into their own cgroup. If we give each application a new section like "isolation": { "cgroup": { "path": "/unit/unit-calculator/add" } } changing the path for each one, we can visualise the result with the systemd-cgls command, e.g │ └─session-5.scope (#4561) │ ├─ 6667 sshd: andrew [priv] │ ├─ 6684 sshd: andrew@pts/0 │ ├─ 6685 -bash │ ├─ 12632 unit: main v1.28.0 [/opt/unit/sbin/unitd --control 127.0.0.1:808> │ ├─ 12634 unit: controller │ ├─ 12635 unit: router │ ├─ 13550 systemd-cgls │ └─ 13551 less ├─unit (#4759) │ └─unit-calculator (#5037) │ ├─subtract (#5069) │ │ ├─ 12650 unit: "subtract" prototype │ │ └─ 12651 unit: "subtract" application │ ├─multiply (#5085) │ │ ├─ 12653 unit: "multiply" prototype │ │ └─ 12654 unit: "multiply" application │ ├─divide (#5101) │ │ ├─ 12671 unit: "divide" prototype │ │ └─ 12672 node divide.js │ ├─sqroot (#5117) │ │ ├─ 12679 unit: "sqroot" prototype │ │ └─ 12680 /home/andrew/src/unit-calculator/sqroot/sqroot │ └─add (#5053) │ ├─ 12648 unit: "add" prototype │ └─ 12649 unit: "add" application We used an absolute path so the cgroups will be created relative to the main cgroupfs mount, e.g /sys/fs/cgroup We can see that the main unit processes are in the same cgroup as the shell from where they were started, by default child process are placed into the same cgroup as the parent. Then we can see that each application has been placed into its own cgroup under /sys/fs/cgroup Taking another example of a simple 5 process python application, with "isolation": { "cgroup": { "path": "app/python" } } Here we have specified a relative path and thus the python application will be placed below the existing cgroup that contains the main unit process. E.g │ │ │ ├─app-glib-cinnamon\x2dcustom\x2dlauncher\x2d3-43951.scope (#90951) │ │ │ │ ├─ 988 unit: main v1.28.0 [/opt/unit/sbin/unitd --no-daemon] │ │ │ │ ├─ 990 unit: controller │ │ │ │ ├─ 991 unit: router │ │ │ │ ├─ 43951 xterm -bg rgb:20/20/20 -fg white -fa DejaVu Sans Mono │ │ │ │ ├─ 43956 bash │ │ │ │ ├─ 58828 sudo -i │ │ │ │ ├─ 58831 -bash │ │ │ │ └─app (#107351) │ │ │ │ └─python (#107367) │ │ │ │ ├─ 992 unit: "python" prototype │ │ │ │ ├─ 993 unit: "python" application │ │ │ │ ├─ 994 unit: "python" application │ │ │ │ ├─ 995 unit: "python" application │ │ │ │ ├─ 996 unit: "python" application │ │ │ │ └─ 997 unit: "python" application [0]: <https://github.com/lcrilly/unit-calculator> Reviewed-by: Alejandro Colomar <alx@nginx.com> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2022-10-24 16:14:06 +00:00
<change type="feature">
<para>
njs support with the basic syntax of JS template literals.
Isolation: wired up cgroup support to the config system. This hooks the cgroup support up to the config system so it can actually be used. To make use of this in unit a new "cgroup" section has been added to the isolation configuration. e.g "applications": { "python": { "type": "python", "processes": 5, "path": "/opt/unit/unit-cgroup-test/", "module": "app", "isolation": { "cgroup": { "path": "app/python" } } } } Now there are two ways to specify the path, relative, like the above (without a leading '/') and absolute (with a leading '/'). In the above case the "python" application is placed into its own cgroup under CGROUP_ROOT/<main unit process cgroup>/app/python. Whereas if you specified say "path": "/unit/app/python" Then the python application would be placed under CGROUP_ROOT/unit/app/python The first option allows you to easily take advantage of any resource limits that have already been configured for unit. With the second method (absolute pathname) if you know of an already existing cgroup where you'd like to place it, you can, e.g "path": "/system.slice/unit/python" Where system.slice has already been created by systemd and may already have some overall system limits applied which would also apply to unit. Limits apply down the hierarchy and lower groups can't exceed the previous group limits. So what does this actually look like? Lets take the unit-calculator application[0] and have each of its applications placed into their own cgroup. If we give each application a new section like "isolation": { "cgroup": { "path": "/unit/unit-calculator/add" } } changing the path for each one, we can visualise the result with the systemd-cgls command, e.g │ └─session-5.scope (#4561) │ ├─ 6667 sshd: andrew [priv] │ ├─ 6684 sshd: andrew@pts/0 │ ├─ 6685 -bash │ ├─ 12632 unit: main v1.28.0 [/opt/unit/sbin/unitd --control 127.0.0.1:808> │ ├─ 12634 unit: controller │ ├─ 12635 unit: router │ ├─ 13550 systemd-cgls │ └─ 13551 less ├─unit (#4759) │ └─unit-calculator (#5037) │ ├─subtract (#5069) │ │ ├─ 12650 unit: "subtract" prototype │ │ └─ 12651 unit: "subtract" application │ ├─multiply (#5085) │ │ ├─ 12653 unit: "multiply" prototype │ │ └─ 12654 unit: "multiply" application │ ├─divide (#5101) │ │ ├─ 12671 unit: "divide" prototype │ │ └─ 12672 node divide.js │ ├─sqroot (#5117) │ │ ├─ 12679 unit: "sqroot" prototype │ │ └─ 12680 /home/andrew/src/unit-calculator/sqroot/sqroot │ └─add (#5053) │ ├─ 12648 unit: "add" prototype │ └─ 12649 unit: "add" application We used an absolute path so the cgroups will be created relative to the main cgroupfs mount, e.g /sys/fs/cgroup We can see that the main unit processes are in the same cgroup as the shell from where they were started, by default child process are placed into the same cgroup as the parent. Then we can see that each application has been placed into its own cgroup under /sys/fs/cgroup Taking another example of a simple 5 process python application, with "isolation": { "cgroup": { "path": "app/python" } } Here we have specified a relative path and thus the python application will be placed below the existing cgroup that contains the main unit process. E.g │ │ │ ├─app-glib-cinnamon\x2dcustom\x2dlauncher\x2d3-43951.scope (#90951) │ │ │ │ ├─ 988 unit: main v1.28.0 [/opt/unit/sbin/unitd --no-daemon] │ │ │ │ ├─ 990 unit: controller │ │ │ │ ├─ 991 unit: router │ │ │ │ ├─ 43951 xterm -bg rgb:20/20/20 -fg white -fa DejaVu Sans Mono │ │ │ │ ├─ 43956 bash │ │ │ │ ├─ 58828 sudo -i │ │ │ │ ├─ 58831 -bash │ │ │ │ └─app (#107351) │ │ │ │ └─python (#107367) │ │ │ │ ├─ 992 unit: "python" prototype │ │ │ │ ├─ 993 unit: "python" application │ │ │ │ ├─ 994 unit: "python" application │ │ │ │ ├─ 995 unit: "python" application │ │ │ │ ├─ 996 unit: "python" application │ │ │ │ └─ 997 unit: "python" application [0]: <https://github.com/lcrilly/unit-calculator> Reviewed-by: Alejandro Colomar <alx@nginx.com> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2022-10-24 16:14:06 +00:00
</para>
</change>
Python: Added support for Python 3.11. Python 3.8 added a new Python initialisation configuration API[0]. Python 3.11 marked the old API as deprecated resulting in the following compiler warnings which we treat as errors, failing the build src/python/nxt_python.c: In function ‘nxt_python_start’: src/python/nxt_python.c:130:13: error: ‘Py_SetProgramName’ is deprecated [-Werror=deprecated-declarations] 130 | Py_SetProgramName(nxt_py_home); | ^~~~~~~~~~~~~~~~~ In file included from /opt/python-3.11/include/python3.11/Python.h:94, from src/python/nxt_python.c:7: /opt/python-3.11/include/python3.11/pylifecycle.h:37:38: note: declared here 37 | Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetProgramName(const wchar_t *); | ^~~~~~~~~~~~~~~~~ src/python/nxt_python.c:134:13: error: ‘Py_SetPythonHome’ is deprecated [-Werror=deprecated-declarations] 134 | Py_SetPythonHome(nxt_py_home); | ^~~~~~~~~~~~~~~~ /opt/python-3.11/include/python3.11/pylifecycle.h:40:38: note: declared here 40 | Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetPythonHome(const wchar_t *); | ^~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors We actually have a few config scenarios: Python < 3, Python >= 3.0 < 3.8 and for Python 3 we have two configs where we select one based on virtual environment setup. Factor out the Python 3 config initialisation into its own function. We actually create two functions, one for Python 3.8+ and one for older Python 3. We pick the right function to use at build time. The new API also has error checking (where the old API doesn't) which we handle. [0]: https://peps.python.org/pep-0587/ Closes: <https://github.com/nginx/unit/issues/710> [ Andrew: Expanded upon patch from @sandeep-gh ] Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2022-11-17 21:56:58 +00:00
<change type="feature">
<para>
support per-application cgroups on Linux.
Python: Added support for Python 3.11. Python 3.8 added a new Python initialisation configuration API[0]. Python 3.11 marked the old API as deprecated resulting in the following compiler warnings which we treat as errors, failing the build src/python/nxt_python.c: In function ‘nxt_python_start’: src/python/nxt_python.c:130:13: error: ‘Py_SetProgramName’ is deprecated [-Werror=deprecated-declarations] 130 | Py_SetProgramName(nxt_py_home); | ^~~~~~~~~~~~~~~~~ In file included from /opt/python-3.11/include/python3.11/Python.h:94, from src/python/nxt_python.c:7: /opt/python-3.11/include/python3.11/pylifecycle.h:37:38: note: declared here 37 | Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetProgramName(const wchar_t *); | ^~~~~~~~~~~~~~~~~ src/python/nxt_python.c:134:13: error: ‘Py_SetPythonHome’ is deprecated [-Werror=deprecated-declarations] 134 | Py_SetPythonHome(nxt_py_home); | ^~~~~~~~~~~~~~~~ /opt/python-3.11/include/python3.11/pylifecycle.h:40:38: note: declared here 40 | Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetPythonHome(const wchar_t *); | ^~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors We actually have a few config scenarios: Python < 3, Python >= 3.0 < 3.8 and for Python 3 we have two configs where we select one based on virtual environment setup. Factor out the Python 3 config initialisation into its own function. We actually create two functions, one for Python 3.8+ and one for older Python 3. We pick the right function to use at build time. The new API also has error checking (where the old API doesn't) which we handle. [0]: https://peps.python.org/pep-0587/ Closes: <https://github.com/nginx/unit/issues/710> [ Andrew: Expanded upon patch from @sandeep-gh ] Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2022-11-17 21:56:58 +00:00
</para>
</change>
2022-11-20 15:16:51 +00:00
<change type="feature">
<para>
the $request_time variable contains the request processing time.
2022-11-20 15:16:51 +00:00
</para>
</change>
<change type="feature">
<para>
"prefix" option in Python applications to set WSGI "SCRIPT_NAME"
and ASGI root-path variables.
</para>
</change>
<change type="feature">
<para>
compatibility with Python 3.11.
</para>
</change>
<change type="feature">
<para>
compatibility with OpenSSL 3.
</para>
</change>
<change type="feature">
<para>
compatibility with PHP 8.2.
</para>
</change>
2022-10-12 00:21:02 +00:00
<change type="feature">
<para>
compatibility with Node.js 19.0.
2022-10-12 00:21:02 +00:00
</para>
</change>
<change type="feature">
<para>
Ruby Rack v3 support.
</para>
</change>
<change type="bugfix">
<para>
fix error in connection statistics when using proxy.
</para>
</change>
<change type="bugfix">
<para>
fix HTTP cookie parsing when the value contains an equals sign.
</para>
</change>
<change type="bugfix">
<para>
PHP directory URLs without a trailing '/' would give a 503 error (fixed with
a 301 re-direct).
</para>
</change>
PHP: allowed to specify URLs without a trailing '/'. Both @lucatacconi & @mwoodpatrick reported what appears to be the same issue on GitHub. Namely that when using the PHP language module and trying to access a URL that is a directory but without specifying the trailing '/', they were getting a '503 Service Unavailable' error. Note: This is when _not_ using the 'script' option. E.g with the following config { "listeners": { "[::1]:8080": { "pass": "applications/php" } }, "applications": { "php": { "type": "php", "root": "/var/tmp/unit-php" } } } and with a directory path of /var/tmp/unit-php/foo containing an index.php, you would see the following $ curl http://localhost/foo <title>Error 503</title> Error 503 However $ curl http://localhost/foo/ would work and serve up the index.php This commit fixes the above so you get the desired behaviour without specifying the trailing '/' by doing the following 1] If the URL doesn't end in .php and doesn't have a trailing '/' then check if the requested path is a directory. 2) If it is a directory then create a 301 re-direct pointing to it. This matches the behaviour of the likes of nginx, Apache and lighttpd. This also matches the behaviour of the "share" action in Unit. This doesn't effect the behaviour of the 'script' option which bypasses the nxt_php_dynamic_request() function. This also adds a couple of tests to test/test_php_application.py to ensure this continues to work. Closes: <https://github.com/nginx/unit/issues/717> Closes: <https://github.com/nginx/unit/issues/753> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2022-09-16 13:38:53 +00:00
<change type="bugfix">
<para>
missing error checks in the C API.
</para>
</change>
<change type="bugfix">
<para>
report the regex status in configure summary.
PHP: allowed to specify URLs without a trailing '/'. Both @lucatacconi & @mwoodpatrick reported what appears to be the same issue on GitHub. Namely that when using the PHP language module and trying to access a URL that is a directory but without specifying the trailing '/', they were getting a '503 Service Unavailable' error. Note: This is when _not_ using the 'script' option. E.g with the following config { "listeners": { "[::1]:8080": { "pass": "applications/php" } }, "applications": { "php": { "type": "php", "root": "/var/tmp/unit-php" } } } and with a directory path of /var/tmp/unit-php/foo containing an index.php, you would see the following $ curl http://localhost/foo <title>Error 503</title> Error 503 However $ curl http://localhost/foo/ would work and serve up the index.php This commit fixes the above so you get the desired behaviour without specifying the trailing '/' by doing the following 1] If the URL doesn't end in .php and doesn't have a trailing '/' then check if the requested path is a directory. 2) If it is a directory then create a 301 re-direct pointing to it. This matches the behaviour of the likes of nginx, Apache and lighttpd. This also matches the behaviour of the "share" action in Unit. This doesn't effect the behaviour of the 'script' option which bypasses the nxt_php_dynamic_request() function. This also adds a couple of tests to test/test_php_application.py to ensure this continues to work. Closes: <https://github.com/nginx/unit/issues/717> Closes: <https://github.com/nginx/unit/issues/753> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2022-09-16 13:38:53 +00:00
</para>
</change>
2022-09-19 10:59:59 +00:00
</changes>
2022-06-17 08:46:30 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8 unit-python3.9 unit-python3.10
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11 unit-jsc13
unit-jsc14 unit-jsc15 unit-jsc16 unit-jsc17 unit-jsc18"
ver="1.28.0" rev="1"
2022-09-13 08:27:13 +00:00
date="2022-09-13" time="18:00:00 +0300"
packager="Nginx Packaging &lt;nginx-packaging@f5.com&gt;">
2022-06-17 08:46:30 +00:00
<change>
<para>
NGINX Unit updated to 1.28.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.28.0" rev="1"
2022-09-13 08:27:13 +00:00
date="2022-09-13" time="18:00:00 +0300"
packager="Nginx Packaging &lt;nginx-packaging@f5.com&gt;">
2022-06-17 08:46:30 +00:00
<change type="change">
<para>
increased the applications' startup timeout.
</para>
</change>
<change type="change">
<para>
disallowed abstract Unix domain socket syntax in non-Linux systems.
</para>
</change>
Fixed support for abstract Unix sockets. Unix domain sockets are normally backed by files in the filesystem. This has historically been problematic when closing and opening again such sockets, since SO_REUSEADDR is ignored for Unix sockets (POSIX left the behavior of SO_REUSEADDR as implementation-defined, and most --if not all-- implementations decided to just ignore this flag). Many solutions are available for this problem, but all of them have important caveats: - unlink(2) the file when it's not needed anymore. This is not easy, because the process that controls the fd may not be the same process that created the file, and may not have file permissions to remove it. Further solutions can be applied to that caveat: - unlink(2) the file right after creation. This will remove the pathname from the filesystem without closing the socket (it will continue to live until the last fd is closed). This is not useful for us, since we need the pathname of the socket as its interface. - chown(2) or chmod(2) the directory that contains the socket. For removing a file from the filesystem, a process needs write permissions in the containing directory. We could put sockets in dummy directories that can be chown(2)ed to nobody. This could be dangerous, though, as we don't control the socket names. It is our users who configure the socket name in their configuration, and so it's easy that they don't understand the many implications of not chosing an appropriate socket pathname. A user could unknowingly put the socket in a directory that is not supposed to be owned by user nobody, and if we blindly chown(2) or chmod(2) the directory, we could be creating a big security hole. - Ask the main process to remove the socket. This would require a very complex communication mechanism with the main process, which is not impossible, but let's avoid it if there are simpler solutions. - Give the child process the CAP_DAC_OVERRIDE capability. That is one of the most powerful capabilities. A process with that capability can be considered root for most practical aspects. Even if the capability is disabled for most of the lifetime of the process, there's a slight chance that a malicious actor could activate it and then easily do serious damage to the system. - unlink(2) the file right before calling bind(2). This is dangerous because another process (for example, another running instance of unitd(8)), could be using the socket, and removing the pathname from the filesystem would be problematic. To do this correctly, a lot of checks should be added before the actual unlink(2), which is error-prone, and difficult to do correctly, and atomically. - Use abstract-namespace Unix domain sockets. This is the simplest solution, as it only requires accepting a slightly different syntax (basically a @ prefix) for the socket name, to transform it into a string starting with a null byte ('\0') that the kernel can understand. The patch is minimal. Since abstract sockets live in an abstract namespace, they don't create files in the filesystem, so there's no need to remove them later. The kernel removes the name when the last fd to it has been closed. One caveat is that only Linux currently supports this kind of Unix sockets. Of course, a solution to that could be to ask other kernels to implement such a feature. Another caveat is that filesystem permissions can't be used to control access to the socket file (since, of course, there's no file). Anyone knowing the socket name can access to it. The only method to control access to it is by using network_namespaces(7). Since in unitd(8) we're using 0666 file sockets, abstract sockets should be no more insecure than that (anyone can already read/write to the listener sockets). - Ask the kernel to implement a simpler way to unlink(2) socket files when they are not needed anymore. I've suggested that to the <linux-fsdevel@vger.kernel.org> mailing list, in: <lore.kernel.org/linux-fsdevel/0bc5f919-bcfd-8fd0-a16b-9f060088158a@gmail.com/T> In this commit, I decided to go for the easiest/simplest solution, which is abstract sockets. In fact, we already had partial support. This commit only fixes some small bug in the existing code so that abstract Unix sockets work: - Don't chmod(2) the socket if it's an abstract one. This fixes the creation of abstract sockets, but doesn't make them usable, since we produce them with a trailing '\0' in their name. That will be fixed in the following commit. This closes #669 issue on GitHub.
2022-07-28 14:10:32 +00:00
<change type="feature">
<para>
basic statistics API.
Fixed support for abstract Unix sockets. Unix domain sockets are normally backed by files in the filesystem. This has historically been problematic when closing and opening again such sockets, since SO_REUSEADDR is ignored for Unix sockets (POSIX left the behavior of SO_REUSEADDR as implementation-defined, and most --if not all-- implementations decided to just ignore this flag). Many solutions are available for this problem, but all of them have important caveats: - unlink(2) the file when it's not needed anymore. This is not easy, because the process that controls the fd may not be the same process that created the file, and may not have file permissions to remove it. Further solutions can be applied to that caveat: - unlink(2) the file right after creation. This will remove the pathname from the filesystem without closing the socket (it will continue to live until the last fd is closed). This is not useful for us, since we need the pathname of the socket as its interface. - chown(2) or chmod(2) the directory that contains the socket. For removing a file from the filesystem, a process needs write permissions in the containing directory. We could put sockets in dummy directories that can be chown(2)ed to nobody. This could be dangerous, though, as we don't control the socket names. It is our users who configure the socket name in their configuration, and so it's easy that they don't understand the many implications of not chosing an appropriate socket pathname. A user could unknowingly put the socket in a directory that is not supposed to be owned by user nobody, and if we blindly chown(2) or chmod(2) the directory, we could be creating a big security hole. - Ask the main process to remove the socket. This would require a very complex communication mechanism with the main process, which is not impossible, but let's avoid it if there are simpler solutions. - Give the child process the CAP_DAC_OVERRIDE capability. That is one of the most powerful capabilities. A process with that capability can be considered root for most practical aspects. Even if the capability is disabled for most of the lifetime of the process, there's a slight chance that a malicious actor could activate it and then easily do serious damage to the system. - unlink(2) the file right before calling bind(2). This is dangerous because another process (for example, another running instance of unitd(8)), could be using the socket, and removing the pathname from the filesystem would be problematic. To do this correctly, a lot of checks should be added before the actual unlink(2), which is error-prone, and difficult to do correctly, and atomically. - Use abstract-namespace Unix domain sockets. This is the simplest solution, as it only requires accepting a slightly different syntax (basically a @ prefix) for the socket name, to transform it into a string starting with a null byte ('\0') that the kernel can understand. The patch is minimal. Since abstract sockets live in an abstract namespace, they don't create files in the filesystem, so there's no need to remove them later. The kernel removes the name when the last fd to it has been closed. One caveat is that only Linux currently supports this kind of Unix sockets. Of course, a solution to that could be to ask other kernels to implement such a feature. Another caveat is that filesystem permissions can't be used to control access to the socket file (since, of course, there's no file). Anyone knowing the socket name can access to it. The only method to control access to it is by using network_namespaces(7). Since in unitd(8) we're using 0666 file sockets, abstract sockets should be no more insecure than that (anyone can already read/write to the listener sockets). - Ask the kernel to implement a simpler way to unlink(2) socket files when they are not needed anymore. I've suggested that to the <linux-fsdevel@vger.kernel.org> mailing list, in: <lore.kernel.org/linux-fsdevel/0bc5f919-bcfd-8fd0-a16b-9f060088158a@gmail.com/T> In this commit, I decided to go for the easiest/simplest solution, which is abstract sockets. In fact, we already had partial support. This commit only fixes some small bug in the existing code so that abstract Unix sockets work: - Don't chmod(2) the socket if it's an abstract one. This fixes the creation of abstract sockets, but doesn't make them usable, since we produce them with a trailing '\0' in their name. That will be fixed in the following commit. This closes #669 issue on GitHub.
2022-07-28 14:10:32 +00:00
</para>
</change>
<change type="feature">
<para>
customizable access log format.
</para>
</change>
2022-06-20 05:22:13 +00:00
<change type="feature">
<para>
more HTTP variables support.
2022-06-20 05:22:13 +00:00
</para>
</change>
<change type="feature">
<para>
forwarded header to replace client address and protocol.
</para>
</change>
<change type="feature">
<para>
ability to get dynamic variables.
</para>
</change>
<change type="feature">
<para>
support for abstract Unix sockets.
</para>
</change>
2022-07-28 03:05:04 +00:00
<change type="feature">
<para>
support for Unix sockets in address matching.
2022-07-28 03:05:04 +00:00
</para>
</change>
2022-08-29 06:27:09 +00:00
<change type="feature">
<para>
the $dollar variable translates to a literal "$" during variable substitution.
2022-08-29 06:27:09 +00:00
</para>
</change>
<change type="bugfix">
<para>
2022-09-05 22:55:15 +00:00
router process could crash if index file didn't contain an extension.
</para>
</change>
<change type="bugfix">
<para>
force SCRIPT_NAME in Ruby to always be an empty string.
</para>
</change>
<change type="bugfix">
<para>
when isolated PID numbers reach the prototype process host PID,
the prototype crashed.
</para>
</change>
<change type="bugfix">
<para>
the Ruby application process could crash on SIGTERM.
</para>
</change>
<change type="bugfix">
<para>
the Ruby application process could crash on SIGINT.
</para>
</change>
<change type="bugfix">
<para>
mutex leak in the C API.
</para>
</change>
2022-06-17 08:46:30 +00:00
</changes>
2021-11-22 04:23:07 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8 unit-python3.9 unit-python3.10
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11 unit-jsc13
unit-jsc14 unit-jsc15 unit-jsc16 unit-jsc17 unit-jsc18"
ver="1.27.0" rev="1"
date="2022-06-02" time="18:00:00 +0300"
2021-11-22 04:23:07 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.27.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.27.0" rev="1"
date="2022-06-02" time="18:00:00 +0300"
2021-11-22 04:23:07 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
2022-06-01 13:54:13 +00:00
<change type="feature">
<para>
2022-06-01 13:54:13 +00:00
ability to specify a custom index file name when serving static files.
</para>
</change>
2022-06-01 13:54:13 +00:00
<change type="feature">
<para>
2022-06-01 13:54:13 +00:00
variables support in the "location" option of the "return" action.
</para>
</change>
<change type="feature">
<para>
2022-06-01 13:54:13 +00:00
support empty strings in the "location" option of the "return" action.
</para>
</change>
Supporting variables in "location". ............ Description: ............ Before this commit, the encoded URI could be calculated at configuration time. Now, since variables can only be resolved at request time, we have different situations: - "location" contains no variables: In this case, we still encode the URI in the conf structure, at configuration time, and then we just copy the resulting string to the ctx structure at request time. - "location" contains variables: In this case, we compile the var string at configure time, then when we resolve it at request time, and then we encode the string. In both cases, as was being done before, if the string is empty, either before or after resolving variables, we skip the encoding. ........... Usefulness: ........... An example of why this feature may be useful is redirecting HTTP to HTTPS with something like: "action": { "return": 301, "location": "https://${host}${uri}" } ..... Bugs: ..... This feature conflicts with the relevant RFCs in the following: '$' is used for Unit variables, but '$' is a reserved character in a URI, to be used as a sub-delimiter. However, it's almost never used as that, and in fact, other parts of Unit already conflict with '$' being a reserved character for use as a sub-delimiter, so this is at least consistent in that sense. VBart suggested an easy workaround if we ever need it: adding a variable '$sign' which resolves to a literal '$'. ...... Notes: ...... An empty string is handled as if "location" wasn't specified at all, so no Location header is sent. This is incorrect, and the code is slightly misleading. The Location header consists of a URI-reference[1], which might be a relative one, which itself might consist of an empty string[2]. [1]: <https://www.rfc-editor.org/rfc/rfc7231#section-7.1.2> [2]: <https://stackoverflow.com/a/43338457> Now that we have variables, it's more likely that an empty Location header will be requested, and we should handle it correctly. I think in a future commit we should modify the code to allow differentiating between an unset "location" and an empty one, which should be treated as any other "location" string. ................. Testing (manual): ................. { "listeners": { "*:80": { "pass": "routes/str" }, "*:81": { "pass": "routes/empty" }, "*:82": { "pass": "routes/var" }, "*:83": { "pass": "routes/enc-str" }, "*:84": { "pass": "routes/enc-var" } }, "routes": { "str": [ { "action": { "return": 301, "location": "foo" } } ], "empty": [ { "action": { "return": 301, "location": "" } } ], "var": [ { "action": { "return": 301, "location": "$host" } } ], "enc-str": [ { "action": { "return": 301, "location": "f%23o#o" } } ], "enc-var": [ { "action": { "return": 301, "location": "f%23o${host}#o" } } ] } } $ curl --dump-header - localhost:80 HTTP/1.1 301 Moved Permanently Location: foo Server: Unit/1.27.0 Date: Thu, 07 Apr 2022 23:30:06 GMT Content-Length: 0 $ curl --dump-header - localhost:81 HTTP/1.1 301 Moved Permanently Server: Unit/1.27.0 Date: Thu, 07 Apr 2022 23:30:08 GMT Content-Length: 0 $ curl --dump-header - localhost:82 HTTP/1.1 301 Moved Permanently Location: localhost Server: Unit/1.27.0 Date: Thu, 07 Apr 2022 23:30:15 GMT Content-Length: 0 $ curl --dump-header - -H "Host: bar" localhost:82 HTTP/1.1 301 Moved Permanently Location: bar Server: Unit/1.27.0 Date: Thu, 07 Apr 2022 23:30:23 GMT Content-Length: 0 $ curl --dump-header - -H "Host: " localhost:82 HTTP/1.1 301 Moved Permanently Server: Unit/1.27.0 Date: Thu, 07 Apr 2022 23:30:29 GMT Content-Length: 0 $ curl --dump-header - localhost:83 HTTP/1.1 301 Moved Permanently Location: f%23o#o Server: Unit/1.27.0 Date: Sat, 09 Apr 2022 11:22:23 GMT Content-Length: 0 $ curl --dump-header - -H "Host: " localhost:84 HTTP/1.1 301 Moved Permanently Location: f%23o#o Server: Unit/1.27.0 Date: Sat, 09 Apr 2022 11:22:44 GMT Content-Length: 0 $ curl --dump-header - -H "Host: alx" localhost:84 HTTP/1.1 301 Moved Permanently Location: f%23oalx#o Server: Unit/1.27.0 Date: Sat, 09 Apr 2022 11:22:52 GMT Content-Length: 0 $ curl --dump-header - -H "Host: a#l%23x" localhost:84 HTTP/1.1 301 Moved Permanently Location: f%2523oa#l%2523x%23o Server: Unit/1.27.0 Date: Sat, 09 Apr 2022 11:23:09 GMT Content-Length: 0 $ curl --dump-header - -H "Host: b##ar" localhost:82 HTTP/1.1 301 Moved Permanently Location: b#%23ar Server: Unit/1.27.0 Date: Sat, 09 Apr 2022 11:25:01 GMT Content-Length: 0
2022-04-05 09:47:56 +00:00
<change type="feature">
<para>
2022-06-01 13:54:13 +00:00
added a new variable, $request_uri, that includes both the path and the query
parts as per RFC 3986, sections 3-4.
Supporting variables in "location". ............ Description: ............ Before this commit, the encoded URI could be calculated at configuration time. Now, since variables can only be resolved at request time, we have different situations: - "location" contains no variables: In this case, we still encode the URI in the conf structure, at configuration time, and then we just copy the resulting string to the ctx structure at request time. - "location" contains variables: In this case, we compile the var string at configure time, then when we resolve it at request time, and then we encode the string. In both cases, as was being done before, if the string is empty, either before or after resolving variables, we skip the encoding. ........... Usefulness: ........... An example of why this feature may be useful is redirecting HTTP to HTTPS with something like: "action": { "return": 301, "location": "https://${host}${uri}" } ..... Bugs: ..... This feature conflicts with the relevant RFCs in the following: '$' is used for Unit variables, but '$' is a reserved character in a URI, to be used as a sub-delimiter. However, it's almost never used as that, and in fact, other parts of Unit already conflict with '$' being a reserved character for use as a sub-delimiter, so this is at least consistent in that sense. VBart suggested an easy workaround if we ever need it: adding a variable '$sign' which resolves to a literal '$'. ...... Notes: ...... An empty string is handled as if "location" wasn't specified at all, so no Location header is sent. This is incorrect, and the code is slightly misleading. The Location header consists of a URI-reference[1], which might be a relative one, which itself might consist of an empty string[2]. [1]: <https://www.rfc-editor.org/rfc/rfc7231#section-7.1.2> [2]: <https://stackoverflow.com/a/43338457> Now that we have variables, it's more likely that an empty Location header will be requested, and we should handle it correctly. I think in a future commit we should modify the code to allow differentiating between an unset "location" and an empty one, which should be treated as any other "location" string. ................. Testing (manual): ................. { "listeners": { "*:80": { "pass": "routes/str" }, "*:81": { "pass": "routes/empty" }, "*:82": { "pass": "routes/var" }, "*:83": { "pass": "routes/enc-str" }, "*:84": { "pass": "routes/enc-var" } }, "routes": { "str": [ { "action": { "return": 301, "location": "foo" } } ], "empty": [ { "action": { "return": 301, "location": "" } } ], "var": [ { "action": { "return": 301, "location": "$host" } } ], "enc-str": [ { "action": { "return": 301, "location": "f%23o#o" } } ], "enc-var": [ { "action": { "return": 301, "location": "f%23o${host}#o" } } ] } } $ curl --dump-header - localhost:80 HTTP/1.1 301 Moved Permanently Location: foo Server: Unit/1.27.0 Date: Thu, 07 Apr 2022 23:30:06 GMT Content-Length: 0 $ curl --dump-header - localhost:81 HTTP/1.1 301 Moved Permanently Server: Unit/1.27.0 Date: Thu, 07 Apr 2022 23:30:08 GMT Content-Length: 0 $ curl --dump-header - localhost:82 HTTP/1.1 301 Moved Permanently Location: localhost Server: Unit/1.27.0 Date: Thu, 07 Apr 2022 23:30:15 GMT Content-Length: 0 $ curl --dump-header - -H "Host: bar" localhost:82 HTTP/1.1 301 Moved Permanently Location: bar Server: Unit/1.27.0 Date: Thu, 07 Apr 2022 23:30:23 GMT Content-Length: 0 $ curl --dump-header - -H "Host: " localhost:82 HTTP/1.1 301 Moved Permanently Server: Unit/1.27.0 Date: Thu, 07 Apr 2022 23:30:29 GMT Content-Length: 0 $ curl --dump-header - localhost:83 HTTP/1.1 301 Moved Permanently Location: f%23o#o Server: Unit/1.27.0 Date: Sat, 09 Apr 2022 11:22:23 GMT Content-Length: 0 $ curl --dump-header - -H "Host: " localhost:84 HTTP/1.1 301 Moved Permanently Location: f%23o#o Server: Unit/1.27.0 Date: Sat, 09 Apr 2022 11:22:44 GMT Content-Length: 0 $ curl --dump-header - -H "Host: alx" localhost:84 HTTP/1.1 301 Moved Permanently Location: f%23oalx#o Server: Unit/1.27.0 Date: Sat, 09 Apr 2022 11:22:52 GMT Content-Length: 0 $ curl --dump-header - -H "Host: a#l%23x" localhost:84 HTTP/1.1 301 Moved Permanently Location: f%2523oa#l%2523x%23o Server: Unit/1.27.0 Date: Sat, 09 Apr 2022 11:23:09 GMT Content-Length: 0 $ curl --dump-header - -H "Host: b##ar" localhost:82 HTTP/1.1 301 Moved Permanently Location: b#%23ar Server: Unit/1.27.0 Date: Sat, 09 Apr 2022 11:25:01 GMT Content-Length: 0
2022-04-05 09:47:56 +00:00
</para>
</change>
<change type="feature">
<para>
2022-06-01 13:54:13 +00:00
Ruby Rack environment parameter "SCRIPT_NAME" support.
</para>
</change>
<change type="feature">
<para>
compatibility with GCC 12.
</para>
</change>
<change type="bugfix">
<para>
Ruby Sinatra applications don't work without custom logging.
</para>
</change>
<change type="bugfix">
<para>
2022-06-01 13:54:13 +00:00
the controller process could crash when a chain of more than four
certificates was uploaded.
</para>
</change>
<change type="bugfix">
<para>
some Perl applications failed to process the request body, notably with Plack.
</para>
</change>
<change type="bugfix">
<para>
some Spring Boot applications failed to start, notably with Grails.
</para>
</change>
<change type="bugfix">
<para>
incorrect Python protocol auto detection (ASGI or WSGI) for native callable
object, notably with Falcon.
</para>
</change>
<change type="bugfix">
<para>
ECMAScript modules did not work with the recent Node.js versions.
</para>
</change>
2021-12-03 00:10:15 +00:00
</changes>
2021-12-02 14:16:05 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8 unit-python3.9 unit-python3.10
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11 unit-jsc13
unit-jsc14 unit-jsc15 unit-jsc16 unit-jsc17 unit-jsc18"
ver="1.26.1" rev="1"
2021-12-02 15:22:57 +00:00
date="2021-12-02" time="18:00:00 +0300"
2021-12-02 14:16:05 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
2021-12-02 14:16:05 +00:00
NGINX Unit updated to 1.26.1.
</para>
</change>
2021-12-02 14:16:05 +00:00
</changes>
<changes apply="unit" ver="1.26.1" rev="1"
2021-12-02 15:22:57 +00:00
date="2021-12-02" time="18:00:00 +0300"
2021-12-02 14:16:05 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
2021-11-25 13:58:45 +00:00
<change type="bugfix">
<para>
occasionally, the Unit daemon was unable to fully terminate; the bug had
appeared in 1.26.0.
</para>
</change>
<change type="bugfix">
<para>
a prototype process could crash on an application process exit; the bug had
2021-11-25 13:58:45 +00:00
appeared in 1.26.0.
</para>
</change>
<change type="bugfix">
<para>
the router process crashed on reconfiguration if "access_log" was configured
without listeners.
</para>
</change>
<change type="bugfix">
<para>
a segmentation fault occurred in the PHP module if chdir() or
fastcgi_finish_request() was called in the OPcache preloading script.
</para>
</change>
<change type="bugfix">
<para>
fatal errors on DragonFly BSD; the bug had appeared in 1.26.0.
</para>
</change>
2021-11-22 04:23:07 +00:00
</changes>
<changes apply="unit-jsc18" ver="1.26.0" rev="1"
2021-11-18 12:48:02 +00:00
date="2021-11-18" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Java 18 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-python3.10" ver="1.26.0" rev="1"
2021-11-18 12:48:02 +00:00
date="2021-11-18" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Python 3.10 module for NGINX Unit.
</para>
</change>
</changes>
2021-08-24 11:38:24 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8 unit-python3.9
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11 unit-jsc13
unit-jsc14 unit-jsc15 unit-jsc16 unit-jsc17"
ver="1.26.0" rev="1"
2021-11-18 12:48:02 +00:00
date="2021-11-18" time="18:00:00 +0300"
2021-08-24 11:38:24 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.26.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.26.0" rev="1"
2021-11-18 12:48:02 +00:00
date="2021-11-18" time="18:00:00 +0300"
2021-08-24 11:38:24 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
the "share" option now specifies the entire path to the files it serves,
rather than a document root directory to be prepended to the request URI.
</para>
</change>
<change type="feature">
<para>
automatic adjustment of existing configurations to the new "share" behavior
when updating from previous versions.
</para>
</change>
<change type="feature">
<para>
variables support in the "share" option.
</para>
</change>
<change type="feature">
<para>
multiple paths in the "share" option.
</para>
</change>
<change type="feature">
<para>
variables support in the "chroot" option.
</para>
</change>
<change type="feature">
<para>
PHP opcache is shared between application processes.
</para>
</change>
<change type="feature">
<para>
request routing by the query string.
</para>
</change>
<change type="bugfix">
<para>
the router and app processes could crash when the requests limit was reached
by asynchronous or multithreaded apps.
</para>
</change>
<change type="bugfix">
<para>
established WebSocket connections could stop reading frames from the client
after the corresponding listener had been reconfigured.
</para>
</change>
<change type="bugfix">
<para>
fixed building with glibc 2.34, notably Fedora 35.
</para>
</change>
2021-08-24 11:38:24 +00:00
</changes>
2021-05-28 15:16:23 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8 unit-python3.9
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11 unit-jsc13
unit-jsc14 unit-jsc15 unit-jsc16 unit-jsc17"
ver="1.25.0" rev="1"
2021-08-19 14:48:21 +00:00
date="2021-08-19" time="18:00:00 +0300"
2021-05-28 15:16:23 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.25.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.25.0" rev="1"
2021-08-19 14:48:21 +00:00
date="2021-08-19" time="18:00:00 +0300"
2021-05-28 15:16:23 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
2021-08-17 23:52:32 +00:00
<change type="feature">
<para>
client IP address replacement from a specified HTTP header field.
2021-08-17 23:52:32 +00:00
</para>
</change>
<change type="feature">
<para>
TLS sessions cache.
</para>
</change>
<change type="feature">
<para>
TLS session tickets.
</para>
</change>
<change type="feature">
<para>
application restart control.
</para>
</change>
Router: client IP address replacement. This commit introduces the replacement of the client address based on the value of a specified HTTP header. This is intended for use when Unit is placed behind a reverse proxy like nginx or a CDN. You must specify the source addresses of the trusted proxies. This can be accomplished with any valid IP pattern supported by Unit's match block: ["10.0.0.1", "10.4.0.0/16", "!192.168.1.1"] The feature is configured per listener. The client address replacement functionality only operates when there is a source IP match and the specified header is present. Typically this would be an 'X-Forwarded-For' header. { "listeners": { "127.0.0.1:8080": { "client_ip": { "header": "X-Forwarded-For", "source": [ "10.0.0.0/8" ] }, "pass": "applications/my_app" }, } } If a request occurs and Unit receives a header like below: "X-Forwarded-For: 84.123.23.23" By default, Unit trusts the last rightmost IP in the header, so REMOTE_ADDR will be set to 84.123.23.23 if the connection originated from 10.0.0.0/8. If Unit runs behind consecutive reverse proxies and receives a header similar to the following: "X-Forwarded-For: 84.123.23.23, 10.0.0.254" You will need to enable "recursive" checking, which walks the header from last address to first and chooses the first non-trusted address it finds. { "listeners": { "127.0.0.1:8080": { "client_ip": { "header": "X-Forwarded-For", "source": [ "10.0.0.0/8" ] "recursive": true, }, "pass": "applications/my_app" }, } } If a connection from 10.0.0.0/8 occurs, the chain is walked. Here, 10.0.0.254 is also a trusted address so the client address will be replaced with 84.123.23.23. If all IP addresses in the header are trusted, the client address is set to the first address in the header: If 10.0.0.0/8 is trusted and "X-Forwarded-For: 10.0.0.3, 10.0.0.2, 10.0.0.1", the client address will be replaced with 10.0.0.3.
2021-08-12 08:23:16 +00:00
<change type="feature">
<para>
process and thread lifecycle hooks in Ruby.
Router: client IP address replacement. This commit introduces the replacement of the client address based on the value of a specified HTTP header. This is intended for use when Unit is placed behind a reverse proxy like nginx or a CDN. You must specify the source addresses of the trusted proxies. This can be accomplished with any valid IP pattern supported by Unit's match block: ["10.0.0.1", "10.4.0.0/16", "!192.168.1.1"] The feature is configured per listener. The client address replacement functionality only operates when there is a source IP match and the specified header is present. Typically this would be an 'X-Forwarded-For' header. { "listeners": { "127.0.0.1:8080": { "client_ip": { "header": "X-Forwarded-For", "source": [ "10.0.0.0/8" ] }, "pass": "applications/my_app" }, } } If a request occurs and Unit receives a header like below: "X-Forwarded-For: 84.123.23.23" By default, Unit trusts the last rightmost IP in the header, so REMOTE_ADDR will be set to 84.123.23.23 if the connection originated from 10.0.0.0/8. If Unit runs behind consecutive reverse proxies and receives a header similar to the following: "X-Forwarded-For: 84.123.23.23, 10.0.0.254" You will need to enable "recursive" checking, which walks the header from last address to first and chooses the first non-trusted address it finds. { "listeners": { "127.0.0.1:8080": { "client_ip": { "header": "X-Forwarded-For", "source": [ "10.0.0.0/8" ] "recursive": true, }, "pass": "applications/my_app" }, } } If a connection from 10.0.0.0/8 occurs, the chain is walked. Here, 10.0.0.254 is also a trusted address so the client address will be replaced with 84.123.23.23. If all IP addresses in the header are trusted, the client address is set to the first address in the header: If 10.0.0.0/8 is trusted and "X-Forwarded-For: 10.0.0.3, 10.0.0.2, 10.0.0.1", the client address will be replaced with 10.0.0.3.
2021-08-12 08:23:16 +00:00
</para>
</change>
<change type="bugfix">
<para>
the router process could crash on TLS connection open when multiple listeners
with TLS certificates were configured; the bug had appeared in 1.23.0.
</para>
</change>
<change type="bugfix">
<para>
TLS connections were rejected for configurations with multiple certificate
bundles in a listener if the client did not use SNI.
</para>
</change>
<change type="bugfix">
<para>
2021-08-20 03:56:53 +00:00
the router process could crash with frequent multithreaded application
reconfiguration.
</para>
</change>
<change type="bugfix">
<para>
compatibility issues with some Python ASGI apps, notably based on the Starlette
framework.
</para>
</change>
<change type="bugfix">
<para>
a descriptor and memory leak occurred in the router process when an app process
stopped or crashed.
</para>
</change>
<change type="bugfix">
<para>
the controller or router process could crash if the configuration contained
a full-form IPv6 in a listener address.
</para>
</change>
2021-08-04 10:09:50 +00:00
<change type="bugfix">
<para>
the router process crashed when a request was passed to an empty "routes"
or "upstreams" using a variable "pass" option.
</para>
</change>
<change type="bugfix">
<para>
the router process crashed while matching a request to an empty array of source
or destination address patterns.
</para>
</change>
2021-05-28 15:16:23 +00:00
</changes>
<changes apply="unit-jsc17" ver="1.24.0" rev="1"
2021-05-27 13:06:01 +00:00
date="2021-05-27" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Java 17 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-jsc16" ver="1.24.0" rev="1"
2021-05-27 13:06:01 +00:00
date="2021-05-27" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Java 16 module for NGINX Unit.
</para>
</change>
</changes>
2021-03-26 08:29:41 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8 unit-python3.9
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11 unit-jsc13
unit-jsc14 unit-jsc15"
ver="1.24.0" rev="1"
2021-05-27 13:06:01 +00:00
date="2021-05-27" time="18:00:00 +0300"
2021-03-26 08:29:41 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.24.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.24.0" rev="1"
2021-05-27 13:06:01 +00:00
date="2021-05-27" time="18:00:00 +0300"
2021-03-26 08:29:41 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
2021-05-26 16:48:05 +00:00
<change type="change">
<para>
PHP added to the default MIME type list.
</para>
</change>
<change type="feature">
<para>
arbitrary configuration of TLS connections via OpenSSL commands.
</para>
</change>
2021-05-20 13:02:45 +00:00
<change type="feature">
<para>
the ability to limit static file serving by MIME types.
2021-05-20 13:02:45 +00:00
</para>
</change>
<change type="feature">
<para>
support for chrooting, rejecting symlinks, and rejecting mount
point traversal on a per-request basis when serving static files.
</para>
</change>
2021-05-06 14:22:21 +00:00
<change type="feature">
<para>
a loader for automatically overriding the "http" and "websocket" modules in
Node.js.
2021-05-06 14:22:21 +00:00
</para>
</change>
<change type="feature">
<para>
multiple "targets" in Python applications.
</para>
</change>
<change type="feature">
<para>
compatibility with Ruby 3.0.
</para>
</change>
<change type="bugfix">
<para>
the router process could crash while closing a TLS connection.
</para>
</change>
<change type="bugfix">
<para>
a segmentation fault might have occurred in the PHP module if
fastcgi_finish_request() was used with the "auto_globals_jit" option enabled.
</para>
</change>
2021-03-26 08:29:41 +00:00
</changes>
2021-03-25 14:14:27 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8 unit-python3.9
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11 unit-jsc13
unit-jsc14 unit-jsc15"
ver="1.23.0" rev="1"
date="2021-03-25" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.23.0.
</para>
</change>
</changes>
2021-02-16 15:54:00 +00:00
<changes apply="unit" ver="1.23.0" rev="1"
2021-03-25 14:14:27 +00:00
date="2021-03-25" time="18:00:00 +0300"
2021-02-16 15:54:00 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
support for multiple certificate bundles on a listener via the Server Name
Indication (SNI) TLS extension.
</para>
</change>
<change type="feature">
<para>
"--mandir" ./configure option to specify the directory for man page
installation.
</para>
</change>
<change type="bugfix">
<para>
the router process could crash on premature TLS connection close; the bug had
appeared in 1.17.0.
</para>
</change>
<change type="bugfix">
<para>
a connection leak occurred on premature TLS connection close; the bug had
appeared in 1.6.
</para>
</change>
<change type="bugfix">
<para>
a descriptor and memory leak occurred in the router process when processing
small WebSocket frames from a client; the bug had appeared in 1.19.0.
</para>
</change>
<change type="bugfix">
<para>
a descriptor leak occurred in the router process when removing or
reconfiguring an application; the bug had appeared in 1.19.0.
</para>
</change>
2021-02-16 15:54:00 +00:00
<change type="bugfix">
<para>
persistent storage of certificates might've not worked with some filesystems in
Linux, and all uploaded certificate bundles were forgotten after restart.
</para>
</change>
<change type="bugfix">
<para>
the controller process could crash while requesting information about a
certificate with a non-DNS SAN entry.
</para>
</change>
<change type="bugfix">
<para>
the controller process could crash on manipulations with a certificate
containing a SAN and no standard name attributes in subject or issuer.
</para>
</change>
<change type="bugfix">
<para>
the Ruby module didn't respect the user locale for defaults in the Encoding
class.
</para>
</change>
<change type="bugfix">
<para>
the PHP 5 module failed to build with thread safety enabled; the bug had
appeared in 1.22.0.
</para>
</change>
2021-02-16 15:54:00 +00:00
</changes>
<changes apply="unit-python3.9" ver="1.22.0" rev="1"
date="2021-02-04" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Python 3.9 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11 unit-jsc13
unit-jsc14 unit-jsc15"
ver="1.22.0" rev="1"
2021-02-04 15:22:33 +00:00
date="2021-02-04" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.22.0.
</para>
</change>
</changes>
2020-11-24 13:40:28 +00:00
<changes apply="unit" ver="1.22.0" rev="1"
2021-02-04 15:22:33 +00:00
date="2021-02-04" time="18:00:00 +0300"
2020-11-24 13:40:28 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
the ServerRequest and ServerResponse objects of Node.js module are now
compliant with Stream API.
</para>
</change>
<change type="feature">
<para>
support for specifying multiple directories in the "path" option of Python
apps.
</para>
</change>
<change type="bugfix">
<para>
a memory leak occurred in the router process when serving files larger than
128K; the bug had appeared in 1.13.0.
</para>
</change>
<change type="bugfix">
<para>
apps could stop processing new requests under high load; the bug had
appeared in 1.19.0.
</para>
</change>
<change type="bugfix">
<para>
app processes could terminate unexpectedly under high load; the bug had
appeared in 1.19.0.
</para>
</change>
2020-12-15 13:01:44 +00:00
<change type="bugfix">
<para>
invalid HTTP responses were generated for some unusual status codes.
2020-12-15 13:01:44 +00:00
</para>
</change>
<change type="bugfix">
<para>
the PHP_AUTH_USER, PHP_AUTH_PW, and PHP_AUTH_DIGEST server variables were
missing in the PHP module.
</para>
</change>
<change type="bugfix">
<para>
the router process could crash with multithreaded apps under high load.
</para>
</change>
<change type="bugfix">
<para>
Ruby apps with multithreading configured could crash on start under load.
</para>
</change>
<change type="bugfix">
<para>
mount points weren't unmounted when the "mount" namespace isolation was used;
the bug had appeared in 1.21.0.
</para>
</change>
<change type="bugfix">
<para>
the router process could crash while removing or reconfiguring an app that used
WebSocket.
</para>
</change>
<change type="bugfix">
<para>
a memory leak occurring in the router process when removing or reconfiguring
an application; the bug had appeared in 1.19.0.
</para>
</change>
2020-11-24 13:40:28 +00:00
</changes>
2020-11-19 16:59:18 +00:00
<changes apply="unit-jsc15" ver="1.21.0" rev="1"
date="2020-11-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Java 15 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-jsc14" ver="1.21.0" rev="1"
date="2020-11-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Java 14 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-jsc13" ver="1.21.0" rev="1"
date="2020-11-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Java 13 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.21.0" rev="1"
date="2020-11-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.21.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.21.0" rev="1"
date="2020-11-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
procfs is mounted by default for all languages when "rootfs" isolation is used.
</para>
</change>
<change type="change">
<para>
any characters valid according to RFC 7230 are now allowed in HTTP header field
names.
</para>
</change>
<change type="change">
<para>
HTTP header fields with underscores ("_") are now discarded from requests by
default.
</para>
</change>
<change type="feature">
<para>
optional multithreaded request processing for Java, Python, Perl, and Ruby apps.
</para>
</change>
<change type="feature">
<para>
regular expressions in route matching patterns.
</para>
</change>
<change type="feature">
<para>
compatibility with Python 3.9.
</para>
</change>
<change type="feature">
<para>
the Python module now supports ASGI 2.0 legacy applications.
</para>
</change>
<change type="feature">
<para>
the "protocol" option in Python applications aids choice between ASGI and WSGI.
</para>
</change>
<change type="feature">
<para>
the fastcgi_finish_request() PHP function that finalizes request processing and
continues code execution without holding onto the client connection.
</para>
</change>
<change type="feature">
<para>
the "discard_unsafe_fields" HTTP option that enables discarding request header
fields with irregular (but still valid) characters in the field name.
</para>
</change>
<change type="feature">
<para>
the "procfs" and "tmpfs" automount isolation options to disable automatic
mounting of eponymous filesystems.
</para>
</change>
<change type="bugfix">
<para>
the router process could crash when running Go applications under high load;
the bug had appeared in 1.19.0.
</para>
</change>
<change type="bugfix">
<para>
some language dependencies could remain mounted after using "rootfs" isolation.
</para>
</change>
<change type="bugfix">
<para>
various compatibility issues in Java applications.
</para>
</change>
<change type="bugfix">
<para>
the Java module built with the musl C library couldn't run applications that
use "rootfs" isolation.
</para>
</change>
</changes>
2020-10-08 15:32:36 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.20.0" rev="1"
date="2020-10-08" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.20.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.20.0" rev="1"
date="2020-10-08" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
the PHP module is now initialized before chrooting; this enables loading all
extensions from the host system.
</para>
</change>
<change type="change">
<para>
AVIF and APNG image formats added to the default MIME type list.
</para>
</change>
<change type="change">
<para>
functional tests migrated to the pytest framework.
</para>
</change>
2020-10-08 15:32:36 +00:00
<change type="feature">
<para>
the Python module now fully supports applications that use the ASGI 3.0 server
interface.
</para>
</change>
<change type="feature">
<para>
the Python module now has a built-in WebSocket server implementation for
applications, compatible with the HTTP &amp; WebSocket ASGI Message Format 2.1
specification.
</para>
</change>
<change type="feature">
<para>
automatic mounting of an isolated "/tmp" file system into chrooted application
environments.
</para>
</change>
<change type="feature">
<para>
the $host variable contains a normalized "Host" request value.
</para>
</change>
<change type="feature">
<para>
the "callable" option sets Python application callable names.
</para>
</change>
<change type="feature">
<para>
compatibility with PHP 8 RC 1. Thanks to Remi Collet.
</para>
</change>
<change type="feature">
<para>
the "automount" option in the "isolation" object allows to turn off the
automatic mounting of language module dependencies.
</para>
</change>
<change type="bugfix">
<para>
"pass"-ing requests to upstreams from a route was broken; the bug had appeared
in 1.19.0. Thanks to 洪志道 (Hong Zhi Dao) for discovering and fixing it.
</para>
</change>
<change type="bugfix">
<para>
the router process could crash during reconfiguration.
</para>
</change>
<change type="bugfix">
<para>
a memory leak occurring in the router process; the bug had appeared in 1.18.0.
</para>
</change>
<change type="bugfix">
<para>
the "!" (non-empty) pattern was matched incorrectly;
the bug had appeared in 1.19.0.
</para>
</change>
<change type="bugfix">
<para>
fixed building on platforms without sendfile() support, notably NetBSD;
the bug had appeared in 1.16.0.
</para>
</change>
</changes>
2020-08-13 16:22:41 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.19.0" rev="1"
date="2020-08-13" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.19.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.19.0" rev="1"
date="2020-08-13" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
reworked IPC between the router process and the applications to lower latencies,
increase performance, and improve scalability.
</para>
</change>
<change type="feature">
<para>
support for an arbitrary number of wildcards in route matching patterns.
</para>
</change>
<change type="feature">
<para>
chunked transfer encoding in proxy responses.
</para>
</change>
<change type="feature">
<para>
basic variables support in the "pass" option.
</para>
</change>
<change type="feature">
<para>
compatibility with PHP 8 Beta 1.
Thanks to Remi Collet.
</para>
</change>
<change type="bugfix">
<para>
the router process could crash while passing requests to an application under
high load.
</para>
</change>
<change type="bugfix">
<para>
a number of language modules failed to build on some systems;
the bug had appeared in 1.18.0.
</para>
</change>
<change type="bugfix">
<para>
time in error log messages from PHP applications could lag.
</para>
</change>
<change type="bugfix">
<para>
reconfiguration requests could hang if an application had failed to start;
the bug had appeared in 1.18.0.
</para>
</change>
<change type="bugfix">
<para>
memory leak during reconfiguration.
</para>
</change>
<change type="bugfix">
<para>
the daemon didn't start without language modules;
the bug had appeared in 1.18.0.
</para>
</change>
<change type="bugfix">
<para>
the router process could crash at exit.
</para>
</change>
<change type="bugfix">
<para>
Node.js applications could crash at exit.
</para>
</change>
<change type="bugfix">
<para>
the Ruby module could be linked against a wrong library version.
</para>
</change>
</changes>
2020-05-28 14:34:06 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.18.0" rev="1"
date="2020-05-28" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.18.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.18.0" rev="1"
date="2020-05-28" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
the "rootfs" isolation option for changing root filesystem for an application.
</para>
</change>
<change type="feature">
<para>
multiple "targets" in PHP applications.
</para>
</change>
<change type="feature">
<para>
support for percent-encoding in the "uri" and "arguments" matching options
and in the "pass" option.
</para>
</change>
</changes>
2020-04-16 14:49:09 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.17.0" rev="1"
date="2020-04-16" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.17.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.17.0" rev="1"
date="2020-04-16" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
a "return" action with optional "location" for immediate responses and external
redirection.
</para>
</change>
<change type="feature">
<para>
fractional weights support for upstream servers.
</para>
</change>
<change type="bugfix">
<para>
accidental 502 "Bad Gateway" errors might have occurred in applications under
high load.
</para>
</change>
<change type="bugfix">
<para>
memory leak in the router; the bug had appeared in 1.13.0.
</para>
</change>
<change type="bugfix">
<para>
segmentation fault might have occurred in the router process when reaching
open connections limit.
</para>
</change>
<change type="bugfix">
<para>
"close() failed (9: Bad file descriptor)" alerts might have appeared in the log
while processing large request bodies; the bug had appeared in 1.16.0.
</para>
</change>
<change type="bugfix">
<para>
existing application processes didn't reopen the log file.
</para>
</change>
<change type="bugfix">
<para>
incompatibility with some Node.js applications.
</para>
</change>
<change type="bugfix">
<para>
broken build on DragonFly BSD; the bug had appeared in 1.16.0.
</para>
</change>
</changes>
2020-03-12 15:13:07 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.16.0" rev="1"
date="2020-03-12" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.16.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.16.0" rev="1"
date="2020-03-12" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
basic load-balancing support with round-robin.
</para>
</change>
<change type="feature">
<para>
a "fallback" option that performs an alternative action if a request can't be
served from the "share" directory.
</para>
</change>
<change type="feature">
<para>
reduced memory consumption by dumping large request bodies to disk.
</para>
</change>
<change type="feature">
<para>
stripping UTF-8 BOM and JavaScript-style comments from uploaded JSON.
</para>
</change>
<change type="bugfix">
<para>
negative address matching in router might work improperly in combination with
non-negative patterns.
</para>
</change>
<change type="bugfix">
<para>
Java Spring applications failed to run; the bug had appeared in 1.10.0.
</para>
</change>
<change type="bugfix">
<para>
PHP 7.4 was broken if it was built with thread safety enabled.
</para>
</change>
<change type="bugfix">
<para>
compatibility issues with some Python applications.
</para>
</change>
</changes>
2020-02-06 14:33:44 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.15.0" rev="1"
date="2020-02-06" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.15.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.15.0" rev="1"
date="2020-02-06" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
extensions of dynamically requested PHP scripts were restricted to ".php".
</para>
</change>
<change type="feature">
<para>
compatibility with Ruby 2.7.
</para>
</change>
<change type="bugfix">
<para>
segmentation fault might have occurred in the router process with multiple
application processes under load; the bug had appeared in 1.14.0.
</para>
</change>
<change type="bugfix">
<para>
receiving request body over TLS connection might have stalled.
</para>
</change>
</changes>
2019-12-26 14:03:21 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-python3.8
unit-go
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.14.0" rev="1"
date="2019-12-26" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.14.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.14.0" rev="1"
date="2019-12-26" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
the Go package import name changed to "unit.nginx.org/go".
</para>
</change>
<change type="change">
<para>
Go package now links to libunit instead of including library sources.
</para>
</change>
<change type="feature">
<para>
ability to change user and group for isolated applications when Unit daemon
runs as an unprivileged user.
</para>
</change>
<change type="feature">
<para>
request routing by source and destination addresses and ports.
</para>
</change>
<change type="bugfix">
<para>
memory bloat on large responses.
</para>
</change>
</changes>
<changes apply="unit-go1.13" ver="1.13.0" rev="1"
date="2019-11-20" time="09:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Go 1.13 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-go1.12" ver="1.13.0" rev="1"
date="2019-11-20" time="09:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Go 1.12 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-python3.8" ver="1.13.0" rev="1"
date="2019-11-18" time="14:20:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Python 3.8 module for NGINX Unit.
</para>
</change>
</changes>
2019-11-14 16:23:38 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10 unit-go1.11
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.13.0" rev="1"
date="2019-11-14" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.13.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.13.0" rev="1"
date="2019-11-14" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
basic support for HTTP reverse proxying.
</para>
</change>
<change type="feature">
<para>
compatibility with Python 3.8.
</para>
</change>
<change type="bugfix">
<para>
memory leak in Python application processes when the close handler was used.
</para>
</change>
<change type="bugfix">
<para>
threads in Python applications might not work correctly.
</para>
</change>
<change type="bugfix">
<para>
Ruby on Rails applications might not work on Ruby 2.6.
</para>
</change>
<change type="bugfix">
<para>
backtraces for uncaught exceptions in Python 3 might be logged with significant
delays.
</para>
</change>
<change type="bugfix">
<para>
explicit setting a namespaces isolation option to false might have enabled it.
</para>
</change>
</changes>
2019-10-03 13:30:31 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10 unit-go1.11
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.12.0" rev="1"
date="2019-10-03" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.12.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.12.0" rev="1"
date="2019-10-03" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
compatibility with PHP 7.4.
</para>
</change>
<change type="bugfix">
<para>
descriptors leak on process creation; the bug had appeared in 1.11.0.
</para>
</change>
<change type="bugfix">
<para>
TLS connection might be closed prematurely while sending response.
</para>
</change>
<change type="bugfix">
<para>
segmentation fault might have occurred if an irregular file was requested.
</para>
</change>
</changes>
2019-09-19 14:28:55 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10 unit-go1.11
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.11.0" rev="1"
date="2019-09-19" time="18:00:00 +0300"
packager="Konstantin Pavlov &lt;thresh@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.11.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.11.0" rev="1"
date="2019-09-19" time="18:00:00 +0300"
packager="Konstantin Pavlov &lt;thresh@nginx.com&gt;">
<change type="feature">
<para>
basic support for serving static files.
</para>
</change>
<change type="feature">
<para>
isolation of application processes with Linux namespaces.
</para>
</change>
<change type="feature">
<para>
built-in WebSocket server implementation for Java Servlet Containers.
</para>
</change>
<change type="feature">
<para>
direct addressing of API configuration options containing slashes "/"
using URI encoding (%2F).
</para>
</change>
<change type="bugfix">
<para>
segmentation fault might have occurred in Go applications under high load.
</para>
</change>
<change type="bugfix">
<para>
WebSocket support was broken if Unit was built with some linkers other than
GNU ld (e.g. gold or LLD).
</para>
</change>
</changes>
<changes apply="unit
unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10 unit-go1.11
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.10.0" rev="2"
date="2019-08-23" time="12:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="bugfix">
<para>
missed header files added to unit development package.
</para>
</change>
</changes>
2019-08-22 15:43:02 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10 unit-go1.11
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.10.0" rev="1"
date="2019-08-22" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.10.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.10.0" rev="1"
date="2019-08-22" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
matching of cookies in routes made case sensitive.
</para>
</change>
<change type="change">
<para>
decreased log level of common errors when clients close connections.
</para>
</change>
<change type="change">
<para>
removed the Perl module's "--include=" ./configure option.
</para>
</change>
<change type="feature">
<para>
built-in WebSocket server implementation for Node.js module.
</para>
</change>
<change type="feature">
<para>
splitting PATH_INFO from request URI in PHP module.
</para>
</change>
<change type="feature">
<para>
request routing by scheme (HTTP or HTTPS).
</para>
</change>
<change type="feature">
<para>
support for multipart requests body in Java module.
</para>
</change>
<change type="feature">
<para>
improved API compatibility with Node.js 11.10 or later.
</para>
</change>
<change type="bugfix">
<para>
reconfiguration failed if "listeners" or "applications" objects were missing.
</para>
</change>
<change type="bugfix">
<para>
applying a large configuration might have failed.
</para>
</change>
</changes>
2019-05-30 14:16:23 +00:00
<changes apply="unit-go1.11" ver="1.9.0" rev="1"
date="2019-05-30" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Go 1.11 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10
unit-perl
unit-ruby
unit-jsc-common unit-jsc8 unit-jsc10 unit-jsc11"
ver="1.9.0" rev="1"
date="2019-05-30" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.9.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.9.0" rev="1"
date="2019-05-30" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
request routing by arguments, headers, and cookies.
</para>
</change>
<change type="feature">
<para>
route matching patterns allow a wildcard in the middle.
</para>
</change>
<change type="feature">
<para>
POST operation for appending elements to arrays in configuration.
</para>
</change>
<change type="feature">
<para>
support for changing credentials using CAP_SETUID and CAP_SETGID capabilities
on Linux without running main process as privileged user.
</para>
</change>
<change type="bugfix">
<para>
memory leak in the router process might have happened when a client
prematurely closed the connection.
</para>
</change>
<change type="bugfix">
<para>
applying a large configuration might have failed.
</para>
</change>
<change type="bugfix">
<para>
PUT and DELETE operations on array elements in configuration did not work.
</para>
</change>
<change type="bugfix">
<para>
request schema in applications did not reflect TLS connections.
</para>
</change>
<change type="bugfix">
<para>
restored compatibility with Node.js applications that use
ServerResponse._implicitHeader() function; the bug had appeared in 1.7.
</para>
</change>
<change type="bugfix">
<para>
various compatibility issues with Node.js applications.
</para>
</change>
</changes>
2019-03-01 15:23:38 +00:00
<changes apply="unit-jsc-common" ver="1.8.0" rev="1"
date="2019-03-01" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Java common packages for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-jsc8" ver="1.8.0" rev="1"
date="2019-03-01" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Java 8 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-jsc10" ver="1.8.0" rev="1"
date="2019-03-01" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Java 10 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-jsc11" ver="1.8.0" rev="1"
date="2019-03-01" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Java 11 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10
unit-perl
unit-ruby"
ver="1.8.0" rev="1"
date="2019-03-01" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.8.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.8.0" rev="1"
date="2019-03-01" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
now three numbers are always used for versioning: major, minor,
and patch versions.
</para>
</change>
<change type="change">
<para>
now QUERY_STRING is always defined even if the request does not include
the query component.
</para>
</change>
<change type="feature">
<para>
basic internal request routing by Host, URI, and method.
</para>
</change>
<change type="feature">
<para>
experimental support for Java Servlet Containers.
</para>
</change>
<change type="bugfix">
<para>
segmentation fault might have occurred in the router process.
</para>
</change>
<change type="bugfix">
<para>
various potential memory leaks.
</para>
</change>
<change type="bugfix">
<para>
TLS connections might have stalled.
</para>
</change>
<change type="bugfix">
<para>
some Perl applications might have failed to send the response body.
</para>
</change>
<change type="bugfix">
<para>
some compilers with specific flags might have produced non-functioning builds;
the bug had appeared in 1.5.
</para>
</change>
<change type="bugfix">
<para>
Node.js package had wrong version number when installed from sources.
</para>
</change>
</changes>
2019-02-07 14:46:46 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6 unit-python3.7
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10
unit-perl
unit-ruby"
ver="1.7.1" rev="1"
date="2019-02-07" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.7.1.
</para>
</change>
</changes>
<changes apply="unit" ver="1.7.1" rev="1"
date="2019-02-07" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="security">
<para>
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).
</para>
</change>
<change type="bugfix">
<para>
install of Go module failed without prior building of Unit daemon;
the bug had appeared in 1.7.
</para>
</change>
</changes>
<changes apply="unit-python3.7" ver="1.7" rev="1"
date="2018-12-25" time="10:30:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Python 3.7 module for NGINX Unit.
</para>
</change>
</changes>
2018-12-20 16:17:08 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10
unit-perl
unit-ruby"
ver="1.7" rev="1"
date="2018-12-20" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.7.
</para>
</change>
</changes>
<changes apply="unit" ver="1.7" rev="1"
date="2018-12-20" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
now rpath is set in Ruby module only if the library was not found in default
search paths; this allows to meet packaging restrictions on some systems.
</para>
</change>
<change type="bugfix">
<para>
"disable_functions" and "disable_classes" PHP options set via Control API
did not work.
</para>
</change>
<change type="bugfix">
<para>
Promises on request data in Node.js were not triggered.
</para>
</change>
<change type="bugfix">
<para>
various compatibility issues with Node.js applications.
</para>
</change>
<change type="bugfix">
<para>
a segmentation fault occurred in Node.js module if application tried to read
request body after request.end() was called.
</para>
</change>
<change type="bugfix">
<para>
a segmentation fault occurred in Node.js module if application attempted to
send header twice.
</para>
</change>
<change type="bugfix">
<para>
names of response header fields in Node.js module were erroneously treated as
case-sensitive.
</para>
</change>
<change type="bugfix">
<para>
uncatched exceptions in Node.js were not logged.
</para>
</change>
<change type="bugfix">
<para>
global install of Node.js module from sources was broken on some systems;
the bug had appeared in 1.6.
</para>
</change>
<change type="bugfix">
<para>
traceback for exceptions during initialization of Python applications might not
be logged.
</para>
</change>
<change type="bugfix">
<para>
PHP module build failed if PHP interpreter was built with thread safety
enabled.
</para>
</change>
</changes>
2018-11-15 12:56:09 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10
unit-perl
unit-ruby"
ver="1.6" rev="1"
date="2018-11-15" time="18:00:00 +0300"
packager="Konstantin Pavlov &lt;thresh@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.6.
</para>
</change>
</changes>
<changes apply="unit" ver="1.6" rev="1"
date="2018-11-15" time="18:00:00 +0300"
packager="Konstantin Pavlov &lt;thresh@nginx.com&gt;">
<change type="change">
<para>
"make install" now installs Node.js module as well if it was configured.
</para>
</change>
<change type="feature">
<para>
"--local" ./configure option to install Node.js module locally.
</para>
</change>
<change type="bugfix">
<para>
Node.js module might have crashed due to broken reference counting.
</para>
</change>
<change type="bugfix">
<para>
asynchronous operations in Node.js might not have worked.
</para>
</change>
<change type="bugfix">
<para>
various compatibility issues with Node.js applications.
</para>
</change>
<change type="bugfix">
<para>
"freed pointer is out of pool" alerts might have appeared in log.
</para>
</change>
<change type="bugfix">
<para>
2018-12-20 16:17:08 +00:00
module discovery did not work on 64-bit big-endian systems like IBM/S390x.
2018-11-15 12:56:09 +00:00
</para>
</change>
</changes>
2018-10-25 14:49:10 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10
unit-perl
unit-ruby"
ver="1.5" rev="1"
date="2018-10-25" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.5.
</para>
</change>
</changes>
2018-10-25 14:48:56 +00:00
<changes apply="unit" ver="1.5" rev="1"
date="2018-10-25" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
the "type" of application object for Go was changed to "external".
</para>
</change>
<change type="feature">
<para>
initial version of Node.js package with basic HTTP request-response support.
</para>
</change>
<change type="feature">
<para>
compatibility with LibreSSL.
</para>
</change>
<change type="feature">
<para>
--libdir and --incdir ./configure options to install libunit headers
and static library.
</para>
</change>
<change type="bugfix">
<para>
connection might be closed prematurely while sending response;
the bug had appeared in 1.3.
</para>
</change>
<change type="bugfix">
<para>
application processes might have stopped handling requests, producing
"last message send failed: Resource temporarily unavailable" alerts in log;
the bug had appeared in 1.4.
</para>
</change>
<change type="bugfix">
<para>
2018-12-20 16:17:08 +00:00
Go applications did not work when Unit was built with musl C library.
2018-10-25 14:48:56 +00:00
</para>
</change>
</changes>
2018-09-27 12:05:03 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10
unit-perl
unit-ruby"
ver="1.4" rev="2"
date="2018-09-27" time="13:30:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="bugfix">
<para>
corrected instructions for launching sample application.
</para>
</change>
</changes>
<changes apply="unit" ver="1.4" rev="2"
date="2018-09-27" time="13:30:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
the "saveconfig" and "loadconfig" action scripts were removed.
</para>
</change>
</changes>
2018-09-20 15:18:52 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10
unit-perl
unit-ruby"
ver="1.4" rev="1"
date="2018-09-20" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.4.
</para>
</change>
</changes>
<changes apply="unit" ver="1.4" rev="1"
date="2018-09-20" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
the control API maps the configuration object only at "/config/".
</para>
</change>
<change type="feature">
<para>
TLS support for client connections.
</para>
</change>
<change type="feature">
<para>
TLS certificates storage control API.
</para>
</change>
<change type="feature">
<para>
Unit library (libunit) to streamline language module integration.
</para>
</change>
<change type="feature">
<para>
"408 Request Timeout" responses while closing HTTP keep-alive connections.
</para>
</change>
<change type="feature">
<para>
improvements in OpenBSD support.
Thanks to David Carlier.
</para>
</change>
<change type="bugfix">
<para>
a segmentation fault might have occurred after reconfiguration.
</para>
</change>
<change type="bugfix">
<para>
building on systems with non-default locale might be broken.
</para>
</change>
<change type="bugfix">
<para>
"header_read_timeout" might not work properly.
</para>
</change>
<change type="bugfix">
<para>
header fields values with non-ASCII bytes might be handled incorrectly
in Python 3 module.
</para>
</change>
</changes>
2018-07-13 11:45:08 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10
unit-perl
unit-ruby"
ver="1.3" rev="1"
date="2018-07-13" time="18:00:00 +0300"
packager="Konstantin Pavlov &lt;thresh@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.3.
</para>
</change>
</changes>
<changes apply="unit" ver="1.3" rev="1"
date="2018-07-13" time="18:00:00 +0300"
packager="Konstantin Pavlov &lt;thresh@nginx.com&gt;">
<change type="change">
<para>
UTF-8 characters are now allowed in request header field values.
</para>
</change>
<change type="feature">
<para>
configuration of the request body size limit.
</para>
</change>
<change type="feature">
<para>
configuration of various HTTP connection timeouts.
</para>
</change>
<change type="feature">
<para>
Ruby module now automatically uses Bundler where possible.
</para>
</change>
<change type="feature">
<para>
http.Flusher interface in Go module.
</para>
</change>
<change type="bugfix">
<para>
various issues in HTTP connection errors handling.
</para>
</change>
<change type="bugfix">
<para>
requests with body data might be handled incorrectly in PHP module.
</para>
</change>
<change type="bugfix">
<para>
individual PHP configuration options specified via control API were reset
to previous values after the first request in application process.
</para>
</change>
</changes>
2018-06-07 13:43:37 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9 unit-go1.10
unit-perl
unit-ruby"
ver="1.2" rev="1"
date="2018-06-07" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.2.
</para>
</change>
</changes>
<changes apply="unit" ver="1.2" rev="1"
date="2018-06-07" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
configuration of environment variables for application processes.
</para>
</change>
<change type="feature">
<para>
customization of php.ini path.
</para>
</change>
<change type="feature">
<para>
setting of individual PHP configuration options.
</para>
</change>
<change type="feature">
<para>
configuration of execution arguments for Go applications.
</para>
</change>
<change type="bugfix">
<para>
keep-alive connections might hang after reconfiguration.
</para>
</change>
</changes>
<changes apply="unit-go1.10" ver="1.1" rev="1"
date="2018-05-14" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Go 1.10 module for NGINX Unit.
</para>
</change>
</changes>
2018-04-26 15:30:06 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9
unit-perl
unit-ruby"
ver="1.1" rev="1"
date="2018-04-26" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.1.
</para>
</change>
</changes>
<changes apply="unit" ver="1.1" rev="1"
date="2018-04-26" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="bugfix">
<para>
Python applications that use the write() callable did not work.
</para>
</change>
<change type="bugfix">
<para>
virtual environments created with Python 3.3 or above might not have worked.
</para>
</change>
<change type="bugfix">
<para>
the request.Read() function in Go applications did not produce EOF
when the whole body was read.
</para>
</change>
<change type="bugfix">
<para>
a segmentation fault might have occurred while access log reopening.
</para>
</change>
<change type="bugfix">
<para>
in parsing of IPv6 control socket addresses.
</para>
</change>
<change type="bugfix">
<para>
loading of application modules was broken on OpenBSD.
</para>
</change>
<change type="bugfix">
<para>
a segmentation fault might have occurred when there were two modules
with the same type and version; the bug had appeared in 1.0.
</para>
</change>
<change type="bugfix">
<para>
alerts "freed pointer points to non-freeble page" might have appeared in log
on 32-bit platforms.
</para>
</change>
</changes>
2018-04-12 16:47:33 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9
unit-perl
unit-ruby"
ver="1.0" rev="1"
date="2018-04-12" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 1.0.
</para>
</change>
</changes>
<changes apply="unit" ver="1.0" rev="1"
date="2018-04-12" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
configuration object moved into "/config/" path.
</para>
</change>
<change type="feature">
<para>
basic access logging.
</para>
</change>
<change type="bugfix">
<para>
503 error occurred if Go application did not write response header or body.
</para>
</change>
<change type="bugfix">
<para>
2018-04-26 13:47:55 +00:00
Ruby applications that use encoding conversions might not have worked.
2018-04-12 16:47:33 +00:00
</para>
</change>
<change type="bugfix">
<para>
various stability issues.
</para>
</change>
</changes>
2018-03-22 18:07:06 +00:00
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9
unit-perl"
ver="0.7" rev="1"
date="2018-03-22" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 0.7.
</para>
</change>
</changes>
2018-04-02 12:48:33 +00:00
<changes apply="unit-ruby" ver="0.7" rev="1"
date="2018-04-02" time="15:40:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Ruby module for NGINX Unit.
</para>
</change>
</changes>
2018-03-22 18:07:06 +00:00
<changes apply="unit" ver="0.7" rev="1"
date="2018-03-22" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
Ruby application module.
</para>
</change>
<change type="bugfix">
<para>
in discovering modules.
</para>
</change>
<change type="bugfix">
<para>
various race conditions on reconfiguration and during shutting down.
</para>
</change>
<change type="bugfix">
<para>
tabs and trailing spaces were not allowed in header fields values.
</para>
</change>
<change type="bugfix">
<para>
a segmentation fault occurred in Python module if start_response() was called
outside of WSGI callable.
</para>
</change>
<change type="bugfix">
<para>
2018-04-26 13:47:55 +00:00
a segmentation fault might have occurred in PHP module if there was an error
while initialization.
2018-03-22 18:07:06 +00:00
</para>
</change>
</changes>
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9
unit-perl"
ver="0.6" rev="1"
2018-02-09 16:07:55 +00:00
date="2018-02-09" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 0.6.
</para>
</change>
</changes>
<changes apply="unit" ver="0.6" rev="1"
date="2018-02-09" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="bugfix">
<para>
the main process died when the "type" application option contained version;
the bug had appeared in 0.5.
</para>
</change>
</changes>
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9"
ver="0.5" rev="1"
2018-02-08 15:42:51 +00:00
date="2018-02-08" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 0.5.
</para>
</change>
</changes>
2018-02-07 14:26:37 +00:00
<changes apply="unit-perl" ver="0.5" rev="1"
2018-02-08 15:42:51 +00:00
date="2018-02-08" time="18:00:00 +0300"
2018-02-07 14:26:37 +00:00
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Perl module for NGINX Unit.
</para>
</change>
</changes>
2018-02-08 15:42:51 +00:00
<changes apply="unit" ver="0.5" rev="1"
date="2018-02-08" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
the "workers" application option was removed, the "processes"
application option should be used instead.
</para>
</change>
<change type="feature">
<para>
the "processes" application option with prefork and dynamic
process management support.
</para>
</change>
<change type="feature">
<para>
Perl application module.
</para>
</change>
<change type="bugfix">
<para>
in reading client request body; the bug had appeared in 0.3.
</para>
</change>
<change type="bugfix">
<para>
2018-04-26 13:47:55 +00:00
some Python applications might not have worked due to missing
2018-02-08 15:42:51 +00:00
"wsgi.errors" environ variable.
</para>
</change>
<change type="bugfix">
<para>
HTTP chunked responses might be encoded incorrectly on 32-bit
platforms.
</para>
</change>
<change type="bugfix">
<para>
infinite looping in HTTP parser.
</para>
</change>
<change type="bugfix">
<para>
segmentation fault in router.
</para>
</change>
</changes>
<changes apply="unit-php
unit-python unit-python2.7
unit-python3.4 unit-python3.5 unit-python3.6
unit-go unit-go1.7 unit-go1.8 unit-go1.9"
ver="0.4" rev="1"
2018-01-15 12:05:25 +00:00
date="2018-01-15" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 0.4.
</para>
</change>
</changes>
<changes apply="unit" ver="0.4" rev="1"
date="2018-01-15" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
compatibility with DragonFly BSD.
</para>
</change>
<change type="feature">
<para>
"configure php --lib-static" option.
</para>
</change>
<change type="bugfix">
<para>
HTTP request body was not passed to application;
the bug had appeared in 0.3.
</para>
</change>
<change type="bugfix">
<para>
HTTP large header buffers allocation and deallocation fixed;
the bug had appeared in 0.3.
</para>
</change>
<change type="bugfix">
<para>
2018-04-26 13:47:55 +00:00
some PHP applications might not have worked with relative "root" path.
2018-01-15 12:05:25 +00:00
</para>
</change>
</changes>
<changes apply="unit-go1.9" ver="0.3" rev="1"
date="2017-12-28" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Go 1.9 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-python3.6" ver="0.3" rev="1"
date="2017-12-28" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Python 3.6 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-php
unit-python unit-python2.7 unit-python3.4 unit-python3.5
unit-go unit-go1.7 unit-go1.8"
ver="0.3" rev="1"
2017-12-28 13:01:06 +00:00
date="2017-12-28" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
NGINX Unit updated to 0.3.
</para>
</change>
</changes>
<changes apply="unit" ver="0.3" rev="1"
date="2017-12-28" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="change">
<para>
the Go package name changed to "nginx/unit".
</para>
</change>
<change type="change">
<para>
in the "limits.timeout" application option: application start time and
time in queue now are not accounted.
</para>
</change>
<change type="feature">
<para>
the "limits.requests" application option.
</para>
</change>
<change type="feature">
<para>
application request processing latency optimization.
</para>
</change>
<change type="feature">
<para>
HTTP keep-alive connections support.
</para>
</change>
<change type="feature">
<para>
the "home" Python virtual environment configuration option.
</para>
</change>
<change type="feature">
<para>
Python atexit hook support.
</para>
</change>
<change type="feature">
<para>
various Go package improvements.
</para>
</change>
<change type="bugfix">
<para>
various crashes fixed.
</para>
</change>
</changes>
<changes apply="unit-go" ver="0.2" rev="1"
date="2017-10-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Go module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-go1.7" ver="0.2" rev="1"
date="2017-10-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Go 1.7 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-go1.8" ver="0.2" rev="1"
date="2017-10-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Go 1.8 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-python" ver="0.2" rev="1"
date="2017-10-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Python module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-python2.7" ver="0.2" rev="1"
date="2017-10-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Python 2.7 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-python3.4" ver="0.2" rev="1"
date="2017-10-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Python 3.4 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-python3.5" ver="0.2" rev="1"
date="2017-10-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of Python 3.5 module for NGINX Unit.
</para>
</change>
</changes>
<changes apply="unit-php" ver="0.2" rev="1"
date="2017-10-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
Initial release of PHP module for NGINX Unit.
</para>
</change>
</changes>
2017-10-19 14:54:29 +00:00
<changes apply="unit" ver="0.2" rev="1"
date="2017-10-19" time="18:00:00 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change type="feature">
<para>
configuration persistence.
</para>
</change>
<change type="feature">
<para>
improved handling of configuration errors.
</para>
</change>
<change type="feature">
<para>
application "timeout" property.
</para>
</change>
<change type="bugfix">
<para>
POST request for PHP were handled incorrectly.
</para>
</change>
<change type="bugfix">
<para>
the router exited abnormally if all listeners had been deleted.
</para>
</change>
<change type="bugfix">
<para>
the router crashed under load.
</para>
</change>
<change type="bugfix">
<para>
memory leak in the router.
</para>
</change>
</changes>
2017-10-19 14:48:58 +00:00
<changes apply="unit" ver="0.1" rev="1"
date="2017-09-06" time="19:14:28 +0300"
packager="Andrei Belov &lt;defan@nginx.com&gt;">
<change>
<para>
First public release.
</para>
</change>
</changes>
</change_log>