blob: 092be667bb53eadb8b70771e165b703ece8a76f8 [file] [log] [blame]
=head1 NAME
public-inbox-daemon - common usage for public-inbox network daemons
=head1 SYNOPSIS
public-inbox-netd
public-inbox-httpd
public-inbox-imapd
public-inbox-nntpd
public-inbox-pop3d
=head1 DESCRIPTION
This manual describes common options and behavior for
public-inbox network daemons. Network daemons for public-inbox
provide read-only IMAP, HTTP, NNTP and POP3 access to public-inboxes.
Write access to a public-inbox will never be required to run these.
These daemons are implemented with a common core using
non-blocking sockets and optimized for fairness; even with
thousands of connected clients over slow links.
They also provide graceful shutdown/upgrade support to avoid
breaking existing connections during software upgrades.
These daemons may also utilize multiple pre-forked worker
processes to take advantage of multiple CPUs.
=head1 OPTIONS
=over
=item -l [PROTOCOL://]ADDRESS[?opt1=val1,opt2=val2]
=item --listen [PROTOCOL://]ADDRESS[?opt1=val1,opt2=val2]
This takes an absolute path to a Unix socket or HOST:PORT
to listen on. For example, to listen to TCP connections on
port 119, use: C<-l 0.0.0.0:119>. This may also point to
a Unix socket (C<-l /path/to/http.sock>) for a reverse proxy
like L<nginx(8)> to use.
May be specified multiple times to allow listening on multiple
sockets.
Unless per-listener options are used (required for
L<public-inbox-netd(1)>), this does not need to be specified at
all if relying on L<systemd.socket(5)> or similar,
Per-listener options may be specified after C<?> as C<KEY=VALUE>
pairs delimited by C<,>. See L<public-inbox-netd(1)> for
documentation on the C<cert=>, C<key=>, C<env.NAME=VALUE>,
C<out=>, C<err=>, and C<psgi=> options available.
Default: server-dependent unless socket activation is used with
L<systemd(1)> or similar (see L<systemd.socket(5)>).
=item -1
=item --stdout PATH
Specify an appendable path to redirect stdout descriptor (1) to.
Using this is preferable to setting up the redirect externally
(e.g. E<gt>E<gt>/path/to/log in shell) since it allows
SIGUSR1 to be handled (see L<SIGNALS/SIGNALS> below).
C<out=> may also be specified on a per-listener basis.
Default: /dev/null with C<--daemonize>, inherited otherwise
=item -2 PATH
=item --stderr PATH
Like C<--stdout>, but for the stderr descriptor (2).
C<err=> may also be specified on a per-listener basis.
Default: /dev/null with C<--daemonize>, inherited otherwise
=item -W INTEGER
=item --worker-processes INTEGER
Set the number of worker processes.
Normally, this should match the number of CPUs on the system to
take full advantage of the hardware. However, users of
memory-constrained systems may want to lower this.
Setting this to zero (C<-W0>) disables the master/worker split;
saving some memory but removing the ability to use SIGTTIN
to increase worker processes or have the worker restarted by
the master on crashes.
Default: 1
=item -X INTEGER
=item --xapian-helpers INTEGER
Enables the use of Xapian helper processes to handle expensive,
non-deterministic Xapian search queries asynchronously without
blocking simple requests.
With positive values, there is an additional manager process
that can be signaled to control the number of Xapian helper workers.
* C<-X0> one worker, no manager process
* C<-X1> one worker, one manager process
...
* C<-X8> eight workers, one manager process
As with the public-facing public-inbox-* daemons, sending C<SIGTTIN>
or C<SIGTTOU> to the Xapian helper manager process will increment or
decrement the number of workers.
Both Xapian helper workers and managers automatically respawn if they
crash or are explicitly killed, even with C<-X0>.
A C++ compiler, L<pkg-config(1)>, and Xapian development files (e.g.
C<libxapian-dev> or C<xapian*-core-dev*>) are required to gain access to
some expensive queries and significant memory savings.
Xapian helper workers are shared by all C<--worker-processes> of the
Perl daemon for additional memory savings.
New in public-inbox 2.0.0.
Default: undefined, search queries are handled synchronously
=item --cert /path/to/cert
The default TLS certificate for HTTPS, IMAPS, NNTPS, POP3S and/or STARTTLS
support if the C<cert> option is not given with C<--listen>.
With this option, well-known TCP ports automatically get TLS or STARTTLS
support if using systemd-compatible socket activation. That is, ports
443, 563, 993, and 995 support HTTPS, NNTPS, IMAPS, and POP3S,
respectively; while ports 110, 119, and 143 support STARTTLS on POP3,
NNTP, and IMAP, respectively.
=item --key /path/to/key
The default TLS certificate key for the default C<--cert> or
per-listener C<cert=> option. The private key may be
concatenated into the cert file itself, in which case this
option is not needed.
=item --multi-accept INTEGER
By default, each worker accepts one connection at a time to maximize
fairness and minimize contention across multiple processes on a
shared listen socket. Accepting multiple connections at once may be
useful in constrained deployments with few, heavily loaded workers.
Negative values enables a worker to accept all available clients at
once, possibly starving others in the process. C<-1> behaves like
C<multi_accept yes> in nginx; while C<0> (the default) is
C<multi_accept no> in nginx. Positive values allow
fine-tuning without the runaway behavior of C<-1>.
This may be specified on a per-listener basis via the C<multi-accept=>
per-listener directive (e.g. C<-l http://127.0.0.1?multi-accept=1>).
Default: 0
=back
=head1 SIGNALS
Most of our signal handling behavior is copied from L<nginx(8)>
and/or L<starman(1)>, so it is possible to reuse common scripts
for managing them.
=over 8
=item SIGUSR1
Reopens log files pointed to by --stdout and --stderr options.
=item SIGUSR2
Spawn a new process with the intention to replace the running one.
See L</UPGRADING> below.
=item SIGHUP
Reload config files associated with the process.
(Note: broken for L<public-inbox-httpd(1)> only in E<lt>= 1.6)
=item SIGTTIN
Increase the number of running worker processes by one.
=item SIGTTOU
Decrease the number of running worker processes by one.
=item SIGWINCH
Stop all running worker processes. SIGHUP or SIGTTIN
may be used to restart workers.
=item SIGQUIT
Gracefully terminate the running process.
=back
SIGTTOU, SIGTTIN, SIGWINCH all have no effect when worker
processes are disabled with C<-W0> on the command-line.
=head1 ENVIRONMENT
=over 8
=item PI_CONFIG
The default config file, normally "~/.public-inbox/config".
See L<public-inbox-config(5)>
=item LISTEN_FDS, LISTEN_PID
Used by systemd (and compatible) installations for socket
activation. See L<systemd.socket(5)> and L<sd_listen_fds(3)>.
=item PERL_INLINE_DIRECTORY
Pointing this to a writable directory enables the use
of L<Inline> and L<Inline::C> extensions which may provide
platform-specific performance improvements. Currently, this
enables the use of L<vfork(2)> which speeds up subprocess
spawning with the Linux kernel.
public-inbox will never enable L<Inline::C> automatically without
this environment variable set or C<~/.cache/public-inbox/inline-c>
created by a user. See L<Inline> and L<Inline::C> for more details.
=back
=head1 UPGRADING
There are two ways to upgrade a running process.
Users of process management systems with socket activation
(L<systemd(1)> or similar) may rely on multiple daemon instances.
For systemd, this means using two (or more) '@' instances for each
service (e.g. C<SERVICENAME@INSTANCE>) as documented in
L<systemd.unit(5)>.
Users of traditional SysV init may use SIGUSR2 to spawn
a replacement process and gracefully terminate the old
process using SIGQUIT.
In either case, the old process will not truncate running
responses; so responses to expensive requests do not get
interrupted and lost.
=head1 CONTACT
Feedback welcome via plain-text mail to L<mailto:meta@public-inbox.org>
The mail archives are hosted at L<https://public-inbox.org/meta/> and
L<http://4uok3hntl7oi7b4uf4rtfwefqeexfzil2w6kgk2jn5z2f764irre7byd.onion/meta/>
=head1 COPYRIGHT
Copyright all contributors L<mailto:meta@public-inbox.org>
License: AGPL-3.0+ L<https://www.gnu.org/licenses/agpl-3.0.txt>
=head1 SEE ALSO
L<public-inbox-httpd(1)>, L<public-inbox-imapd(1)>,
L<public-inbox-nntpd(1)>, L<public-inbox-pop3d(1)>, L<public-inbox-netd(1)>