Commit Graph
100 Commits
Author SHA1 Message Date
Max Romanov aab235c4dc Java: fixing realpath error message. 2019-07-17 10:52:48 +03:00
Max Romanov cc578b2e63 PHP: added PATH_INFO support. 2019-07-05 21:10:01 +03:00
Max Romanov b1ee073707 PHP: removing excessive debug message. 2019-06-28 12:20:00 +03:00
Max Romanov ce17fef73d Fixed application crash handling in router.
Before this fix, request in router may hang until timeout expired if
application crashed during request processing.
2019-06-28 12:19:54 +03:00
Max Romanov 9ea4be7e4e Fixing allocation alignment for port fragments.
All allocated blocks for lvlhash required to be aligned because lower
address bits used for various extra information.  Using unaligned blocks
may cause invalid memory aceess.

This was issue found on buildbot running large configuration tests.
2019-06-28 12:19:48 +03:00
Max Romanov 3ceec5f4d2 Java: adding Content-Type response header for static files. 2019-06-28 12:19:40 +03:00
Max Romanov 24400b3a5d Node.js: packaging new nxt_napi.h.
File nxt_napi.h (introduced in 53533ba0097c) added into packaged files
list.

This closes #261 issue on GitHub.
2019-06-17 18:16:06 +03:00
Max Romanov 6eba5ddd42 Java: added java module in configure help. 2019-05-30 15:02:10 +03:00
Max Romanov 8241539734 Java: fixing typo in context initialization. 2019-05-30 15:02:09 +03:00
Max Romanov 6a2928b4bf Java: fixing request scheme using 'tls' flag. 2019-05-30 15:02:07 +03:00
Max Romanov c6e96647a1 Node.js: using low-case header names as key in req.headers.
Node.js modules (body-parser, row-body) search low-cased names
('content-length', 'content-type' etc.) to properly assemble request body.

This closes #246 issue on GitHub.
2019-04-17 19:15:41 +03:00
Max Romanov 6241099db2 Removing unused variables and assignments.
Warnings introduced in 53533ba0097c commit.
2019-04-02 16:07:49 +03:00
Max Romanov 56101e47ee Adding 'connection' to request as an alias to 'socket'.
Adding actual 'remoteAddress' and 'localAddress' into socket object.

This closes #232 issue on GitHub.
2019-04-01 16:40:49 +03:00
Max Romanov 8557cb3660 Introducing close event to notify about server stop.
This closes #236 on GitHub.
Thanks to 0xcdcdcdcd.
2019-04-01 16:40:40 +03:00
Max Romanov aca42de18a Adding syntax sugar.
With exceptions and overloads.
2019-04-01 16:40:33 +03:00
Max Romanov b96e5fd848 Turning off port read event state after main process fork.
Master port stores two file descriptors and works as a read port on the master
process side.  After a fork, the port switches into write mode and the read
socket closes, but the same event structure is used for the write socket.
However, the inherited structure remained in read state, telling the epoll
engine to use MOD operation instead of ADD.  The patch resets read event
state, so the engine may write using proper ADD operation.
2019-03-25 14:49:28 +03:00
Max Romanov 6c694d4b47 Ignoring EPERM error when changing application process uid/gid.
This closes #228 issue on GitHub.
2019-03-22 15:32:58 +03:00
Max Romanov 1b7514dca3 Destroying pool in case of error.
This closes #233 issue on GitHub.
Thanks to 洪志道 (Hong Zhi Dao).
2019-03-22 15:32:40 +03:00
Max Romanov 687f83fbd0 Style fixing.
This closes #233 issue on GitHub.
Thanks to 洪志道 (Hong Zhi Dao).
2019-03-22 15:32:35 +03:00
Max Romanov 452ce0789e Adjusting request schema value according to connection tls state.
This closes #223 issue on GitHub.
2019-03-21 13:55:57 +03:00
Max Romanov 39e147a858 Removing unused local variable. 2019-03-18 19:55:39 +03:00
Max Romanov f49379215a Setting request error flag in error handler.
Absence of this flag is the reason of memory leak in case when client
disconnected before receiving all response data.
2019-03-18 19:55:34 +03:00
Max Romanov e1c4568680 Introducing one more large config test, but without sockets. 2019-03-05 15:38:52 +03:00
Max Romanov ddd2e8cc36 Improving port message fragment recognition.
This is required to assemble fragmented messages correctly.  Stream
identifier is unique only for messages generated within a process, but
the (stream, pid) pair should be enough to avoid collisions.  Adding
reply_port seems redundant because it's enough to add stream to a pid.

