summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_router.h (follow)
AgeCommit message (Collapse)AuthorFilesLines
2024-08-20http: Refactor out nxt_tstr_cond_t from the access log moduleZhidao HONG1-2/+1
This nxt_tstr_cond_t will be reused for the feature of adding "if" option to the "match" object. The two "if" options have the same usage.
2024-06-20http: Support chunked request bodiesZhidao HONG1-0/+1
This is a temporary support for chunked request bodies by converting to Content-Length. This allows for processing of such requests until a more permanent solution is developed. A new configuration option "chunked_transform" has been added to enable this feature. The option can be set as follows: { "settings": { "chunked_transform": true } } By default, this option is set to false, which retains the current behaviour of rejecting chunked requests with a '411 Length Required' status code. Please note that this is an experimental implementation. Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
2024-01-29HTTP: enhanced access log with conditional filtering.Zhidao HONG1-0/+2
This feature allows users to specify conditions to control if access log should be recorded. The "if" option supports a string and JavaScript code. If its value is empty, 0, false, null, or undefined, the logs will not be recorded. And the '!' as a prefix inverses the condition. Example 1: Only log requests that sent a session cookie. { "access_log": { "if": "$cookie_session", "path": "..." } } Example 2: Do not log health check requests. { "access_log": { "if": "`${uri == '/health' ? false : true}`", "path": "..." } } Example 3: Only log requests when the time is before 22:00. { "access_log": { "if": "`${new Date().getHours() < 22}`", "path": "..." } } or { "access_log": { "if": "!`${new Date().getHours() >= 22}`", "path": "..." } } Closes: https://github.com/nginx/unit/issues/594
2023-05-08NJS: supported loadable modules.Zhidao HONG1-0/+4
2023-04-25Allow to remove the version string in HTTP responses.Andrew Clayton1-0/+2
Normally Unit responds to HTTP requests by including a header like Server: Unit/1.30.0 however it can sometimes be beneficial to withhold the version information and in this case just respond with Server: Unit This patch adds a new "settings.http" boolean option called server_version, which defaults to true, in which case the full version information is sent. However this can be set to false, e.g "settings": { "http": { "server_version": false } }, in which case Unit responds without the version information as the latter example above shows. Link: <https://www.ietf.org/rfc/rfc9110.html#section-10.2.4> Closes: <https://github.com/nginx/unit/issues/158> Reviewed-by: Alejandro Colomar <alx@nginx.com> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2023-03-21HTTP: added route logging.Alejandro Colomar1-0/+2
- Configuration: added "/config/settings/http/log_route". Type: bool Default: false This adds configurability to the error log. It allows enabling and disabling logs related to how the router performs selection of the routes. - HTTP: logging request line. Log level: [notice] The request line is essential to understand which logs correspond to which request when reading the logs. - HTTP: logging route that's been discarded. Log level: [info] - HTTP: logging route whose action is selected. Log level: [notice] - HTTP: logging when "fallback" action is taken. Log level: [notice] Closes: <https://github.com/nginx/unit/issues/758> Link: <https://github.com/nginx/unit/pull/824> Link: <https://github.com/nginx/unit/pull/839> Suggested-by: Timo Stark <t.stark@nginx.com> Suggested-by: Mark L Wood-Patrick <mwoodpatrick@gmail.com> Suggested-by: Liam Crilly <liam@nginx.com> Tested-by: Liam Crilly <liam@nginx.com> Acked-by: Artem Konev <a.konev@f5.com> Cc: Andrew Clayton <a.clayton@nginx.com> Cc: Andrei Zeliankou <zelenkov@nginx.com> Reviewed-by: Zhidao Hong <z.hong@f5.com> Signed-off-by: Alejandro Colomar <alx@nginx.com>
2022-11-20Var: separating nxt_tstr_t from nxt_var_t.Zhidao HONG1-3/+3
It's for the introduction of njs support. For each option that supports native variable and JS template literals introduced next, it's unified as template string. No functional changes.
2022-07-28Log: customizable access log format.Zhidao HONG1-1/+3
2022-07-14Log: split access log from nxt_router.c.Zhidao HONG1-0/+16
No functional changes.
2022-07-14Var: dynamic variables support.Zhidao HONG1-0/+1
This commit adds the variables $arg_NAME, $header_NAME, and $cookie_NAME.
2022-06-20Router: forwared header replacement.Zhidao HONG1-0/+1
2022-06-20Router: introduced nxt_http_forward_t.Zhidao HONG1-2/+2
This makes the replacement of forwarded request header like client_ip and protocol more generic. It's a prerequirement for protocol replacement. No functional changes.
2021-11-09Introducing application prototype processes.Tiago Natel de Moura1-0/+2
2021-10-28Moving request limit control to libunit.Max Romanov1-1/+0
Introducting application graceful stop. For now only used when application process reach request limit value. This closes #585 issue on GitHub.
2021-08-12Router: client IP address replacement.Oisin Canty1-0/+3
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-07-29Application restart introduced.Max Romanov1-0/+2
When processing a restart request, the router sends a QUIT message to all existing processes of the application. Then, a new shared application port is created to ensure that new requests won't be handled by the old processes of the application.
2021-07-24Router: split nxt_http_app_conf_t from nxt_http_action_t.Zhidao HONG1-3/+3
No functional changes.
2021-05-17Fixing racing condition on listen socket close in router.Max Romanov1-0/+2
Listen socket is actually closed in the instant timer handler. This patch moves the "configuration has been applied" notification to the timer handler to avoid a situation when the user gets the response from the controller, but the listen socket is still open in the router.
2020-11-17HTTP parser: allowed more characters in header field names.Valentin Bartenev1-0/+2
Previously, all requests that contained in header field names characters other than alphanumeric, or "-", or "_" were rejected with a 400 "Bad Request" error response. Now, the parser allows the same set of characters as specified in RFC 7230, including: "!", "#", "$", "%", "&", "'", "*", "+", ".", "^", "`", "|", and "~". Header field names that contain only these characters are considered valid. Also, there's a new option introduced: "discard_unsafe_fields". It accepts boolean value and it is set to "true" by default. When this option is "true", all header field names that contain characters in valid range, but other than alphanumeric or "-" are skipped during parsing. When the option is "false", these header fields aren't skipped. Requests with non-valid characters in header field names according to RFC 7230 are rejected regardless of "discard_unsafe_fields" setting. This closes #422 issue on GitHub.
2020-08-21Configuration: removed "reschedule_timeout" option.Valentin Bartenev1-1/+0
It's not used since cbcd76704c90. This option is a leftover from previous IPC between router and applications processes. It was never documented, though. Thanks to 洪志道 (Hong Zhi Dao).
2020-08-13Basic variables support.Valentin Bartenev1-2/+2
2020-08-12Responding with error in case of first process start failure.Max Romanov1-0/+1
After shared application port introducing, request queue in router was removed and requests may stuck forever waiting for another process start.
2020-08-11Made router port message handlers into static functions.Max Romanov1-6/+0
Mostly harmless.
2020-08-11Introducing the shared application port.Max Romanov1-5/+9
This is the port shared between all application processes which use it to pass requests for processing. Using it significantly simplifies the request processing code in the router. The drawback is 2 more file descriptors per each configured application and more complex libunit message wait/read code.
2020-07-06Destroying temporary router configuration.Igor Sysoev1-6/+0
The lifespan of a listening socket is longer than both router configuration's and temporary router configuration's lifespan, so the sockets should be stored in persistent queues. Safety is ensured by the fact that the router processes only one new configuration at any time.
2020-05-14PHP: implemented "targets" option.Valentin Bartenev1-0/+3
This allows to specify multiple subsequent targets inside PHP applications. For example: { "listeners": { "*:80": { "pass": "routes" } }, "routes": [ { "match": { "uri": "/info" }, "action": { "pass": "applications/my_app/phpinfo" } }, { "match": { "uri": "/hello" }, "action": { "pass": "applications/my_app/hello" } }, { "action": { "pass": "applications/my_app/rest" } } ], "applications": { "my_app": { "type": "php", "targets": { "phpinfo": { "script": "phpinfo.php", "root": "/www/data/admin", }, "hello": { "script": "hello.php", "root": "/www/data/test", }, "rest": { "root": "/www/data/example.com", "index": "index.php" }, } } } }
2020-03-12Using disk file to store large request body.Max Romanov1-0/+2
This closes #386 on GitHub.
2020-03-06Round robin upstream added.Igor Sysoev1-0/+5
2020-03-04Refactored nxt_http_action.Igor Sysoev1-2/+2
2019-11-14Initial proxy support.Igor Sysoev1-0/+7
2019-11-14Replacing pass with action.Igor Sysoev1-3/+3
2019-09-19Basic support for serving static files.Valentin Bartenev1-1/+5
2019-08-20Introducing websocket support in router and libunit.Max Romanov1-0/+9
2019-08-14Renaming supplemental request structures in router.Max Romanov1-2/+2
- nxt_req_app_link_t -> nxt_request_app_link_t - nxt_req_conn_link_t -> nxt_request_rpc_data_t Corresponding abbreviated field names also changed: - ra -> req_app_link - rc -> req_rpc_data
2019-05-30Handling routing errors.Igor Sysoev1-0/+3
2019-03-06Removed unnecessary abstraction layer.Alexander Borisov1-1/+1
2019-02-27Initial routing implementation.Igor Sysoev1-2/+8
2018-09-20Controller: certificates storage interface.Valentin Bartenev1-0/+4
2018-09-20Added SSL/TLS support on connection level.Igor Sysoev1-0/+4
2018-08-10Introducing app joint to accurate app release.Max Romanov1-2/+10
For accurate app descriptor release, it is required to count the number of use counts. Use count increased when: - app linked to configuration app queue; - socket conf stores pointer to app; - request for start app process posted to router service thread; Application port has pointer to app, but it does not increase use count to avoid use count loop. Timer needs a pointer to nxt_timer_t which is stored in engine timers tree. nxt_timer_t now resides in nxt_app_joint_t and does not lock the application. Start process port RPC handlers is also linked to nxt_app_joint_t. App joint (nxt_app_joint_t) is a 'weak pointer': - single threaded; - use countable; - store pointer to nxt_app_t (which can be NULL); nxt_app_t has pointer to nxt_app_joint_t and update its pointer to app.
2018-08-06Unit application library.Max Romanov1-6/+0
Library now used in all language modules. Old 'nxt_app_*' code removed. See src/test/nxt_unit_app_test.c for usage sample.
2018-05-30Fixed keep-alive hanging after reconfiguration.Igor Sysoev1-0/+3
2018-04-11Access log reopening.Valentin Bartenev1-0/+2
2018-04-11Initial access log support.Valentin Bartenev1-9/+25
2018-03-28Using more expressive name for field.Igor Sysoev1-1/+1
2018-01-29Introducing extended app process management.Max Romanov1-3/+14
- Pre-fork 'processes.spare' application processes; - fork more processes to keep 'processes.spare' idle processes; - fork on-demand up to 'processes.max' count; - scale down idle application processes above 'processes.spare' after 'processes.idle_timeout'; - number of concurrently started application processes also limited by 'processes.spare' (or 1, if spare is 0).
2017-12-28Removed duplicate declaration.Igor Sysoev1-0/+2
2017-12-28Removed duplicate declaration.Igor Sysoev1-3/+0
2017-12-28HTTP keep-alive connections support.Igor Sysoev1-0/+7
2017-12-27Implementing worker stop after limits.requests.Max Romanov1-0/+1