http(8gx)

πŸ“¦
version 3.6 Β· 2 versions
, in alpine 3.24

πŸ’… http(8gx) β€” Gromox admin reference 🫢

okay so bestie, welcome to the http page β€” she's the Gromox protocol handler for HTTP and RPCH, and honestly she's doing a lot. grab a snack. πŸ“


✨ Name ✨

http β€” the protocol handler for HTTP and RPCH. that's the whole vibe check. πŸ‘‘


✨ Synopsis ✨

http [-c config]

that's it. that's the whole invocation. slay. πŸ’…


✨ Description ✨

so http(8gx) is a trivial HTTP server β€” her words, not mine β€” but don't let that fool you. she understands the special HTTP methods that RPC-over-HTTP (the protocol Outlook uses) requires, she can serve files verbatim like a good little static host, and she can forward requests on to a FastCGI server such as php-fpm(8). multitasking icon behavior. ✨

generally speaking, http(8gx) also executed the Information Store, exmdb_provider(4gx) β€” which is a loadable module. yes "executed", that's what the page says, we're not going to argue with it, we're just reporting it fr fr. πŸ™ˆ


✨ Options ✨

  • -c config β€” read configuration directives from the given file. if you don't pass this, she'll read /etc/gromox/gromox.cfg and /etc/gromox/http.cfg β€” both of them, she's thorough. πŸ’–
  • -? β€” display the option summary. that's it, that's the flag. cute little question mark. πŸŽ€

✨ URI processing order ✨