This closes #199 issue on GitHub.
Thanks to 洪志道 (Hong Zhi Dao).
2019-03-05 15:38:51 +03:00
Max Romanov 42b66ec654 Fixing EAGAIN processing for port message send.
Sending large plain (exceeding port's max_size, not in shared memory) messages
causes message fragmentation.  First message fragment is sent successfully,
but the next fragment may fail with the EAGAIN error.  In this case, the
message has to be pushed back to queue head for additional processing.

Related to #167 issue on GitHub.
2019-03-05 15:38:50 +03:00
Max Romanov 0ab83370cb Handling ENOBUFS error same was as EAGAIN.
Unlike EAGAIN, ENOBUFS returned on OSX when trying to send many relatively
small (64 bytes) fragments.

Found during investigation of #167 issue on GitHub.
2019-03-05 15:38:49 +03:00
Max Romanov aedb999fe1 Including port message header into message size limit.
Before this fix, large plain message (i.e. configuration) send may fail
with the 'Message too big' error, because internal fragmentation
implementation does not account for 16 byte message header.

This closes #167 issue on GitHub.
2019-03-05 15:38:48 +03:00
Max Romanov afda14d1f2 Preserving message 'share' field when pushing to queue.
As far as I understand, this field is important to control the number of
buffers send in a single write attempt.  Furthermore, having uninitialized
field is always bad.

This closes #204 issue on GitHub.
Thanks to 洪志道 (Hong Zhi Dao).
2019-02-28 18:03:21 +03:00
Max Romanov ec7319d32c Various libunit fixes.
This patch contains various logging improvements and bugfixes found
during Java module development.
2019-02-28 15:52:36 +03:00
Max Romanov b92dc6036c Removing app data debug message.
This message produces too many noise in log and complicates analysis.
2019-02-28 14:37:39 +03:00
Max Romanov 0c917b4d34 Reusing fragmented message buffers.
Fragmented message non-mmap buffer chain not freed nor reused before
this fix.

This closes #206 on GitHub.
Thanks to 洪志道 (Hong Zhi Dao).
2019-02-28 13:39:31 +03:00
Max Romanov bd1eb7b502 RPC error message size fixed.
In case of RPC error, special error message passed to handler.
Field 'size' expected to be 0 in this case because in contains fake
empty buffer.
2019-02-25 18:09:37 +03:00
Max Romanov 49ec17b1ef Installing libunit headers and static library. 2018-10-17 15:52:44 +03:00
Max Romanov 141ee2aa32 Filling cmsghdr with 0 to pass Go 1.11 message validation. 2018-10-02 19:49:49 +03:00
Max Romanov c8b30ef4da Go: fixing typo in log messages. 2018-10-02 19:49:48 +03:00
Max Romanov cb1b074493 Making port fd blocking on app side and non-blocking in Unit.
This issue was introduced in libunit commit (e0f0cd7d244a).  All port
sockets in application should be in blocking mode whereas Unit itself
operates non-blocking sockets.

Having non-blocking sockets in application may cause send error during
intensive response packets generation.

See https://mailman.nginx.org/pipermail/unit/2018-October/000080.html.
2018-10-02 19:46:06 +03:00
Max Romanov 58c38298f5 Resetting init->stream for ready process.
Router requests application start by sending port message with application
parameters to master.  In response router gets application port.  Stream id
used to link request and response.  If application process terminates
unexpectedly (e.g. before ready state), it is required to notify router about
application start failure.  For this purpose stream id is stored in process
initialization parameters.

Stream id sequentially incremented and starts from 1 in case of router
resurrection.  New router application start stream id may coincide with
stream id of currently running/terminating application processes.  In such
cases router may receive REMOVE_PID message with same stream id as used in
application start request and mistakenly reports application start failure.

This commit tries to avoid such errors by resetting stream for processes in
ready state.
2018-09-20 17:30:56 +03:00
Max Romanov 9fe6e75d35 Preventing port from release in asynchronous operations.
Router reconfiguration may lead to starting new application processes, opening
listen ports etc.  These actions are asynchronous and require message
exchange with master process.  Router stores reference for controller
(response) port in structure associated with reconfiguration process (tmcf).
The port used to provide reconfiguration response (either success or failed)
to controller.

This commit increases response port use counter to make sure port structure
not freed while router waits for result of asynchronous operations.
2018-09-20 16:16:32 +03:00
Max Romanov 9f29ac9f3e Preserving inherited engine memory pool in controller process.
The pool is inherited from master process since changeset 854a1a440616.
2018-09-20 15:50:48 +03:00
Max Romanov e964e982fd Initializing application structure with 0 to avoid crash.
Attribute 'application' is optional in listener object.  This commit adds
missing code to reset 'lscf' to avoid garbage and crash when the attribute
is absent.
2018-09-19 19:24:56 +03:00
Max Romanov 5ef1352fae Initializing user_cred gids and ngroups for MacOS. 2018-09-19 18:53:16 +03:00
Max Romanov 903ee2de64 Misspelled variable names fixed. 2018-09-07 18:45:14 +03:00
Max Romanov ec1af82323 Stopping all application processes if router process dies.
Unit master process restarts the router if the router accidentally dies.
New router process receives the configuration from controller and starts
configured applications.  The information of running applications cannot
be transferred to router because currently there is no persistent application
identifier.  To avoid orphan application processes started by died router,
master process stops all currently running applications once it receives
SIGCHLD for router process.
2018-08-10 19:27:15 +03:00
Max Romanov 86740ab34b Introducing app joint to accurate app release.
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-10 19:27:13 +03:00
Max Romanov b2ec830515 Removing non-required warning. 2018-08-07 20:03:58 +03:00
Max Romanov 9015b8b25d Improved 'invalid file descriptor' diagnostic.
Unit router process may send mmap file decritptor to the application process
for further information exchange.  During this process there may be various
errors, which should be described in application error log.  If file descriptor
cannot be properly transferred with 'new mmap' message, fd variable will
be assigned to -1 and further syscalls using this file descriptor will fail.

For 'new port' message fd is checked in the same way.

This commit adds early 'invalid file descriptor' diagnostic and write
corresponding message to error log.

Found by Coverity (CID 308515).
2018-08-07 17:57:06 +03:00
Max Romanov 257283cc38 Fixed unit library mutex usage.
For the optimization purpose, function nxt_unit_remove_process() expects
lib->mutex to be locked.  The function then moves ports queue into temporary
queue and releases mutex.  In nxt_unit_done() there were two errors: mutex was
not locked before nxt_unit_remove_process() call and mutex was not destroyed.
It is hard to tell what was possible negative impact of this errors.

Found by Coverity (CID 308517).
2018-08-07 15:52:11 +03:00
Max Romanov b021188e95 Python: decoding unicode strings as Latin1.
According to PEP 3333, header names and values should be decoded as Latin1.
2018-08-06 19:16:45 +03:00
Max Romanov 1bb22d1e92 Unit application library.
Library now used in all language modules.
Old 'nxt_app_*' code removed.

See src/test/nxt_unit_app_test.c for usage sample.
2018-08-06 17:27:33 +03:00
Max Romanov 4d818a6f23 Enabled body buffer shared memory segmentation.
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-07-12 16:06:36 +03:00
Max Romanov e6cd1c4257 Go: http.Flusher implemented by unit.response.
This closes #133 issue on GitHub.
2018-07-12 15:50:43 +03:00
Max Romanov b1d7844449 Fixed allocation of multiple shared memory chunks.
Previously, one shared memory chunk was allocated under mutex and other
chunks (if required) were allocated using atomic operations.  So such
allocation is not guaranteed and the result buffer can be less than
requested.

This commit moves multiple chunks allocation under mutex and guarantees
the result buffer is large enough.
2018-06-20 19:11:27 +03:00
Max Romanov 6157a599f2 Using 'all' as default target in Makefile. 2018-06-19 17:23:01 +03:00
Max Romanov 38e40fa857 PHP: using generated dependencies in makefile. 2018-05-30 18:19:39 +03:00
Max Romanov 07204789bc Eliminating possible NULL pointer dereference.
Found by Coverity (CID 276138).
2018-04-27 20:32:50 +03:00
Max Romanov 179819dbee Controller waits READY message from router.
This required to avoid racing condition when controller receive router
port before router receives controller port.
2018-04-26 16:44:20 +03:00
Max Romanov ad36c8ca8d Go: fixed request.Read() behaviour for EOF.
This closes #108 issue on GitHub.
2018-04-20 17:23:43 +03:00
Max Romanov 8934afee24 Go: Forced WriteHeader after application request processing.
Application should create response for every request.
If not, Unit package will do it.
2018-04-06 16:27:46 +03:00
Max Romanov 2f3b9d4583 Handling error return from application 'run()' function.
Server error response generated or connection closed.
2018-04-05 17:20:26 +03:00
Max Romanov d748f74f2b Stopping timed out application process. 2018-04-05 17:19:25 +03:00
Max Romanov 778a90c319 Triggering RPC error for all handlers on port close.
This is required to avoid crashes and memory leaks on Unit exit.
2018-03-21 16:55:09 +03:00
Max Romanov b865db1bb7 Registered RPC handlers affects port use counters.
Service process port gets closed and released by runtime on process exit,
but there can be active RPC handlers, which uses port structure.
2018-03-21 16:55:02 +03:00
Max Romanov 6da1207d95 Skipping idle state when port already closed. 2018-03-15 17:08:39 +03:00
Max Romanov 7958a22de0 Ignoring response for already terminated request.
Request can be terminated because of invalid response headers and content
should be ignored in this case.
2018-03-14 12:03:47 +03:00
Max Romanov 1ac9db4750 Releasing application on configuration failure. 2018-03-13 15:32:06 +03:00
Max Romanov ee092b64eb Socket configuration should retain application.
This retains application during reconfiguration if an incoming connection
was already established before the reconfiguration, but no request was yet
created for the connection and thus no application was yet assigned to
the request.
2018-03-07 19:42:06 +03:00
Max Romanov babf67712e Removed unwanted assertions. 2018-02-20 19:00:30 +03:00
Max Romanov 18c66cb07d Improving configuration field mapping names.
Avoiding word 'common' as too common.
Couple of assertions reduced to error messages.
2018-02-13 21:28:21 +03:00
Max Romanov d2c85a2d9e Fixed processing of application response in router.
If the first buffer contained only header and there were other buffers in chain,
those buffers were not processed.  In particular, this broke Perl application
responses with empty body.
2018-02-07 13:47:04 +03:00
Max Romanov f7195e7016 Fixed typo in assertion statement introduced in 4979fe09d9cd.
Found by Coverity (CID 260375).
2018-02-02 14:08:18 +03:00
Max Romanov 9cd4fdbdb7 Introducing extended app process management.
- 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).
2018-01-29 16:17:36 +03:00
Max Romanov 2db8e586e5 Reduced duplication of validated app config options.
Common options moved to separate array.  Application-specific arrays refers
to common options.
2018-01-18 09:08:25 +03:00
Max Romanov c2918a0014 Introducing pretty NXT_CONF_VLDT_END macro. 2018-01-18 09:08:16 +03:00
Max Romanov fa49d042a8 PHP: Terminating names with zero.
Fixing issue introduced in changeset 462:17a2c9b27b57 .
2018-01-12 16:37:42 +03:00
Max Romanov aad4229cbc Initializing script_name.start before using.
This makes gcc 4.4.6 happy.
2018-01-12 11:19:00 +03:00
Max Romanov 349717fb90 Changing relative php scripts paths to real ones.
This is required to run phpMyAdmin.
2018-01-11 22:14:20 +03:00
Max Romanov b59535b22c Removed unused variable assignment.
Found by Coverity (CID 215301).
2017-12-28 15:58:01 +03:00
Max Romanov 47bc1c53d6 Implementing worker stop after limits.requests. 2017-12-27 17:48:53 +03:00
Max Romanov 5196cf4d50 Rescheduling of pending request after configured timeout.
New optional configuration parameter introduced: limits.reschedule_timeout.
Default value 1 second.  In the case when request is written to the port
socket 'in advance', it is called 'pending'.

