summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_application.c (follow)
AgeCommit message (Collapse)AuthorFilesLines
2024-07-12Flow the language module name into nxt_app_lang_module_tAndrew Clayton1-3/+12
The nxt_app_lang_module_t structure contains various bits of information as obtained from the nxt_app_module_t structure that language modules define. One bit of information that is in the nxt_app_module_t but not in the nxt_app_lang_module_t is the language module name. Having this name flowed through will be useful for displaying the loaded language modules in the /status endpoint. Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-21Wasm-wc: Wire up the language module to the config systemAndrew Clayton1-0/+3
This exposes the various WebAssembly Component Model language module specific options. The application type is "wasm-wasi-component". There is a "component" option that is required, this specifies the full path to the WebAssembly component to be run. This component should be in binary format, i.e a .wasm file. There is also currently one optional option "access" Due to the sandboxed nature of WebAssembly, by default Wasm modules/components don't have any access to the underlying filesystem. There is however a capabilities based mechanism[0] for allowing such access. This adds a config option to the 'wasm-wasi-component' application type (same as for 'wasm'); 'access.filesystem' which takes an array of directory paths that are then made available to the wasm module/component. This access works recursively, i.e everything under a specific path is allowed access to. Example config might look like "applications": { "my-wasm-component": { "type": "wasm-wasi-component", "component": "/path/to/component.wasm", "access" { "filesystem": [ "/tmp", "/var/tmp" ] } } } The actual mechanism used allows directories to be mapped differently in the guest. But at the moment we don't support that and just map say /tmp to /tmp. This can be revisited if it's something users clamour for. [0]: <https://github.com/bytecodealliance/wasmtime/blob/main/docs/WASI-capabilities.md> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2023-08-17Wasm: Wire up Wasm language module support to the config system.Andrew Clayton1-0/+3
This exposes various WebAssembly language module specific options. The application type is "wasm". There is a "module" option that is required, this specifies the full path to the WebAssembly module to be run. This module should be in binary format, i.e a .wasm file. There are also currently eight function handlers that can be specified. Three of them are _required_ 1) request_handler The main driving function. This may be called multiple times for a single HTTP request if the request is larger than the shared memory. 2) malloc_handler Used to allocate a chunk of memory at language module startup. This memory is allocated from the WASM modules address space and is what is sued for communicating between the WASM module (the guest) and Unit (the host). 3) free_handler Used to free the memory from above at language module shutdown. Then there are the following five _optional_ handlers 1) module_init_handler If set, called at language module startup. 2) module_end_handler If set, called at language module shutdown. 3) request_init_handler If set, called at the start of request. Called only once per HTTP request. 4) request_end_handler If set, called once all of a request has been sent to the WASM module. 5) response_end_handler If set, called at the end of a request, once the WASM module has sent all its headers and data. Example config "applications": { "luw-echo-request": { "type": "wasm", "module": "/path/to/unit-wasm/examples/c/luw-echo-request.wasm", "request_handler": "luw_request_handler", "malloc_handler": "luw_malloc_handler", "free_handler": "luw_free_handler", "module_init_handler": "luw_module_init_handler", "module_end_handler": "luw_module_end_handler", } } Reviewed-by: Alejandro Colomar <alx@nginx.com> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2023-04-11Add per-application logging.Andrew Clayton1-0/+53
Currently when running in the foreground, unit application processes will send stdout to the current TTY and stderr to the unit log file. That behaviour won't change. When running as a daemon, unit application processes will send stdout to /dev/null and stderr to the unit log file. This commit allows to alter the latter case of unit running as a daemon, by allowing applications to redirect stdout and/or stderr to specific log files. This is done via two new application options, 'stdout' & 'stderr', e.g "applications": { "myapp": { ... "stdout": "/path/to/log/unit/app/stdout.log", "stderr": "/path/to/log/unit/app/stderr.log" } } These log files are created by the application processes themselves and thus the log directories need to be writable by the user (and or group) of the application processes. E.g $ sudo mkdir -p /path/to/log/unit/app $ sudo chown APP_USER /path/to/log/unit/app These need to be setup before starting unit with the above config. Currently these log files do not participate in log-file rotation (SIGUSR1), that may change in a future commit. In the meantime these logs can be rotated using the traditional copy/truncate method. NOTE: You may or may not see stuff printed to stdout as stdout was traditionally used by CGI applications to communicate with the webserver. Closes: <https://github.com/nginx/unit/issues/197> Closes: <https://github.com/nginx/unit/issues/846> Reviewed-by: Alejandro Colomar <alx@nginx.com> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2022-11-04Removed the unsafe nxt_memcmp() wrapper for memcmp(3).Alejandro Colomar1-1/+1
The casts are unnecessary, since memcmp(3)'s arguments are 'void *'. It might have been necessary in the times of K&R, where 'void *' didn't exist. Nowadays, it's unnecessary, and _very_ unsafe, since casts can hide all classes of bugs by silencing most compiler warnings. The changes from nxt_memcmp() to memcmp(3) were scripted: $ find src/ -type f \ | grep '\.[ch]$' \ | xargs sed -i 's/nxt_memcmp/memcmp/' Reviewed-by: Andrew Clayton <a.clayton@nginx.com> Signed-off-by: Alejandro Colomar <alx@nginx.com>
2022-08-11Fixing isolated process PID manipulation.Max Romanov1-16/+59
Registering an isolated PID in the global PID hash is wrong because it can be duplicated. Isolated processes are stored only in the children list until the response for the WHOAMI message is processed and the global PID is discovered. To remove isolated siblings, a pointer to the children list is introduced in the nxt_process_init_t struct. This closes #633 issue on GitHub.
2021-12-01Fixing prototype process crash.Max Romanov1-0/+2
A prototype stores linked application processes structures. When an application process terminates, it's removed from the list. To avoid double removal, the pointer to the next element should be set to NULL. The issue was introduced in c8790d2a89bb.
2021-11-24Sending shared port to application prototype.Max Romanov1-0/+3
Application process started with shared port (and queue) already configured. But still waits for PORT_ACK message from router to start request processing (so-called "ready state"). Waiting for router confirmation is necessary. Otherwise, the application may produce response and send it to router before the router have the information about the application process. This is a subject of further optimizations.
2021-11-09Introducing application prototype processes.Tiago Natel de Moura1-13/+438
2021-11-02Improved logging of app module load errors.Valentin Bartenev1-5/+22
2021-10-28Moving request limit control to libunit.Max Romanov1-1/+5
Introducting application graceful stop. For now only used when application process reach request limit value. This closes #585 issue on GitHub.
2020-10-29Isolation: mounting of procfs by default when using "rootfs".Tiago Natel de Moura1-7/+10
2020-10-28Preserving the app port write socket.Max Romanov1-1/+1
The socket is required for intercontextual communication in multithreaded apps.
2020-08-20Moved isolation related code to "nxt_isolation.c".Tiago Natel de Moura1-581/+4
2020-08-11Moving file descriptor blocking to libunit.Max Romanov1-6/+0
The default libunit behavior relies on blocking the recv() call for port file descriptors, which an application may override if needed. For external applications, port file descriptors were toggled to blocking mode before the exec() call. If the exec() call failed, descriptor remained blocked, so the process hanged while trying to read from it. This patch moves file descriptor mode switch inside libunit.
2020-08-11Libunit refactoring: port management.Max Romanov1-1/+13
- Changed the port management callbacks to notifications, which e. g. avoids the need to call the libunit function - Added context and library instance reference counts for a safer resource release - Added the router main port initialization
2020-07-23Fixing main and application port structs file descriptor init.Max Romanov1-0/+2
Correct value for non-initialized file descriptor is -1, because most of the checks in libunit compares file descriptor with -1 before performing an action. Using 0 as default value, may cause to close file descriptor #0, this may affect application logic. It is not required to list this patch in changelog because impact is not seen by end users.
2020-07-22Fixing buffer overflow check in discovery.Max Romanov1-1/+1
Incorrect check prevents Unit to start without modules. This issue was introduced in 4a3ec07f4b19.
2020-06-23Isolation: fixed build when features aren't detected.Tiago Natel de Moura1-93/+110
2020-05-28Added "rootfs" feature.Tiago Natel de Moura1-38/+443
2020-03-09Refactor of process management.Tiago Natel de Moura1-19/+344
The process abstraction has changed to: setup(task, process) start(task, process_data) prefork(task, process, mp) The prefork() occurs in the main process right before fork. The file src/nxt_main_process.c is completely free of process specific logic. The creation of a process now supports a PROCESS_CREATED state. The The setup() function of each process can set its state to either created or ready. If created, a MSG_PROCESS_CREATED is sent to main process, where external setup can be done (required for rootfs under container). The core processes (discovery, controller and router) doesn't need external setup, then they all proceeds to their start() function straight away. In the case of applications, the load of the module happens at the process setup() time and The module's init() function has changed to be the start() of the process. The module API has changed to: setup(task, process, conf) start(task, data) As a direct benefit of the PROCESS_CREATED message, the clone(2) of processes using pid namespaces now doesn't need to create a pipe to make the child block until parent setup uid/gid mappings nor it needs to receive the child pid.
2019-10-22Fixing process crash in case of module load error.Max Romanov1-0/+3
This is related to #330 issue on GitHub.
2019-07-17Exiting application process in case of pre_init stage error.Max Romanov1-4/+1
2019-03-06Removed unnecessary abstraction layer.Alexander Borisov1-28/+0
2019-02-28Introducing Java Servlet Container beta.Max Romanov1-0/+14
2018-10-09Renamed "go" application type to "external".Valentin Bartenev1-4/+4
There's nothing specific to Go language. This type of application object can be used to run any external application that utilizes libunit API.
2018-08-06Unit application library.Max Romanov1-427/+49
Library now used in all language modules. Old 'nxt_app_*' code removed. See src/test/nxt_unit_app_test.c for usage sample.
2018-07-12Enabled body buffer shared memory segmentation.Max Romanov1-23/+22
Changeset #699 fixes shared memory allocation: continous buffer with requested size should be allocated or function failed. For body longer than 10 Mb, this allocation will definitely fails. For body buffer it is not required to send it in a single continous buffer, so, need to request minimum reasonable amount of shared memory and try to extend it, if possible or allocate next buffer.
2018-06-25Introduced nxt_length() macro.Valentin Bartenev1-4/+4
2018-05-28Configuration of environment variables for application processes.Valentin Bartenev1-0/+47
2018-05-21Added SERVER_SOFTWARE request meta-variable.Valentin Bartenev1-0/+3
2018-04-20Fixed segfault when two modules have the same type and version.Valentin Bartenev1-1/+1
The bug appeared in 217e48a3b091. This closes #104 issue on GitHub.
2018-04-17Added missing checks if nxt_port_rpc_register_handler() failed.Valentin Bartenev1-0/+4
This closes #97 issue on GitHub. Thanks to 洪志道 (Hong Zhi Dao).
2018-04-05Handling error return from application 'run()' function.Max Romanov1-1/+7
Server error response generated or connection closed.
2018-04-04Changed version processing for modules.Alexander Borisov1-8/+10
2018-03-21Added Ruby support.Alexander Borisov1-0/+3
2018-03-05Reduced number of critical log levels.Valentin Bartenev1-10/+5
2018-02-14Fixed race condition while discovering modules.Valentin Bartenev1-20/+42
Previously, the discovery process might exit before the main process received a list of available modules.
2018-01-31Added Perl support.Alexander Borisov1-3/+3
2018-01-24Fixed formatting in nxt_sprintf() and logging.Sergey Kandaurov1-1/+1
2018-01-24Using size_t for the field width type of the "%*s" specifier.Sergey Kandaurov1-3/+5
2017-12-28Removed duplicate declaration.Igor Sysoev1-1/+1
2017-12-28HTTP keep-alive connections support.Igor Sysoev1-207/+16
2017-12-28Changed nxt_mp_retain() and nxt_mp_release() interfaces.Igor Sysoev1-1/+1
2017-12-27Implementing the ability to cancel request before worker starts processing it.Max Romanov1-61/+31
2017-12-27Introducing application 'atexit' hook.Max Romanov1-1/+12
Finalizing Python interpreter. This closes #65 issue on GitHub.
2017-12-25HTTP parser: reworked header fields handling.Valentin Bartenev1-46/+45
2017-12-07Fixed protocol version string handling in router.Valentin Bartenev1-1/+1
2017-10-18Added the debug option to module compatibility vector.Igor Sysoev1-1/+1
2017-10-10Optimized application type handling.Valentin Bartenev1-23/+41