| =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)> |