On every completed request, the head of pending request is checked against
reschedule timeout.  If this request waiting for execution longer than
timeout, it is cancelled, new port selected for this request.
2017-12-27 17:48:04 +03:00
Max Romanov baa8c9387b Fixing code style. 2017-12-27 17:47:42 +03:00
Max Romanov bef2ec483e Fixing application timeout.
Application timeout limits maximum time of worker response in processing
particular request.  Not including the time required to start worker,
time in request queue etc.
2017-12-27 17:47:18 +03:00
Max Romanov ab138c9166 Changing worker selection precedence.
This patch increase precedence of non-started worker over busy worker.

1. idle worker;
2. start new worker;
3. busy worker, but can accept request in advance;
2017-12-27 17:46:39 +03:00
Max Romanov 89c0f7c5db Implementing the ability to cancel request before worker starts processing it. 2017-12-27 17:46:17 +03:00
Max Romanov be36cf52c8 Introducing application 'atexit' hook.
Finalizing Python interpreter.

This closes #65 issue on GitHub.
2017-12-27 14:02:11 +03:00
Max Romanov 392abd03e5 Restoring apps in case of reconfiguration error. 2017-12-25 16:24:54 +03:00
Max Romanov 4e403c17da Introducing --lib-path options for Python module linkage.
This option is useful when python-config does not setup path to libpython,
which is non standard.
2017-12-15 14:06:15 +03:00
Max Romanov 799cff5f3e Introducing Unit version check in Go package.
To communicate with the Go program, Unit setup environment variable
named NXT_GO_PORTS with value contains Unit version, stream id to confirm
application is started, and Unit ports information.  Go Unit package parses
this string and compares runtime version with compile time version.  In case
of parse error or version mismatch, ListenAndServe() returns with the error.
2017-12-13 18:12:13 +03:00
Max Romanov d14c0774c7 Go: removing request registry.
Passing unsafe.Pointers (void *) from Go to C is complicated by an attempt
to make such pointers less unsafe.