this is the part where you learn exactly how a request gets juggled around. the order is not vibes-based, it's real:

  • Requests are passed to the mod_rewrite(4gx) module (built-in) so their URI can potentially get rewritten. ✏️
  • If a HTTP request is using the methods RPC_IN_DATA or RPC_OUT_DATA, the data stream gets handed off to the exchange_emsmdb(4gx) component. special delivery 🚚
  • Otherwise, the HTTP processing modules (HPM) are invoked. processing ends the moment one module signals that the request was handled. the order depends on the HPM list (which is fixed, no you can't reorder it): ews, mh_emsmdb, mh_nsp, oxdisco, oab.
  • Otherwise, the mod_fastcgi(4gx) module (built-in) is invoked. processing ends if this module handled the request.
  • Otherwise, the mod_cache(4gx) module (built-in) is invoked. processing ends if this module handled the request.
  • Otherwise? the request is rejected. πŸ’€ sorry bestie. that's the end of the line.

✨ RPC-over-HTTP ✨

RPC-over-HTTP utilizes two special HTTP methods: RPC_IN_DATA and RPC_OUT_DATA. these requests can, similarly to HTTP CONNECT, be very long-lived β€” like, stay on the phone for hours long-lived. the RPC data stream is handled by the included exchange_emsmdb(4gx) component. 🌈

heads up bestie: all the time-based command-line options and configuration file directives are subject to the syntax described in gromox(7), section "Duration specifications". so like, 1minute, 3 minutes, that whole language. ⏳

✨ Configuration directives (gromox.cfg) ✨

these are the directives she recognizes when reading from /etc/gromox/gromox.cfg, or when you used the -c option to point at a custom file. πŸ“‚

  • daemons_fd_limit β€” in gromox-http, this is treated as an alias for http_fd_limit. same thing, different name, we love a nickname. πŸ’«
  • http_basic_auth_cred_caching β€” perform credential caching for HTTP Basic. Default: 1minute
  • http_fd_limit β€” request that the file descriptor table be at least this large. the magic value 0 means the system default hard limit (rlim_max, cf. setrlimit(2)) should be used. Default: 0
  • http_listen β€” a space-separated list of bind address specifiers to expose HTTP on. Default: [::]:80
  • http_listen_tls β€” a space-separated list of bind address specifiers to expose implicit-TLS (HTTPS) on. Default: [::]:443
  • http_remote_host_hdr β€” the name of the HTTP request header which contains the actual client IPv6/IPv4 address. when a (reverse) proxy sits in front of gromox-http, the address gxhttp normally sees is the proxy address (e.g. ::1). if the proxy sets a custom header to convey the actual client address, Gromox can pick this up for its own reporting, which in turn is useful for e.g. fail2ban setups. Default: (empty)
  • istore_standalone β€” this directive is a mutual exclusion device between http(8gx) and istore(8gx), and controls which one of the two is in charge of running the mailbox engine. if this is set to no, http will be the one, and istore(8gx) has no function. Default: no

✨ Configuration directives (http.cfg) ✨

and these are the ones she recognizes when reading from /etc/gromox/http.cfg, or when the -c option points at a custom file. same deal, different file. πŸŽ€

  • block_interval_auths β€” the amount of time a user is blocked from connecting to the service after too many failed logins. sit down, be humble. Default: 1 minute
  • config_file_path β€” colon-separated list of directories which will be scanned when locating further configuration files, especially those used by subcomponent instances. (for example, mysql_adaptor(4gx) would be directed to look at /etc/gromox/http/mysql_adaptor.cfg before /etc/gromox/mysql_adaptor.cfg.) Default: /etc/gromox/http:/etc/gromox
  • context_average_mem β€” Default: 256K
  • context_num β€” Default: 400
  • data_file_path β€” colon-separated list of directories which will be scanned when locating data files. Default: /usr/share/gromox/http
  • fastcgi_exec_timeout β€” maximum execution time for CGI scripts. Default: 10 minutes
  • gss_program β€” the helper program to use for authenticating HTTP requests when Negotiate-SPNEGO headers are presented. the value is rudimentarily tokenized at whitespaces, and no special characters may be used. if necessary, write your own wrapper. the special value "internal-gss" uses libgssapi directly.

Negotiate was meant to carry GSS-API auth data (appearing as "Authorization: Negotiate YII..." in HTTP protocol dumps). NTLM can be wrapped in SPNEGO (also shows up as "YII"), but a handful of clients may also send raw NTLM tokens (appearing as "Authorization: Negotiate TlRMTVNT..."). whether raw NTLM tokens are accepted by internal-gss depends on your GSS library and, more broadly, your Kerberos setup. otherwise, you may need to use a helper program like the one from Squid. internal-gss also does not offer a way to specify a separate keytab or replay cache parameters, so use Squid's helper if you need such parameters.

Default: internal-gss

Example: /usr/lib/squid/negotiate_wrapper_auth --ntlm /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --kerberos /usr/lib/squid/negotiate_kerberos_auth -s GSS_C_NO_NAME

  • host_id β€” a unique identifier for this system. it's used for the Server HTTP responses header, for components like exmdb_provider(4gx), which makes use of it for SMTP HELO lines, for DSN report texts, for MIDB database/EML cache. the identifier should only use characters allowed for hostnames. Default: (system hostname)
  • http_auth_basic β€” enable HTTP Basic authentication. Default: yes
  • http_auth_spnego β€” enable HTTP Negotiate authentication. Default: no
  • http_auth_times β€” the number of login tries a user is allowed before the account is blocked. Default: 10
  • http_certificate_passwd β€” the password to unlock TLS certificates. Default: (unset)
  • http_certificate_path β€” a colon-separated list of TLS certificate files. the complete certificate chain should be present (as there is no other config directive to pull CA certs in, and implicit loading from system directories is not guaranteed by Gromox). no shortcuts bestie. Default: (unset)
  • http_conn_timeout β€” if a HTTP connection is inactive for the given period, the connection is terminated. Default: 3 minutes
  • http_debug β€” if set to 1, prints all incoming and outgoing HTTP traffic to stderr (not http_log_file!). πŸ‘€ Default: 0
  • http_enforce_auth β€” enforce authentication at all times. this is a debugging knob, not a lifestyle. Default: no
  • http_krb_service_principal β€” Kerberos service principal to use when gss_program=internal-gss. the form is often something like HTTP/fqdn@REALM, but may vary. when using an external GSS authentication helper, http_krb_service_principal has no effect, and any principal you want to use needs to be passed via the gss_program directive in some way. be Default: (empty)
(yes that be is genuinely sitting there at the end of the original line, bestie β€” we did not add it, we are simply honoring it. 😭)
  • http_listen_addr β€” deprecated in favor of gromox.cfg:http_listen / gromox.cfg:http_listen_tls. πŸ’€
  • http_listen_port β€” deprecated in favor of gromox.cfg:http_listen. πŸ’€
  • http_listen_tls_port β€” deprecated in favor of gromox.cfg:http_listen_tls. πŸ’€
  • http_log_file β€” target for log messages here. special values: "-" (stderr/syslog depending on parent PID) or "syslog" are recognized. Default: - (auto)
  • http_log_level β€” maximum verbosity of logging. 1=crit, 2=error, 3=warn, 4=notice, 5=info, 6=debug. Default: 4 (notice)
  • http_private_key_path β€” a colon-separated list of TLS certificate private key files. Default: (unset)
  • http_rqbody_flush_size β€” if the HTTP request to a CGI endpoint has a HTTP body larger than the limit given here, the data is buffered in a file rather than kept in memory. if the request uses Chunked Transfer Encoding, a file is used unconditionally. Default: 512K
  • http_rqbody_max_size β€” if the Content-Length of a HTTP request to a CGI endpoint is larger than this value, the request is rejected. 🚫 Default: 50M
  • http_support_tls β€” this flag controls whether (or not) the server offers TLS at all. the default is false because you need a certificate for this first. πŸ” Default: false
  • http_thread_charge_num β€” connection load factor (oversubscription ratio) for a processing thread. Default: 20
  • http_thread_init_num β€” the initial and also minimum number of client processing threads to keep around. this is similar to php-fpm's start_servers/min_spare_servere. (the maximum number of threads, i.e. what would be max_spare_servers, is determined by: context_num divided by http_thread_charge_num) Default: 5
  • msrpc_debug β€” log every completed RPC call and the return code of the operation in a minimal fashion to stderr. level 1 emits RPCs with a failure return code, level 2 emits all RPCs. note the daemon log level needs to be "debug" (6), too. ✨ Default: 0
  • request_max_mem β€” the maximum hint size for fragmented RPC PDU requests that will be allowed (C706 Β§12.6.3.7, MS-RPCE v33 Β§2.2.2.6). Default: 4M
  • tls_min_proto β€” the lowest TLS version to offer. possible values are: tls1.0, tls1.1, tls1.2, and, if supported by the system, tls1.3. Default: tls1.2
  • running_identity β€” an unprivileged user account to switch the process to after startup. to inhibit the switch, assign the empty value. Default: gromox
  • user_default_lang β€” Default: en

✨ SIGNALS ✨

Okay so signals, bestie β€” these are the little pokes http(8gx) listens for. 🫢

  • SIGHUP β€” when this lands, the configuration files are re-read. But plot twist: only a few select directives can actually be changed this way, because many parts do not implement reload. So don’t expect a full glow-up. πŸ’…
  • SIGUSR1 β€” when this lands, a dump of the currently active HTTP connections gets printed to stderr. Very β€œshow me the receipts” energy. πŸ‘€

πŸ“š NORMATIVE REFERENCES πŸ“š

The lore it’s built on, periodt:

  • MS-RPCE: Remote Procedure Call Protocol Extensions
  • DCERPC / C706: Technical Standard DCE 1.1: Remote Procedure Call by The Open Group, 1997

πŸ‘‘ SEE ALSO πŸ‘‘

Go read these next, iykyk:


And that’s the whole page, bestie β€” footer source/version/date vibes: Gromox, http(8gx), with the date exactly as the original footer says. πŸ’–βœ¨

πŸ“¦ where this page comes from