A straightforward optimization is to replace 'unsafe.Pointer' with 'uintptr'
(thanks to Xin Huang for the idea: https://stackoverflow.com/a/44826533 ).

As a result, request registry with mutex is gone.
2017-12-06 12:16:02 +03:00
Max Romanov 0db4d25316 Fixing Go package build in NetBSD.
Bug introduced in 585c8068a6d7.
2017-12-05 17:06:37 +03:00
Max Romanov cdf900cf2c Packaging changes for updated Go package.
- package name changed to 'nginx/unit';
- source files installed in /usr/share/gocode;
- rpm and deb go packages made noarch.
2017-12-01 16:59:41 +03:00
Max Romanov 40eb1f8b9b Making Go package source distributable and renaming to 'nginx/unit'.
All header files are copied to Go package sources.  As the result,
package can be (re-)build when required.

This closes #23 issue on GitHub.
2017-12-01 16:57:30 +03:00
Max Romanov ffb1c68609 Initializing port_msg fields with zeroes in Go package. 2017-12-01 16:51:30 +03:00
Max Romanov 630ec3f1ec Using compiler capability to generate dependencies.
This closes #58 issue on GitHub.
2017-12-01 16:28:06 +03:00
Max Romanov 1add36a7ee Using --ld-opt when linking modules. 2017-11-29 18:49:08 +03:00
Max Romanov 3781950bad Introducing python virtualenv configuration.
New parameter 'home' for python application allows to configure
application-specific virtualenv path.

This closes #15 issue on GitHub.
2017-11-29 18:48:55 +03:00
Max Romanov ec411569e7 Fixing build on Solaris. 2017-11-02 15:32:46 +03:00
Max Romanov 6bbed85899 Fixing Coverity warnings.
CID 200496
CID 200494
CID 200490
CID 200489
CID 200483
CID 200482
CID 200472
CID 200465
2017-11-20 17:08:29 +03:00
Max Romanov fa76ea700f Fixing racing condition in request.msgs usage. 2017-10-27 11:05:37 +03:00
Max Romanov 1d11f8cfbb Fixing Go program crash.
Go request registration should be removed before C request memory freed.

C request address used as a key in Go map.  Freed memory can be instantly
reused for other request and older request registration should removed at this
point to avoid collisions.
2017-10-27 11:05:22 +03:00
Max Romanov 51396fea83 Checking the result of shared memory buffer allocation.
This closes #57 issue on GitHub.
2017-10-25 15:09:07 +03:00