Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
NGHTTPX(1)			     nghttp2			      NGHTTPX(1)

NAME
     nghttpx - HTTP/2 proxy

SYNOPSIS
     nghttpx [OPTIONS]... [<PRIVATE_KEY> <CERT>]

DESCRIPTION
     A reverse proxy for HTTP/3, HTTP/2, and HTTP/1.

     <PRIVATE_KEY>
	    Set   path	 to   server's private	key.   Required  unless "no-tls"
	    parameter is used in --frontend option.

     <CERT>
	    Set  path  to  server's  certificate.    Required	unless	"no-tls"
	    parameter is  used in  --frontend option.

OPTIONS
     The options are categorized into several groups.

   Connections
     -b, --backend=(<HOST>,<PORT>|unix:<PATH>)[;[<PATTERN>[:...]][[;<PARAM>]...]
	    Set   backend   host  and	port.	The  multiple  backend addresses
	    are  accepted by repeating this  option.  UNIX domain socket  can be
	    specified	by   prefixing	  path	 name	with   "unix:"	  (e.g.,
	    unix:/var/run/backend.sock).

	    Optionally,  if  <PATTERN>s  are given, the backend address is  only
	    used  if  request matches  the  pattern.   The pattern  matching  is
	    closely   designed	to ServeMux  in net/http package of  Go program-
	    ming language.  <PATTERN> consists of  path, host +   path	or  just
	    host.    The  path	must start  with "/".  If  it ends with "/",  it
	    matches all  request path  in  its subtree.   To  deal with  the re-
	    quest  to the  directory without  trailing slash,	the  path  which
	    ends   with  "/"  also  matches  the request path which  only  lacks
	    trailing  '/'  (e.g.,  path  "/foo/" matches request path	"/foo").
	    If	it does  not end with "/", it  performs exact match against  the
	    request path.  If  host  is given,	it  performs  a  match	 against
	    the  request  host.    For a  request received on  the frontend lis-
	    tener with	"sni-fwd" parameter enabled, SNI  host is  used  instead
	    of	a request host.  If host alone is given, "/" is  appended to it,
	    so that it matches	all request paths  under the  host  (e.g., spec-
	    ifying  "nghttp2.org" equals  to "nghttp2.org/").	 CONNECT  method
	    is	treated specially.  It	does not have  path, and we  don't allow
	    empty path.  To workaround	this, we assume that CONNECT method  has
	    "/" as path.

	    Patterns  with  host take  precedence over	patterns with just path.
	    Then, longer patterns take	precedence over shorter ones.

	    Host  can  include "*"  in	the  left most	 position   to	indicate
	    wildcard  match   (only suffix  match is  done).  The "*" must match
	    at	 least	 one   character.    For   example,   host	 pattern
	    "*.nghttp2.org"	 matches      against	"www.nghttp2.org"    and
	    "git.ngttp2.org", but   does   not	match	against   "nghttp2.org".
	    The  exact	 hosts	 match	takes precedence over the wildcard hosts
	    match.

	    If path  part ends with  "*", it is treated  as wildcard path.   The
	    wildcard  path  behaves differently  from the normal path.	For nor-
	    mal path,  match is made around the boundary of path component  sep-
	    arator,"/".  On the other hand, the wildcard   path  does  not  take
	    into  account  the	path component	separator.  All paths which  in-
	    clude the wildcard	path  without  last  "*" as  prefix,   and   are
	    strictly  longer  than  wildcard  path without last "*" are matched.
	    "*"  must match  at least one  character.  For example,  the    pat-
	    tern   "/foo*"   matches	"/foo/"  and "/foobar".  But it does not
	    match "/foo", or "/fo".

	    If <PATTERN> is omitted or	empty string, "/" is  used  as	pattern,
	    which   matches   all  request   paths   (catch-all  pattern).   The
	    catch-all backend must be given.

	    When doing	a match, nghttpx made  some  normalization  to	pattern,
	    request  host  and path.  For host part, they are converted to lower
	    case.  For path part, percent-encoded unreserved characters  defined
	    in RFC 3986  are decoded, and  any	 dot-segments  (".."   and  ".")
	    are resolved and removed.

	    For   example,   -b'127.0.0.1,8080;nghttp2.org/httpbin/' matches the
	    request host "nghttp2.org" and  the request path "/httpbin/get", but
	    does  not  match the request host "nghttp2.org" and the request path
	    "/index.html".

	    The   multiple  <PATTERN>s	 can   be  specified,	delimiting  them
	    by			       ":".			      Specifying
	    -b'127.0.0.1,8080;nghttp2.org:www.nghttp2.org'  has  the  same   ef-
	    fect      to     specify	  -b'127.0.0.1,8080;nghttp2.org'     and
	    -b'127.0.0.1,8080;www.nghttp2.org'.

	    The backend addresses sharing same <PATTERN>  are  grouped	together
	    forming  load balancing  group.

	    Several parameters <PARAM> are accepted after <PATTERN>.  The  para-
	    meters   are    delimited	 by   ";".   The   available  parameters
	    are:	 "proto=<PROTO>",	    "tls",     "sni=<SNI_HOST>",
	    "fall=<N>", 	  "rise=<N>",	"affinity=<METHOD>",	  "dns",
	    "redirect-if-not-tls",			       "upgrade-scheme",
	    "mruby=<PATH>",  "read-timeout=<DURATION>",    "write-timeout=<DURA-
	    TION>",  "group=<GROUP>",	"group-weight=<N>",  "weight=<N>",   and
	    "dnf".     The  parameter	consists   of  keyword,   and optionally
	    followed by "="  and value.  For example, the  parameter  "proto=h2"
	    consists of the keyword "proto" and value "h2".  The parameter "tls"
	    consists  of  the keyword "tls"  without value.   Each parameter  is
	    described  as follows.

	    The backend application protocol  can be  specified  using	optional
	    "proto"    parameter,   and    in	the    form  of "proto=<PROTO>".
	    <PROTO> should be one of the following list  without  quotes:  "h2",
	    "http/1.1".   The  default value of <PROTO>  is   "http/1.1".   Note
	    that  usually "h2" refers to HTTP/2  over TLS.  But in this  option,
	    it may mean HTTP/2	over cleartext TCP unless  "tls" keyword is used
	    (see below).

	    TLS  can   be  enabled  by	specifying   optional  "tls"  parameter.
	    TLS is not enabled by default.

	    With  "sni=<SNI_HOST>" parameter, it can override the TLS SNI  field
	    value  with  given	<SNI_HOST>.   This  will default to the  backend
	    <HOST> name

	    The  feature  to detect  whether  backend  is online  or offline can
	    be	enabled   using  optional  "fall" and "rise" parameters.   Using
	    "fall=<N>"	parameter,  if	nghttpx cannot connect	to a  this back-
	    end <N>  times in  a row, this  backend  is   assumed   to	be   of-
	    fline,  and  it  is excluded from load balancing.  If <N> is 0, this
	    backend  never   be  excluded   from load  balancing whatever  times
	    nghttpx cannot connect  to it, and this  is the default.   There  is
	    also  "rise=<N>"  parameter.   After  backend was excluded from load
	    balancing group, nghttpx periodically attempts to make a  connection
	    to	the failed backend, and if the	connection is made  successfully
	    <N> times  in a row, the backend is assumed to  be online, and it is
	    now eligible  for load  balancing target.	If <N>	is 0,  a backend
	    is permanently  offline, once  it goes  in that state, and	this  is
	    the default behaviour.

	    The      session	  affinity     is      enabled	   using "affin-
	    ity=<METHOD>"  parameter.	If  "ip" is  given  in <METHOD>,  client
	    IP	based  session	affinity   is enabled.	If "cookie"  is given in
	    <METHOD>,  cookie based session affinity is  enabled.  If  "none" is
	    given  in <METHOD>, session affinity  is disabled, and this  is  the
	    default.   The  session  affinity is  enabled per <PATTERN>.   If at
	    least  one backend	has  "affinity"  parameter, and  its <METHOD> is
	    not "none",  session affinity is enabled for  all  backend	 servers
	    sharing the same  <PATTERN>.  It is advised  to  set  "affinity" pa-
	    rameter   to   all	 backend  explicitly if session affinity  is de-
	    sired.  The session affinity  may	break  if   one  of  the   back-
	    end  gets unreachable,  or	 backend  settings  are    reloaded   or
	    replaced by API.

	    If	  "affinity=cookie"    is   used,    the   additional configura-
	    tion		    is			  required.	 "affin-
	    ity-cookie-name=<NAME>"  must  be	used  to  specify  a name     of
	    cookie	     to 	 use.		Optionally,	 "affin-
	    ity-cookie-path=<PATH>"  can   be  used  to   specify a path   which
	    cookie     is    applied.	  The	 optional   "affinity-cookie-se-
	    cure=<SECURE>"   controls	the   Secure attribute of a cookie.  The
	    default value is "auto", and the Secure attribute is  determined  by
	    a  request	scheme.  If a request scheme is "https", then Secure at-
	    tribute is set.  Otherwise, it  is not set.  If  <SECURE> is  "yes",
	    the  Secure attribute  is  always set.   If <SECURE>  is "no",   the
	    Secure   attribute	is   always   omitted.	"affinity-cookie-sticki-
	    ness=<STICKINESS>"	      controls	stickiness  of	 this  affinity.
	    If	 <STICKINESS>  is "loose", removing or adding a  backend  server
	    might break the affinity  and the  request might  be forwarded  to a
	    different  backend	server.    If <STICKINESS> is "strict", removing
	    the designated  backend server  breaks  affinity,  but  adding   new
	    backend  server does  not cause breakage.  If  the designated  back-
	    end server	becomes unavailable, new backend server is chosen  as if
	    the request does not have  an  affinity  cookie.   <STICKINESS>  de-
	    faults  to "loose".

	    By default, name resolution of backend host name is done  at   start
	    up,  or reloading  configuration.	If  "dns" parameter   is  given,
	    name   resolution	 takes	 place	dynamically.  This is useful  if
	    backend address changes frequently.   If   "dns"   is  given,   name
	    resolution	 of  backend	host   name   at  start   up,	or   re-
	    loading configuration is skipped.

	    If "redirect-if-not-tls" parameter	is  used,  the	matched  backend
	    requires	that   frontend   connection   is  TLS encrypted.  If it
	    isn't, nghttpx responds to the request with 308   status  code,  and
	    https  URI	the   client should use instead  is included in Location
	    header field.  The port number in  redirect URI is 443 by	default,
	    and  can  be   changed  using  --redirect-https-port option.   If at
	    least one  backend has  "redirect-if-not-tls" parameter,  this  fea-
	    ture  is enabled  for all backend servers sharing the   same   <PAT-
	    TERN>.    It    is	 advised   to	set "redirect-if-no-tls"     pa-
	    rameter    to     all    backends  explicitly if this feature is de-
	    sired.

	    If "upgrade-scheme"  parameter is used along  with "tls"  parameter,
	    HTTP/2 :scheme pseudo header field is changed to "https" from "http"
	    when  forwarding  a  request to this particular backend.  This is  a
	    workaround for a backend server  which   requires	"https"  :scheme
	    pseudo  header field on TLS encrypted connection.

	    "mruby=<PATH>"   parameter	 specifies   a	 path	to  mruby script
	    file  which  is  invoked when  this  pattern  is matched.  All back-
	    ends which share the same pattern must have the same mruby path.

	    "read-timeout=<DURATION>" and "write-timeout=<DURATION>"  parameters
	    specify  the   read  and   write  timeout  of the backend connection
	    when this  pattern is  matched.  All backends which share  the  same
	    pattern  must  have  the  same timeouts.  If these timeouts  are en-
	    tirely  omitted  for  a  pattern,		  --backend-read-timeout
	    and --backend-write-timeout are used.

	    "group=<GROUP>"   parameter specifies  the name  of group this back-
	    end address belongs to.  By default, it belongs to	the unnamed  de-
	    fault group.   The	name   of  group   is  unique	 per	pattern.
	    "group-weight=<N>"	  parameter specifies the  weight of  the group.
	    The  higher weight gets  more frequently   selected   by   the  load
	    balancing algorithm.  <N> must be  [1, 256] inclusive.  The weight 8
	    has  4 times more weight  than 2.  <N> must be the same for  all ad-
	    dresses  which  share the	same  <GROUP>.	  If  "group-weight"  is
	    omitted  in  an  address,  but the other address  which  belongs  to
	    the  same  group  specifies  "group-weight",    its     weight    is
	    used.      If    no  "group-weight"   is   specified   for	all  ad-
	    dresses,   the  weight  of	a  group   becomes   1.    "group"   and
	    "group-weight" are ignored if session affinity is enabled.

	    "weight=<N>"   parameter   specifies   the	 weight  of  the backend
	    address  inside  a	group  which  this  address  belongs   to.   The
	    higher   weight  gets more	frequently selected by	the load balanc-
	    ing algorithm.   <N> must be [1,  256] inclusive.	 The   weight  8
	    has   4  times  more weight  than weight  2.  If  this parameter  is
	    omitted, weight  becomes  1.   "weight"  is   ignored   if	 session
	    affinity is enabled.

	    If	"dnf"  parameter  is  specified, an incoming request is not for-
	    warded to a backend  and just consumed along with the  request  body
	    (actually  a   backend server  never be contacted).  It  is expected
	    that  the  HTTP   response	is  generated  by  mruby   script   (see
	    "mruby=<PATH>"  parameter  above).	 "dnf" is an abbreviation of "do
	    not forward".

	    Since ";" and ":" are  used as delimiter, <PATTERN> must not contain
	    these characters.  In order  to include ":" in  <PATTERN>,	one  has
	    to	specify  "%3A"	(which	is percent-encoded  from  of   ":")  in-
	    stead.    Since  ";"   has	special  meaning  in shell,  the  option
	    value must	be quoted.

	    Default: 127.0.0.1,80

     -f, --frontend=(<HOST>,<PORT>|unix:<PATH>)[[;<PARAM>]...]
	    Set  frontend  host and  port.   If  <HOST>  is   '*',   it  assumes
	    all addresses  including  both  IPv4 and  IPv6.  UNIX domain  socket
	    can   be  specified  by   prefixing  path name  with  "unix:" (e.g.,
	    unix:/var/run/nghttpx.sock).  This	option can   be  used	multiple
	    times  to listen  to multiple addresses.

	    This  option   can take  0 or  more parameters,  which are described
	    below.   Note   that  "api"  and  "healthmon" parameters  are  mutu-
	    ally exclusive.

	    Optionally,  TLS  can be disabled by  specifying "no-tls" parameter.
	    TLS is enabled by default.

	    If "sni-fwd" parameter is  used, when performing a match to select a
	    backend server,  SNI host name received from  the  client	is  used
	    instead  of  the request  host.  See --backend option about the pat-
	    tern match.

	    To	make this  frontend as	API endpoint,  specify "api"  parameter.
	    This   is  disabled  by  default.	 It  is important  to  limit the
	    access   to  the API  frontend.  Otherwise, someone  may change  the
	    backend  server, and break your services,	or  expose  confidential
	    information to the outside the world.

	    To	 make	this   frontend   as  health  monitor  endpoint, specify
	    "healthmon"  parameter.   This is  disabled  by default.   Any   re-
	    quests  which  come  through  this address are replied with 200 HTTP
	    status, without no body.

	    To accept  PROXY protocol  version 1  and 2  on frontend connection,
	    specify  "proxyproto" parameter.   This  is disabled by default.

	    To	receive   HTTP/3  (QUIC)  traffic,   specify  "quic"  parameter.
	    It	 makes	nghttpx  listen  on   UDP  port rather than  TCP   port.
	    UNIX   domain  socket,   "api",  and "healthmon"  parameters  cannot
	    be	used  with  "quic" parameter.

	    Default: *,3000

     --backlog=<N>
	    Set listen backlog size.

	    Default: 65536

     --backend-address-family=(auto|IPv4|IPv6)
	    Specify  address  family  of  backend  connections.   If  "auto"  is
	    given,  both  IPv4	 and  IPv6 are considered.  If "IPv4" is  given,
	    only  IPv4 address is  considered.	If "IPv6" is  given,  only  IPv6
	    address is considered.

	    Default: auto

     --backend-http-proxy-uri=<URI>
	    Specify	    proxy	   URI	      in	 the	    form
	    <http:/>/[<USER>:<PASS>@]<PROXY>:<PORT>.	If   a	 proxy	requires
	    authentication,  specify  <USER>  and  <PASS>.  Note that  they must
	    be	properly  percent-encoded.  This proxy	is used  when the  back-
	    end connection  is HTTP/2.	First,	make   a  CONNECT   request   to
	    the proxy  and  it connects  to the  backend  on behalf  of nghttpx.
	    This  forms  tunnel.   After  that, nghttpx  performs  SSL/TLS hand-
	    shake with	the downstream through the  tunnel.  The  timeouts  when
	    connecting	and   making  CONNECT request can be	 specified    by
	    --backend-read-timeout    and --backend-write-timeout options.

   Performance
     -n, --workers=<N>
	    Set the number of worker threads.

	    Default: 1

     --single-thread
	    Run everything in one   thread  inside  the  worker  process.   This
	    feature    is    provided	for   better   debugging experience,  or
	    for  the platforms	which  lack  thread support.   If  threading  is
	    disabled,  this  option  is always enabled.

     --read-rate=<SIZE>
	    Set maximum  average read  rate on	frontend connection.  Setting  0
	    to this option means read rate is unlimited.

	    Default: 0

     --read-burst=<SIZE>
	    Set  maximum read  burst  size  on frontend  connection.  Setting  0
	    to this  option  means  read burst	size  is unlimited.

	    Default: 0

     --write-rate=<SIZE>
	    Set  maximum  average write rate on  frontend connection.  Setting 0
	    to this option means write rate is unlimited.

	    Default: 0

     --write-burst=<SIZE>
	    Set  maximum write	burst size  on frontend  connection.  Setting  0
	    to	this  option means  write  burst size  is unlimited.

	    Default: 0

     --worker-read-rate=<SIZE>
	    Set maximum average read rate on  frontend	connection  per  worker.
	    Setting   0 to  this option  means read  rate is unlimited.  Not im-
	    plemented yet.

	    Default: 0

     --worker-read-burst=<SIZE>
	    Set maximum  read burst size on   frontend	connection  per  worker.
	    Setting  0	to this  option means read burst size is unlimited.  Not
	    implemented yet.

	    Default: 0

     --worker-write-rate=<SIZE>
	    Set maximum  average write	rate on  frontend connection per worker.
	    Setting  0 to this option  means write rate is unlimited.	Not  im-
	    plemented yet.

	    Default: 0

     --worker-write-burst=<SIZE>
	    Set  maximum  write  burst	 size on frontend connection per worker.
	    Setting 0 to this option means write burst size is	unlimited.   Not
	    implemented yet.

	    Default: 0

     --worker-frontend-connections=<N>
	    Set  maximum  number   of simultaneous connections frontend accepts.
	    Setting 0 means unlimited.

	    Default: 0

     --backend-connections-per-host=<N>
	    Set  maximum number  of   backend  concurrent   connections  (and/or
	    streams  in   case	 of  HTTP/2)  per origin  host.  This option  is
	    meaningful when --http2-proxy  option is used.   The   origin   host
	    is	determined  by	authority portion of  request URI (or :authority
	    header field for HTTP/2).	To  limit  the	 number  of  connections
	    per frontend	for	  default	 mode,	     use --back-
	    end-connections-per-frontend.

	    Default: 8

     --backend-connections-per-frontend=<N>
	    Set   maximum  number   of	 backend concurrent  connections (and/or
	    streams  in case of HTTP/2)  per frontend.	This option   is    only
	    used  for  default	 mode.	 0  means unlimited.  To limit the  num-
	    ber  of connections per host with	       --http2-proxy	     op-
	    tion,	   use --backend-connections-per-host.

	    Default: 0

     --rlimit-nofile=<N>
	    Set maximum number of open files (RLIMIT_NOFILE) to <N>.   If  0  is
	    given, nghttpx does not set the limit.

	    Default: 0

     --rlimit-memlock=<N>
	    Set  maximum number of bytes of memory that may be locked into  RAM.
	    If	0 is  given,  nghttpx does  not set  the limit.

	    Default: 0

     --backend-request-buffer=<SIZE>
	    Set buffer size used to store backend request.

	    Default: 16K

     --backend-response-buffer=<SIZE>
	    Set buffer size used to store backend response.

	    Default: 128K

     --fastopen=<N>
	    Enables  "TCP Fast	Open" for  the listening  socket and limits  the
	    maximum  length for the  queue of connections that have not yet com-
	    pleted the three-way handshake.  If value is 0  then  fast	open  is
	    disabled.

	    Default: 0

     --no-kqueue
	    Don't  use	 kqueue.  This	option is only	applicable for the plat-
	    forms  which have kqueue.  For  other platforms, this option will be
	    simply ignored.

   Timeout
     --frontend-http2-idle-timeout=<DURATION>
	    Specify idle timeout for HTTP/2 frontend connection.  If  no  active
	    streams exist for this duration, connection is closed.

	    Default: 3m

     --frontend-http3-idle-timeout=<DURATION>
	    Specify  idle  timeout for HTTP/3 frontend connection.  If no active
	    streams exist for this duration, connection is closed.

	    Default: 3m

     --frontend-write-timeout=<DURATION>
	    Specify write timeout for all frontend connections.

	    Default: 30s

     --frontend-keep-alive-timeout=<DURATION>
	    Specify   keep-alive   timeout   for   frontend   HTTP/1 connection.

	    Default: 1m

     --frontend-header-timeout=<DURATION>
	    Specify  duration  that the  server  waits	 for  an   HTTP  request
	    header  fields  to be  received completely.   On timeout, HTTP/1 and
	    HTTP/2  connections are closed.  For HTTP/3,  the  stream  is  shut-
	    down,  and	the  connection itself is left intact.

	    Default: 1m

     --stream-read-timeout=<DURATION>
	    Specify  read timeout  for HTTP/2  streams.  0  means no timeout.

	    Default: 0

     --stream-write-timeout=<DURATION>
	    Specify write  timeout for	HTTP/2 streams.  0  means no timeout.

	    Default: 1m

     --backend-read-timeout=<DURATION>
	    Specify read timeout for backend connection.

	    Default: 1m

     --backend-write-timeout=<DURATION>
	    Specify write timeout for backend connection.

	    Default: 30s

     --backend-connect-timeout=<DURATION>
	    Specify  timeout before  establishing TCP  connection to backend.

	    Default: 30s

     --backend-keep-alive-timeout=<DURATION>
	    Specify   keep-alive   timeout    for   backend   HTTP/1 connection.

	    Default: 2s

     --listener-disable-timeout=<DURATION>
	    After accepting  connection failed,  connection listener is disabled
	    for a given  amount of time.   Specifying 0 disables this feature.

	    Default: 30s

     --frontend-http2-setting-timeout=<DURATION>
	    Specify  timeout before  SETTINGS ACK  is received	from client.

	    Default: 10s

     --backend-http2-settings-timeout=<DURATION>
	    Specify   timeout  before	SETTINGS  ACK  is received  from backend
	    server.

	    Default: 10s

     --backend-max-backoff=<DURATION>
	    Specify  maximum backoff   interval.   This   is  used   when  doing
	    health   check  against  offline  backend  (see "fail" parameter  in
	    --backend  option).   It is  also used  to limit  the  maximum   in-
	    terval  to	temporarily  disable backend  when  nghttpx   failed  to
	    connect  to   it.  These intervals are calculated  using exponential
	    backoff, and consecutive  failed  attempts	increase  the  interval.
	    This option caps its maximum value.

	    Default: 2m

   SSL/TLS
     --ciphers=<SUITE>
	    Set  allowed   cipher list	for frontend  connection.  The format of
	    the string is described in OpenSSL ciphers(1).  This   option   sets
	    cipher   suites  for  TLSv1.2.   Use --tls13-ciphers for TLSv1.3.

	    Default:
	    ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384

     --tls13-ciphers=<SUITE>
	    Set  allowed   cipher list	for frontend  connection.  The format of
	    the string is described in OpenSSL ciphers(1).  This   option   sets
	    cipher   suites  for  TLSv1.3.   Use --ciphers for TLSv1.2.

	    Default:
	    TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

     --client-ciphers=<SUITE>
	    Set   allowed  cipher  list for  backend connection.   The format of
	    the string is described in OpenSSL ciphers(1).  This   option   sets
	    cipher    suites   for   TLSv1.2.	 Use  --tls13-client-ciphers for
	    TLSv1.3.

	    Default:
	    ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384

     --tls13-client-ciphers=<SUITE>
	    Set  allowed cipher  list for  backend connection.	 The  format  of
	    the  string  is described in OpenSSL ciphers(1).  This  option  sets
	    cipher   suites  for  TLSv1.3.   Use --client-ciphers for TLSv1.2.

	    Default:
	    TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

     --groups=<LIST>
	    Set the  supported group list for  frontend connections.  <LIST>  is
	    a  colon separated list of group  NID or names in the preference or-
	    der.   The supported curves depend on the  linked  OpenSSL	library.
	    This  function  requires OpenSSL >= 1.0.2.

	    Default: X25519:P-256:P-384:P-521

     -k, --insecure
	    Don't  verify backend  server's  certificate  if TLS  is enabled for
	    backend connections.

     --cacert=<PATH>
	    Set path to trusted CA  certificate file.  It  is  used  in  backend
	    TLS connections  to verify	peer's certificate.  The file must be in
	    PEM  format.   It can contain multiple certificates.  If  the linked
	    OpenSSL is	configured to load  system   wide   certificates,   they
	    are  loaded  at startup regardless of this option.

     --private-key-passwd-file=<PATH>
	    Path   to  file   that  contains  password for  the server's private
	    key.   If none is  given and the private  key is password  protected
	    it'll be requested interactively.

     --subcert=<KEYPATH>:<CERTPATH>[[;<PARAM>]...]
	    Specify   additional  certificate	and  private key  file.  nghttpx
	    will  choose certificates based on	the hostname indicated by client
	    using TLS SNI extension.  If nghttpx is built with OpenSSL >= 1.0.2,
	    the signature algorithms (e.g., ECDSA+SHA256) presented  by   client
	    are  also  taken  into  consideration.  This allows  nghttpx to send
	    ML-DSA or ECDSA  certificate to  modern clients,  while sending  RSA
	    based  certificate to older clients.  This option can be used multi-
	    ple times.

	    Additional parameter  can be specified in  <PARAM>.   The  available
	    <PARAM> is "sct-dir=<DIR>".

	    "sct-dir=<DIR>"   specifies  the   path to	directory which contains
	    *.sct	 files	       for	   TLS	signed_certificate_time-
	    stamp  extension (RFC 6962).  This feature	 requires   OpenSSL   >=
	    1.0.2.    See   also --tls-sct-dir option.

     --dh-param-file=<PATH>
	    Path to file that contains	DH parameters in  PEM  format.	 Without
	    this   option,  DHE   cipher  suites   are	not available.

     --alpn-list=<LIST>
	    Comma delimited list of  ALPN protocol identifier sorted in the  or-
	    der  of  preference.   That   means  most  desirable  protocol comes
	    first.  The parameter must	be delimited by a single comma only  and
	    any white spaces are treated as a part of protocol string.

	    Default: h2,http/1.1

     --verify-client
	    Require and verify client certificate.

     --verify-client-cacert=<PATH>
	    Path  to file  that contains  CA certificates  to verify client cer-
	    tificate.  The file must be in PEM format.	It can contain	multiple
	    certificates.

     --verify-client-tolerate-expired
	    Accept  expired  client  certificate.   Operator  should handle  the
	    expired  client  certificate  by some  means (e.g.,  mruby	script).
	    Otherwise, this  option  might cause a security risk.

     --client-private-key-file=<PATH>
	    Path  to   file  that  contains  client private key  used in backend
	    client authentication.

     --client-cert-file=<PATH>
	    Path to  file that	contains client  certificate   used  in  backend
	    client authentication.

     --tls-min-proto-version=<VER>
	    Specify  minimum  SSL/TLS  protocol.    The name matching is done in
	    case-insensitive manner.  The  versions between --tls-min-proto-ver-
	    sion and  --tls-max-proto-version are enabled.  If the protocol list
	    advertised by client does not  overlap  this range,  you  will   re-
	    ceive the  error message "unknown protocol".  The available versions
	    are: TLSv1.3 and TLSv1.2

	    Default: TLSv1.2

     --tls-max-proto-version=<VER>
	    Specify  maximum  SSL/TLS  protocol.    The name matching is done in
	    case-insensitive manner.  The  versions between --tls-min-proto-ver-
	    sion and  --tls-max-proto-version are enabled.  If the protocol list
	    advertised by client does not  overlap  this range,  you  will   re-
	    ceive the  error message "unknown protocol".  The available versions
	    are: TLSv1.3 and TLSv1.2

	    Default: TLSv1.3

     --tls-ticket-key-file=<PATH>
	    Path  to  file  that  contains  random data to construct TLS session
	    ticket     parameters.     If    aes-128-cbc    is	    given     in
	    --tls-ticket-key-cipher,   the    file   must   contain  exactly  48
	    bytes.	  If	    aes-256-cbc        is	 given	      in
	    --tls-ticket-key-cipher,  the  file must  contain exactly 80  bytes.
	    This  options  can be  used  repeatedly  to specify  multiple ticket
	    parameters.  If  several files are given,  only the   first  key  is
	    used  to   encrypt	TLS session  tickets.  Other  keys are	accepted
	    but  server will  issue new  session  ticket with  first key.   This
	    allows  session  key  rotation.  Please  note   that   key	rotation
	    does   not	 occur automatically.	User  should rearrange	files or
	    change options  values and	restart nghttpx gracefully.   If opening
	    or reading	given file fails, all loaded  keys are discarded and  it
	    is treated as if none  of this option is given.  If  this option  is
	    not  given	or  an	error  occurred while opening or reading a file,
	    key is  generated every  1 hour  internally and they are  valid  for
	    12	hours.	  This	is   recommended if ticket  key sharing  between
	    nghttpx  instances is  not required.

     --tls-ticket-key-memcached=<HOST>,<PORT>[;tls]
	    Specify address  of memcached  server to get  TLS  ticket  keys  for
	    session  resumption.    This  enables  shared TLS ticket key between
	    multiple nghttpx instances.  nghttpx does not set TLS ticket  key to
	    memcached.	The external ticket key generator is required.	 nghttpx
	    just gets TLS ticket  keys	from  memcached, and  use  them,  possi-
	    bly  replacing current set	of keys.  It is up  to extern TLS ticket
	    key generator   to	rotate	 keys  frequently.    See  "TLS  SESSION
	    TICKET  RESUMPTION"  section in  manual page to know the data format
	    in memcached entry.  Optionally, memcached	connection  can  be  en-
	    crypted  with  TLS	by specifying "tls" parameter.

     --tls-ticket-key-memcached-address-family=(auto|IPv4|IPv6)
	    Specify address  family of memcached connections  to get TLS  ticket
	    keys.   If	"auto" is given, both IPv4 and IPv6 are considered.   If
	    "IPv4" is given,  only IPv4 address is  considered.   If  "IPv6"  is
	    given, only IPv6 address is considered.

	    Default: auto

     --tls-ticket-key-memcached-interval=<DURATION>
	    Set interval to get TLS ticket keys from memcached.

	    Default: 10m

     --tls-ticket-key-memcached-max-retry=<N>
	    Set   maximum   number  of	consecutive   retries  before abandoning
	    TLS ticket key  retrieval.	If this number is reached,  the  attempt
	    is considered  as  failure,  and "failure" count  is incremented  by
	    1,	   which    contributed   to		  the		   value
	    controlled --tls-ticket-key-memcached-max-fail option.

	    Default: 3

     --tls-ticket-key-memcached-max-fail=<N>
	    Set  maximum   number  of  consecutive   failure   before  disabling
	    TLS ticket until next scheduled key retrieval.

	    Default: 2

     --tls-ticket-key-cipher=<CIPHER>
	    Specify  cipher   to  encrypt  TLS	session  ticket.  Specify either
	    aes-128-cbc   or  aes-256-cbc.    By   default, aes-128-cbc is used.

     --tls-ticket-key-memcached-cert-file=<PATH>
	    Path to client certificate	for memcached  connections  to	get  TLS
	    ticket keys.

     --tls-ticket-key-memcached-private-key-file=<PATH>
	    Path  to  client  private	key for memcached connections to get TLS
	    ticket keys.

     --tls-dyn-rec-warmup-threshold=<SIZE>
	    Specify the  threshold size for TLS  dynamic record size  behaviour.
	    During   a	TLS  session, after  the threshold number of bytes  have
	    been written, the  TLS record size will be increased to the  maximum
	    allowed  (16K).   The  max	record size will  continue to be used on
	    the  active  TLS  session.	 After	 --tls-dyn-rec-idle-timeout  has
	    elapsed,  the  record  size is reduced  to 1300 bytes.  Specify 0 to
	    always use	the maximum record size,   regardless  of  idle  period.
	    This   behaviour   applies	  to  all  TLS	based frontends, and TLS
	    HTTP/2 backends.

	    Default: 1M

     --tls-dyn-rec-idle-timeout=<DURATION>
	    Specify  TLS  dynamic   record    size   behaviour	 timeout.    See
	    --tls-dyn-rec-warmup-threshold   for    more  information.	This be-
	    haviour  applies to all TLS  based frontends, and TLS  HTTP/2  back-
	    ends.

	    Default: 1s

     --no-http2-cipher-block-list
	    Allow  block  listed  cipher suite	on  frontend  HTTP/2 connection.
	    See  <https://tools.ietf.org/html/rfc7540#appendix-A>  for	the com-
	    plete HTTP/2 cipher suites block list.

     --client-no-http2-cipher-block-list
	    Allow  block  listed  cipher  suite  on  backend  HTTP/2 connection.
	    See <https://tools.ietf.org/html/rfc7540#appendix-A>  for  the  com-
	    plete HTTP/2 cipher suites block list.

     --tls-sct-dir=<DIR>
	    Specifies  the   directory	where	*.sct  files   exist.  All *.sct
	    files   in	<DIR>	are   read,   and  sent   as  extension_data  of
	    TLS  signed_certificate_timestamp  (RFC  6962)   to  client.   These
	    *.sct  files  are  for  the  certificate	specified    in    posi-
	    tional    command-line  argument  <CERT>,  or  certificate option in
	    configuration file.   For	additional  certificates,   use   --sub-
	    cert option.  This option requires OpenSSL >= 1.0.2.

     --psk-secrets=<PATH>
	    Read list of PSK identity and secrets from <PATH>.	This is used for
	    frontend connection.  The each line of input file  is  formatted  as
	    <identity>:<hex-secret>,   where  <identity>  is   PSK identity, and
	    <hex-secret>  is secret in hex.  An   empty  line,	and  line  which
	    starts with '#' are skipped.  The default  enabled cipher list might
	    not  contain any PSK cipher suite.	In that case, desired PSK cipher
	    suites  must be  enabled using  --ciphers option.  The  desired  PSK
	    cipher  suite   may  be   block  listed  by HTTP/2.   To  use  those
	    cipher  suites  with   HTTP/2,  consider   to   use   --no-http2-ci-
	    pher-block-list  option.  But be aware its implications.

     --client-psk-secrets=<PATH>
	    Read PSK identity and secrets from <PATH>.	This is used for backend
	    connection.   The  each   line of input file is formatted  as <iden-
	    tity>:<hex-secret>,  where <identity> is PSK identity, and	<hex-se-
	    cret>  is secret in hex.  An empty line, and line which  starts with
	    '#' are skipped.  The first identity and  secret pair encountered is
	    used.   The default  enabled cipher  list might not  contain any PSK
	    cipher suite.   In	that case,  desired PSK  cipher suites	must  be
	    enabled  using   --client-ciphers  option.	The  desired PSK  cipher
	    suite  may be  block listed  by HTTP/2.   To   use	 those	  cipher
	    suites   with   HTTP/2,  consider	 to  use   --client-no-http2-ci-
	    pher-block-list option.  But be aware its implications.

     --tls-no-postpone-early-data
	    By	default,   except  for	QUIC   connections,   nghttpx  postpones
	    forwarding	 HTTP  requests  sent  in   early data, including  those
	    sent in  partially	in  it, until  TLS handshake  finishes.  If  all
	    backend  server recognizes "Early-Data"  header  field,  using  this
	    option  makes nghttpx  not postpone   forwarding  request	and  get
	    full potential of 0-RTT data.

     --tls-max-early-data=<SIZE>
	    Sets  the  maximum	amount	of 0-RTT  data	that  server accepts.

	    Default: 16K

     --tls-ktls
	    Enable ktls.

     --ech-config-file=<PATH>
	    Read  Encrypted   Client  Hello  (ECH)   server  configuration  from
	    <PATH>.  See --ech-retry-config-file for details.

     --ech-retry-config-file=<PATH>
	    This option and   --ech-config-file  option  read  Encrypted  Client
	    Hello  (ECH)  server configuration from <PATH>.  If --ech-retry-con-
	    fig-file is used,  the configurations are  included  in   the  retry
	    configurations.   The  file format must  be PEM  ECH  file described
	    in	RFC 9934.   These options can  be used repeatedly to  read  mul-
	    tiple  files.   --ech-retry-config-file  must be used  at least once
	    when enabling ECH.

   HTTP/2
     -c, --frontend-http2-max-concurrent-streams=<N>
	    Set the maximum number of  the concurrent streams  in  one	frontend
	    HTTP/2 session.

	    Default: 100

     --backend-http2-max-concurrent-streams=<N>
	    Set  the  maximum  number  of  the concurrent streams in one backend
	    HTTP/2 session.   This sets  maximum number   of  concurrent  opened
	    pushed  streams.   The maximum number of concurrent requests are set
	    by a remote server.

	    Default: 100

     --frontend-http2-window-size=<SIZE>
	    Sets  the  per-stream  initial  window  size   of	HTTP/2	frontend
	    connection.

	    Default: 65535

     --frontend-http2-connection-window-size=<SIZE>
	    Sets the  per-connection window size of  HTTP/2 frontend connection.

	    Default: 65535

     --backend-http2-window-size=<SIZE>
	    Sets  the	initial  window   size	of   HTTP/2  backend connection.

	    Default: 65535

     --backend-http2-connection-window-size=<SIZE>
	    Sets the  per-connection window  size of  HTTP/2 backend connection.

	    Default: 2147483647

     --http2-no-cookie-crumbling
	    Don't crumble cookie header field.

     --padding=<N>
	    Add   at  most   <N> bytes	to  a HTTP/2  frame payload  as padding.
	    Specify 0 to  disable padding.  This option is meant  for  debugging
	    purpose  and not intended to enhance protocol security.

     --no-server-push
	    Disable  HTTP/2  server  push.   Server push is supported by default
	    mode and HTTP/2  frontend via Link header field.  It is   also  sup-
	    ported  if	 both  frontend and  backend are HTTP/2 in default mode.
	    In	this case, server push from backend session is relayed	to fron-
	    tend, and server push via Link header field is also supported.

     --frontend-http2-optimize-write-buffer-size
	    (Experimental) Enable write  buffer size  optimization  in	frontend
	    HTTP/2  TLS   connection.	This  optimization aims to reduce  write
	    buffer  size so  that it  only contains bytes  which can  send imme-
	    diately.   This makes  server more responsive to prioritized  HTTP/2
	    stream because the buffering  of lower  priority stream  is reduced.
	    This option is only effective on recent Linux platform.

     --frontend-http2-optimize-window-size
	    (Experimental)   Automatically  tune   connection  level window size
	    of	frontend   HTTP/2  TLS connection.  If this feature is	enabled,
	    connection window size  starts with the    default	 window    size,
	    65535   bytes.     nghttpx automatically  adjusts connection  window
	    size  based on TCP receiving  window size.	The maximum  window size
	    is capped	   by	   the	   value      specified      by  --fron-
	    tend-http2-connection-window-size.	   Since   the stream is subject
	    to	stream	level  window  size, it should be adjusted using --fron-
	    tend-http2-window-size option as well.   This option  is  only   ef-
	    fective on	recent Linux platform.

     --frontend-http2-encoder-dynamic-table-size=<SIZE>
	    Specify  the  maximum  dynamic   table  size of HPACK encoder in the
	    frontend HTTP/2 connection.  The  decoder  (client)  specifies   the
	    maximum   dynamic  table  size it  accepts.  Then the negotiated dy-
	    namic table size is the minimum of this option value and  the  value
	    which client specified.

	    Default: 4K

     --frontend-http2-decoder-dynamic-table-size=<SIZE>
	    Specify  the  maximum  dynamic   table  size of HPACK decoder in the
	    frontend HTTP/2 connection.

	    Default: 4K

     --backend-http2-encoder-dynamic-table-size=<SIZE>
	    Specify the maximum dynamic  table size  of  HPACK	encoder  in  the
	    backend  HTTP/2  connection.   The	decoder (backend) specifies  the
	    maximum  dynamic table  size it  accepts.  Then the  negotiated  dy-
	    namic  table  size is the minimum of this option value and the value
	    which backend specified.

	    Default: 4K

     --backend-http2-decoder-dynamic-table-size=<SIZE>
	    Specify the maximum dynamic  table size  of  HPACK	decoder  in  the
	    backend HTTP/2 connection.

	    Default: 4K

   Mode
     (default mode)
	    Accept   HTTP/2,   and  HTTP/1.1 over  SSL/TLS.   "no-tls" parameter
	    is	used in  --frontend option,  accept  HTTP/2  and  HTTP/1.1  over
	    cleartext  TCP.  The incoming HTTP/1.1 connection  can  be	upgraded
	    to	HTTP/2	through  HTTP Upgrade.

     -s, --http2-proxy
	    Like  default  mode,  but  enable  forward proxy.  This is so called
	    HTTP/2 proxy mode.

   Logging
     -L, --log-level=<LEVEL>
	    Set the severity  level of log output.    <LEVEL>  must  be  one  of
	    INFO, NOTICE, WARN, ERROR and FATAL.

	    Default: NOTICE

     --accesslog-file=<PATH>
	    Set  path  to write access log.  To reopen file, send USR1 signal to
	    nghttpx.

     --accesslog-syslog
	    Send  access log  to syslog.   If this  option is	used,  --access-
	    log-file option is ignored.

     --accesslog-format=<FORMAT>
	    Specify   format   string  for access  log.   The  default format is
	    combined format.   The following variables are available:

	    * $remote_addr: client IP address.

	    * $time_local: local time in Common Log format.

	    * $time_iso8601: local time in ISO 8601 format.

	    * $request: HTTP request line.

	    * $status: HTTP response status code.

	    * $body_bytes_sent: the  number of bytes sent  to client as response
	      body.

	    * $http_<VAR>: value of HTTP  request  header  <VAR>  where  '_'  in
	      <VAR> is replaced with '-'.

	    * $remote_port: client  port.

	    * $server_port: server port.

	    * $request_time:  request  processing time in seconds with millisec-
	      onds resolution.

	    * $pid: PID of the running process.

	    * $alpn: ALPN identifier of the protocol  which  generates	the  re-
	      sponse.	For HTTP/1,  ALPN is  always http/1.1, regardless of mi-
	      nor version.

	    * $tls_cipher: cipher used for SSL/TLS connection.

	    * $tls_client_fingerprint_sha256: SHA-256 fingerprint of client cer-
	      tificate.

	    * $tls_client_fingerprint_sha1:  SHA-1   fingerprint  of client cer-
	      tificate.

	    * $tls_client_subject_name:    subject   name    in  client certifi-
	      cate.

	    * $tls_client_issuer_name:	 issuer   name	  in	client	certifi-
	      cate.

	    * $tls_client_serial:     serial	 number    in	 client certifi-
	      cate.

	    * $tls_protocol: protocol for SSL/TLS connection.

	    * $tls_session_id: session ID for SSL/TLS connection.

	    * $tls_session_reused:  "r"   if   SSL/TLS	  session   was  reused.
	      Otherwise, "."

	    * $tls_sni: SNI server name for SSL/TLS connection.

	    * $tls_ech_accepted:  "e"  if  ECH	was accepted in SSL/TLS session.
	      Otherwise, "."

	    * $backend_host:  backend  host   used  to	 fulfill   the	request.
	      "-" if backend host is not available.

	    * $backend_port:   backend	 port	 used  to  fulfill  the request.
	      "-" if backend host is not available.

	    * $method: HTTP method

	    * $path:  Request  path  including query.	 For   CONNECT	request,
	      authority is recorded.

	    * $path_without_query:   $path   up  to  the   first  '?' character.
	      For   CONNECT  request,	authority   is recorded.

	    * $protocol_version:   HTTP  version   (e.g.,  HTTP/1.1, HTTP/2)

	    The  variable  can	be  enclosed  by  "{"  and  "}"  for disambigua-
	    tion (e.g., ${remote_addr}).

	    Default:  $remote_addr  -	-   [$time_local]   "$request"	 $status
	    $body_bytes_sent "$http_referer" "$http_user_agent"

     --accesslog-write-early
	    Write   access   log   when   response  header  fields  are received
	    from  backend   rather   than  when   request transaction finishes.

     --errorlog-file=<PATH>
	    Set path to write error  log.  To reopen file, send USR1 signal   to
	    nghttpx.	stderr will  be redirected  to the error log file unless
	    --errorlog-syslog is used.

	    Default: /dev/stderr

     --errorlog-syslog
	    Send  error log  to  syslog.  If  this  option  is	 used,	--error-
	    log-file option is ignored.

     --syslog-facility=<FACILITY>
	    Set syslog facility to <FACILITY>.

	    Default: daemon

   HTTP
     --add-x-forwarded-for
	    Append  X-Forwarded-For header  field to  the downstream request.

     --strip-incoming-x-forwarded-for
	    Strip X-Forwarded-For  header field from  inbound client requests.

     --no-add-x-forwarded-proto
	    Don't  append   additional	X-Forwarded-Proto   header field to  the
	    backend  request.	If  inbound    client	sets  X-Forwarded-Proto,
	    and  --no-strip-incoming-x-forwarded-proto	 option   is  used, they
	    are passed to the backend.

     --no-strip-incoming-x-forwarded-proto
	    Don't strip X-Forwarded-Proto  header field from inbound client  re-
	    quests.

     --add-forwarded=<LIST>
	    Append  RFC   7239 Forwarded header field  with parameters specified
	    in comma delimited list <LIST>.  The supported parameters  are "by",
	    "for", "host",  and "proto".   By default,	the value  of  "by"  and
	    "for"  parameters	are  obfuscated      string.	  See	  --for-
	    warded-by	 and --forwarded-for options  respectively.   Note  that
	    nghttpx  does   not   translate  non-standard  X-Forwarded-*  header
	    fields into Forwarded header field, and vice versa.

     --strip-incoming-forwarded
	    Strip  Forwarded   header  field  from   inbound  client requests.

     --forwarded-by=(obfuscated|ip|<VALUE>)
	    Specify the parameter value sent out with  "by"  parameter	of  For-
	    warded   header  field.    If  "obfuscated"  is given, the string is
	    randomly generated at startup.  If "ip" is given,	 the   interface
	    address   of   the	connection, including port number, is  sent with
	    "by" parameter.  In case of UNIX domain  socket, "localhost" is used
	    instead of address and  port.  User can also  specify the static ob-
	    fuscated string.  The limitation is that it must start  with    "_",
	    and    only    consists   of  character   set [A-Za-z0-9._-], as de-
	    scribed in RFC 7239.

	    Default: obfuscated

     --forwarded-for=(obfuscated|ip)
	    Specify  the   parameter  value  sent  out	 with	"for"  parameter
	    of	Forwarded header field.  If "obfuscated" is given, the string is
	    randomly generated for each client connection.  If	"ip"  is  given,
	    the remote client address of  the connection,  without port  number,
	    is	 sent  with  "for"   parameter.    In	case	of  UNIX  domain
	    socket, "localhost" is used instead of address.

	    Default: obfuscated

     --no-via
	    Don't append to  Via header field.	If   Via  header  field  is  re-
	    ceived, it is left unaltered.

     --no-strip-incoming-early-data
	    Don't strip Early-Data header  field from inbound client requests.

     --no-location-rewrite
	    Don't   rewrite  location	header	field	in  default  mode.  When
	    --http2-proxy  is used, location header  field will not  be  altered
	    regardless of this option.

     --host-rewrite
	    Rewrite  host and  :authority header  fields in  default mode.  When
	    --http2-proxy  is	used, these  headers will not be altered regard-
	    less of this option.

     --altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
	    Specify   protocol	ID,   port,  host   and  origin   of alternative
	    service.  <HOST>,	<ORIGIN>  and  <PARAMS>  are  optional.    Empty
	    <HOST>   and <ORIGIN>  are allowed	and they  are treated  as  noth-
	    ing is  specified.	They  are advertised  in alt-svc  header   field
	    only  in   HTTP/1.1  frontend.    This option  can be  used multiple
	    times  to	specify   multiple   alternative   services.	Example:
	    --altsvc="h2,443,,,ma=3600; persist=1"

     --http2-altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
	    Just  like	--altsvc option, but  this altsvc is only sent in HTTP/2
	    frontend.

     --add-request-header=<HEADER>
	    Specify additional header field to add to request header set.    The
	    field   name  must	be lowercase.	This option just  appends header
	    field and  won't replace  anything already set.  This  option can be
	    used  several times to specify  multiple  header  fields.	Example:
	    --add-request-header="foo: bar"

     --add-response-header=<HEADER>
	    Specify   additional   header   field  to	add  to  response header
	    set.  The  field name  must be  lowercase.	This option   just   ap-
	    pends   header  field   and   won't   replace anything already  set.
	    This option can  be used several times to  specify	multiple  header
	    fields.  Example: --add-response-header="foo: bar"

     --request-header-field-buffer=<SIZE>
	    Set maximum buffer size for incoming HTTP request header field list.
	    This  is  the  sum	of header name and value in bytes.   If  trailer
	    fields  exist,  they  are  counted towards this number.

	    Default: 64K

     --max-request-header-fields=<N>
	    Set  maximum  number  of incoming	HTTP   request	 header  fields.
	    If	trailer  fields exist,	they  are  counted towards this number.

	    Default: 100

     --response-header-field-buffer=<SIZE>
	    Set   maximum   buffer   size  for	 incoming  HTTP  response header
	    field list.   This is the sum of  header name and value  in   bytes.
	    If	trailer  fields  exist, they  are counted towards this number.

	    Default: 64K

     --max-response-header-fields=<N>
	    Set   maximum  number   of	 incoming  HTTP response  header fields.
	    If	trailer  fields exist,	they  are  counted towards this number.

	    Default: 500

     --error-page=(<CODE>|*)=<PATH>
	    Set file path  to custom error page  served when nghttpx  originally
	    generates  HTTP  error status  code  <CODE>.  <CODE> must be greater
	    than  or  equal to 400, and at most 599.  If "*"  is used instead of
	    <CODE>,  it matches all HTTP  status  code.  If  error  status  code
	    comes  from backend server, the custom error pages are not used.

     --server-name=<NAME>
	    Change server response header field value to <NAME>.

	    Default: nghttpx

     --no-server-rewrite
	    Don't  rewrite  server  header  field   in	 default   mode.    When
	    --http2-proxy  is used, these headers will not be altered regardless
	    of this option.

     --redirect-https-port=<PORT>
	    Specify the port number which appears in Location header field  when
	    redirect  to  HTTPS  URI  is  made	 due   to  "redirect-if-not-tls"
	    parameter in --backend option.

	    Default: 443

     --require-http-scheme
	    Always  require  http or https scheme in HTTP request.  It also  re-
	    quires that  https scheme  must be	used for  an encrypted	 connec-
	    tion.   Otherwise,	 http  scheme  must be used.   This   option  is
	    recommended  for   a  server deployment which directly faces clients
	    and the services it provides only require http or https scheme.

   API
     --api-max-request-body=<SIZE>
	    Set the maximum size of request body for API request.

	    Default: 32M

   DNS
     --dns-cache-timeout=<DURATION>
	    Set duration that  cached  DNS  results  remain  valid.   Note  that
	    nghttpx caches the unsuccessful results as well.

	    Default: 10s

     --dns-lookup-timeout=<DURATION>
	    Set  timeout  that	 DNS  server is given to  respond to the initial
	    DNS  query.  For  the  2nd	and later   queries,  server  is   given
	    time based	on this timeout, and  it is scaled linearly.

	    Default: 250ms

     --dns-max-try=<N>
	    Set the number of DNS query before nghttpx gives up name lookup.

	    Default: 3

     --frontend-max-requests=<N>
	    The  number   of  requests	that  single   frontend  connection  can
	    process.  For HTTP/2, this	is the number of streams in  one  HTTP/2
	    connection.   For  HTTP/1,	this is  the number of	keep  alive  re-
	    quests.   This  is hint to nghttpx, and it	may allow additional few
	    requests.  The default value is unlimited.

   Debug
     --frontend-http2-dump-request-header=<PATH>
	    Dumps request headers received by HTTP/2 frontend to  the  file  de-
	    noted   in <PATH>.	The  output is done  in HTTP/1 header field for-
	    mat and each header block is followed by an empty line.  This option
	    is not thread safe and MUST NOT be used with option -n<N>, where <N>
	    >= 2.

     --frontend-http2-dump-response-header=<PATH>
	    Dumps response headers sent  from HTTP/2 frontend to  the  file  de-
	    noted   in <PATH>.	The  output is done  in HTTP/1 header field for-
	    mat and each header block is followed by an empty line.  This option
	    is not thread safe and MUST NOT be used with option -n<N>, where <N>
	    >= 2.

     -o, --frontend-frame-debug
	    Print HTTP/2 frames in  frontend to stderr.   This	option	is   not
	    thread  safe and  MUST NOT	be used  with option -n=N, where N >= 2.

   Process
     -D, --daemon
	    Run  in  a background.  If -D is used, the current working directory
	    is changed to '/'.

     --pid-file=<PATH>
	    Set path to save PID of this program.

     --user=<USER>
	    Run this program as <USER>.   This option is intended to be used  to
	    drop root privileges.

     --single-process
	    Run  this  program	in a  single process mode for debugging purpose.
	    Without this option,  nghttpx creates at least 2 processes: main and
	    worker processes.  If this option is  used, main   and   worker  are
	    unified  into a  single process.   nghttpx still  spawns  additional
	    process  if neverbleed  is used.   In the  single process  mode, the
	    signal handling feature is disabled.

     --max-worker-processes=<N>
	    The  maximum number of  worker processes.  nghttpx spawns new worker
	    process when  it reloads  its configuration.   The	previous  worker
	    process  enters graceful termination period and will terminate  when
	    it finishes handling the existing	 connections.	  However,    if
	    reloading configurations  happen   very  frequently,    the   worker
	    processes  might  be piled up if they take a bit long time to finish
	    the existing connections.  With  this option,  if	the  number   of
	    worker  processes	exceeds the  given value,   the  oldest   worker
	    process  is   terminated immediately.  Specifying 0 means no   limit
	    and it is the default behaviour.

     --worker-process-grace-shutdown-period=<DURATION>
	    Maximum  period  for  a   worker  process  to  terminate gracefully.
	    When   a  worker   process	enters	 in  graceful  shutdown   period
	    (e.g.,   when  nghttpx   reloads  its configuration)  and  it   does
	    not  finish  handling  the existing connections in the given  period
	    of	time, it is immediately terminated.  Specifying 0 means no limit
	    and it is the default behaviour.

   Scripting
     --mruby-file=<PATH>
	    Set mruby script file

     --ignore-per-pattern-mruby-error
	    Ignore mruby compile error	for per-pattern mruby script  file.   If
	    error   occurred,  it is treated as  if no mruby file were specified
	    for the pattern.

   HTTP/3 and QUIC
     --frontend-quic-idle-timeout=<DURATION>
	    Specify an idle timeout for QUIC connection.

	    Default: 30s

     --frontend-quic-debug-log
	    Output QUIC debug log to /dev/stderr.

     --quic-bpf-program-file=<PATH>
	    Specify a path to  eBPF program file reuseport_kern.o to direct   an
	    incoming  QUIC  UDP datagram  to  a  correct socket.

	    Default: /usr/local/lib/nghttp2/reuseport_kern.o

     --frontend-quic-early-data
	    Enable  early  data  on  frontend  QUIC  connections.  nghttpx sends
	    "Early-Data" header field to a backend server if a	request  is  re-
	    ceived  in	early  data and handshake has not finished.  All backend
	    servers should deal with possibly replayed requests.

     --frontend-quic-qlog-dir=<DIR>
	    Specify a  directory where	a qlog	file is   written  for	frontend
	    QUIC   connections.   A qlog file  is created per each QUIC  connec-
	    tion.  The	file name is  ISO8601 basic  format,  followed	by  "-",
	    server Source Connection ID and ".sqlog".

     --frontend-quic-require-token
	    Require an address validation  token for a frontend QUIC connection.
	    Server  sends   a  token  in Retry	packet or NEW_TOKEN frame in the
	    previous connection.

     --frontend-quic-congestion-controller=<CC>
	    Specify a congestion controller algorithm for a frontend QUIC   con-
	    nection.   <CC>  should be	either	"cubic"  or "bbr".

	    Default: cubic

     --frontend-quic-secret-file=<PATH>
	    Path  to  file  that  contains secure random data to be used as QUIC
	    keying materials.  It is used to derive keys for  encrypting  tokens
	    and Connection IDs.  It is not used to encrypt  QUIC  packets.  Each
	    line   of  this file  must contain	exactly  136  bytes  hex-encoded
	    string  (when decoded the byte string is  68 bytes long).  The first
	    3 bits of  decoded byte  string are  used to   identify  the  keying
	    material.	An   empty line or a  line which starts '#'  is ignored.
	    The file  can contain  more than  one keying materials.  Because the
	    identifier is 3 bits, at most 8 keying materials are  read	and  the
	    remaining data is discarded.  The first keying  material in the file
	    is	primarily  used for  encryption and  decryption for  new connec-
	    tion.  The other ones are used to decrypt  data  for  the	existing
	    connections.    Specifying	multiple   keying materials enables  key
	    rotation.	Please note  that key rotation	does  not   occur  auto-
	    matically.	 User  should update  files  or  change  options  values
	    and   restart  nghttpx  gracefully.    If opening  or reading  given
	    file fails, all loaded keying  materials are  discarded  and  it  is
	    treated  as if none of  this option is given.  If this option is not
	    given or an error  occurred while opening or  reading  a   file,   a
	    keying  material  is  generated internally on startup and reload.

     --quic-server-id=<HEXSTRING>
	    Specify  server  ID encoded in Connection  ID to identify this  par-
	    ticular  server  instance.	 Connection  ID  is encrypted and   this
	    part  is  not visible in  public.  It must be 4  bytes long and must
	    be encoded	in hex string (which is 8  bytes long).  If this  option
	    is	omitted,  a  random    server  ID   is	 generated   on  startup
	    and configuration reload.

     --frontend-quic-initial-rtt=<DURATION>
	    Specify the initial RTT of the frontend QUIC connection.

	    Default: 333ms

     --no-quic-bpf
	    Disable eBPF.

     --frontend-http3-window-size=<SIZE>
	    Sets  the  per-stream  initial  window  size   of	HTTP/3	frontend
	    connection.

	    Default: 256K

     --frontend-http3-connection-window-size=<SIZE>
	    Sets the  per-connection window size of  HTTP/3 frontend connection.

	    Default: 1M

     --frontend-http3-max-window-size=<SIZE>
	    Sets   the	 maximum   per-stream  window  size  of  HTTP/3 frontend
	    connection.  The window  size is adjusted  based  on  the  receiving
	    rate  of stream data.  The initial value is the  value specified  by
	    --frontend-http3-window-size and the window size grows up to  <SIZE>
	    bytes.

	    Default: 6M

     --frontend-http3-max-connection-window-size=<SIZE>
	    Sets  the	maximum  per-connection  window size  of HTTP/3 frontend
	    connection.  The window  size is adjusted  based  on  the  receiving
	    rate of stream data.  The initial value is	       the	   value
	    specified	       by  --frontend-http3-connection-window-size   and
	    the  window size grows up to <SIZE> bytes.

	    Default: 8M

     --frontend-http3-max-concurrent-streams=<N>
	    Set the maximum number of  the concurrent streams  in  one	frontend
	    HTTP/3 connection.

	    Default: 100

   Misc
     --conf=<PATH>
	    Load  configuration  from	<PATH>.   Please  note	that nghttpx al-
	    ways  tries to read the  default configuration file if --conf is not
	    given.

	    Default: /etc/nghttpx/nghttpx.conf

     --include=<PATH>
	    Load  additional  configurations  from <PATH>.  File <PATH> is  read
	    when  configuration  parser  encountered  this option.  This  option
	    can be used multiple times, or even recursively.

     -v, --version
	    Print version and exit.

     -h, --help
	    Print this help and exit.

     The  <SIZE>  argument is an integer and an optional unit (e.g., 10K is 10 *
     1024).  Units are K, M and G (powers of 1024).

     The <DURATION> argument is an integer and an optional unit (e.g., 1s  is  1
     second  and  500ms  is  500 milliseconds).  Units are h, m, s or ms (hours,
     minutes, seconds and milliseconds, respectively).	If a unit is omitted,  a
     second is used as unit.

FILES
     /etc/nghttpx/nghttpx.conf
	    The  default  configuration  file  path nghttpx searches at startup.
	    The configuration file path can be changed using --conf option.

	    Those lines which are staring # are treated as comment.

	    The option name in the configuration file is the  long  command-line
	    option  name  with	leading -- stripped (e.g., frontend).  Put = be-
	    tween option name and value.  Don't put extra  leading  or	trailing
	    spaces.

	    When  specifying  arguments  including characters which have special
	    meaning to a shell, we usually use quotes so that shell does not in-
	    terpret them.  When writing this configuration file, quotes for this
	    purpose must not be used.  For example, specify  additional  request
	    header field, do this:

	       add-request-header=foo: bar

	    instead of:

	       add-request-header="foo: bar"

	    The  options which do not take argument in the command-line take ar-
	    gument in the configuration file.  Specify yes as an argument (e.g.,
	    http2-proxy=yes).  If other string is given, it is ignored.

	    To specify private key and certificate file which are given as posi-
	    tional arguments in command-line, use private-key-file and	certifi-
	    cate-file.

	    --conf  option  cannot be used in the configuration file and will be
	    ignored if specified.

     Error log
	    Error log is written to stderr by default.	It can be configured us-
	    ing --errorlog-file.  The format of log message is as follows:

	    <datetime>	<main-pid>  <current-pid>  <thread-id>	<level>  (<file-
	    name>:<line>) <msg>

	    <datetime>
		   It is a combination of date and time when the log is written.
		   It is in ISO 8601 format.

	    <main-pid>
		   It is a main process ID.

	    <current-pid>
		   It is a process ID which writes this log.

	    <thread-id>
		   It  is a thread ID which writes this log.  It would be unique
		   within <current-pid>.

	    <filename> and <line>
		   They are source file name, and line number which produce this
		   log.

	    <msg>  It is a log message body.

SIGNALS
     SIGQUIT
	    Shutdown gracefully.  First accept pending connections and stop  ac-
	    cepting  connection.  After all connections are handled, nghttpx ex-
	    its.

     SIGHUP
	    Reload configuration file given in --conf.

     SIGUSR1
	    Reopen log files.

     SIGUSR2
	Fork and execute nghttpx.  It will execute the binary in the  same  path
	with  same  command-line  arguments  and  environment  variables.  As of
	nghttpx version 1.20.0, the new main process sends SIGQUIT to the origi-
	nal main process when it is ready to serve requests.   For  the  earlier
	versions  of  nghttpx,	user  has  to  send SIGQUIT to the original main
	process.

	The difference between SIGUSR2 (+ SIGQUIT) and SIGHUP is that former  is
	usually  used  to  execute  new  binary,  and  the main process is newly
	spawned.  On the other hand, the latter just reloads configuration file,
	and the same main process continues to exist.

     Note:
	nghttpx consists of multiple processes: one process for processing these
	signals, and another one for processing requests.  The former spawns the
	latter.  The former is called main process, and  the  latter  is  called
	worker process.  If neverbleed is enabled, the worker process spawns ne-
	verbleed daemon process which does RSA key processing.	The above signal
	must  be  sent to the main process.  If the other processes received one
	of them, it is ignored.  This behaviour of these processes may change in
	the future  release.   In  other  words,  in  the  future  release,  the
	processes  other  than	main process may terminate upon the reception of
	these signals.	Therefore these  signals  should  not  be  sent  to  the
	processes other than main process.

SERVER PUSH
     nghttpx supports HTTP/2 server push in default mode with Link header field.
     nghttpx  looks for Link header field (RFC 5988 <http://tools.ietf.org/html/
     rfc5988>) in response headers from backend server and  extracts  URI-refer-
     ence   with   parameter  rel=preload  (see  preload  <http://w3c.github.io/
     preload/#interoperability-with-http-link-header>) and pushes those URIs  to
     the  frontend client. Here is a sample Link header field to initiate server
     push:

	Link: </fonts/font.woff>; rel=preload
	Link: </css/theme.css>; rel=preload

     Currently, the following restriction is applied for server push:

     1. The associated stream must have method "GET" or "POST".  The  associated
	stream's status code must be 200.

     This limitation may be loosened in the future release.

     nghttpx  also  supports server push if both frontend and backend are HTTP/2
     in default mode.  In this case, in addition to server push via Link  header
     field, server push from backend is forwarded to frontend HTTP/2 session.

     HTTP/2 server push will be disabled if --http2-proxy is used.

UNIX DOMAIN SOCKET
     nghttpx  supports	UNIX domain socket with a filename for both frontend and
     backend connections.

     Please note that current nghttpx implementation does not  delete  a  socket
     with  a  filename.   And on start up, if nghttpx detects that the specified
     socket already exists in the file system, nghttpx first deletes  it.   How-
     ever, if SIGUSR2 is used to execute new binary and both old and new config-
     urations  use same filename, new binary does not delete the socket and con-
     tinues to use it.

TLS SESSION RESUMPTION
     nghttpx supports TLS session resumption through both session ID and session
     ticket.

   SESSION ID RESUMPTION
     By default, session ID is shared by all worker threads.

   TLS SESSION TICKET RESUMPTION
     By default, session ticket is shared by all worker threads.  The  automatic
     key rotation is also enabled by default.  Every an hour, new encryption key
     is  generated, and previous encryption key becomes decryption only key.  We
     set session timeout to 12 hours, and thus we keep at most 12 keys.

     If --tls-ticket-key-memcached is given, encryption keys are retrieved  from
     memcached.   nghttpx  just reads keys from memcached; one has to deploy key
     generator program to update keys frequently (e.g., every 1 hour).	The  ex-
     ample key generator tlsticketupdate.go is available under contrib directory
     in  nghttp2  archive.   The  memcached entry key is nghttpx:tls-ticket-key.
     The data format stored in memcached is the binary format described below:

	+--------------+-------+----------------+
	| VERSION (4)  |LEN (2)|KEY(48 or 80) ...
	+--------------+-------+----------------+
		       ^			|
		       |			|
		       +------------------------+
		       (LEN, KEY) pair can be repeated

     All numbers in the above figure is bytes.	All integer fields  are  network
     byte order.

     First  4 bytes integer VERSION field, which must be 1.  The 2 bytes integer
     LEN field gives the length of following KEY field, which contains key.   If
     --tls-ticket-key-cipher=aes-128-cbc   is	used,	LEN   must  be	48.   If
     --tls-ticket-key-cipher=aes-256-cbc is used, LEN must be 80.  LEN	and  KEY
     pair  can	be  repeated multiple times to store multiple keys.  The key ap-
     peared first is used as encryption key.  All the remaining keys are used as
     decryption only.

     By default, connections to memcached server are not encrypted.   To  enable
     encryption, use tls keyword in --tls-ticket-key-memcached option.

     If  --tls-ticket-key-file	is  given, encryption key is read from the given
     file.  In this case, nghttpx does not rotate key automatically.  To  rotate
     key, one has to restart nghttpx (see SIGNALS).

CERTIFICATE TRANSPARENCY
     nghttpx  supports	TLS  signed_certificate_timestamp  extension  (RFC  6962
     <https://tools.ietf.org/html/rfc6962>).	The   relevant	  options    are
     --tls-sct-dir  and sct-dir parameter in --subcert.  They takes a directory,
     and nghttpx reads all files whose extension is .sct  under  the  directory.
     The  *.sct files are encoded as SignedCertificateTimestamp struct described
     in  section  3.2	of   RFC   69662   <https://tools.ietf.org/html/rfc6962#
     section-3.2>.  This format is the same one used by nginx-ct <https://github
     .com/grahamedgecombe/nginx-ct>  and  mod_ssl_ct  <https://httpd.apache.org/
     docs/trunk/mod/mod_ssl_ct.html>.	    ct-submit	    <https://github.com/
     grahamedgecombe/ct-submit>  can  be  used	to  submit  certificates  to log
     servers, and obtain the SignedCertificateTimestamp struct which can be used
     with nghttpx.

MRUBY SCRIPTING
     Warning:
	The current mruby extension API is experimental and not frozen.  The API
	is subject to change in the future release.

     Warning:
	Almost all string value returned from method, or attribute  is	a  fresh
	new  mruby string, which involves memory allocation, and copies.  There-
	fore, it is strongly recommended to store a  return  value  in	a  local
	variable,  and	use it, instead of calling method or accessing attribute
	repeatedly.

     nghttpx allows users to extend its capability using mruby scripts.  nghttpx
     has 2 hook points to execute  mruby  script:  request  phase  and	response
     phase.   The  request phase hook is invoked after all request header fields
     are received from client.	The response phase hook is invoked after all re-
     sponse header fields are received from backend server.  These hooks  allows
     users  to modify header fields, or common HTTP variables, like authority or
     request path, and even return custom response without forwarding request to
     backend servers.

     There are 2 levels of mruby script  invocations:  global  and  per-pattern.
     The global mruby script is set by --mruby-file option and is called for all
     requests.	 The  per-pattern mruby script is set by "mruby" parameter in -b
     option.  It is invoked for a request which matches the particular	pattern.
     The order of hook invocation is: global request phase hook, per-pattern re-
     quest  phase  hook, per-pattern response phase hook, and finally global re-
     sponse phase hook.  If a hook returns a response, any later hooks	are  not
     invoked.  The global request hook is invoked before the pattern matching is
     made and changing request path may affect the pattern matching.

     Please note that request and response hooks of per-pattern mruby script for
     a	single	request  might not come from the same script.  This might happen
     after a request hook is executed, backend failed for some	reason,  and  at
     the  same	time, backend configuration is replaced by API request, and then
     the request uses new configuration on retry.  The response  hook  from  new
     configuration, if it is specified, will be invoked.

     The  all  mruby script will be evaluated once per thread on startup, and it
     must instantiate  object  and  evaluate  it  as  the  return  value  (e.g.,
     App.new).	 This object is called app object.  If app object defines on_req
     method, it is called with Nghttpx::Env object on request hook.   Similarly,
     if app object defines on_resp method, it is called with Nghttpx::Env object
     on  response  hook.   For	each  method  invocation,  user  can  can access
     Nghttpx::Request and Nghttpx::Response  objects  via  Nghttpx::Env#req  and
     Nghttpx::Env#resp respectively.

     Nghttpx::REQUEST_PHASE
	    Constant to represent request phase.

     Nghttpx::RESPONSE_PHASE
	    Constant to represent response phase.

     class Nghttpx::Env
	    Object to represent current request specific context.

	    attribute [R] req
		   Return Request object.

	    attribute [R] resp
		   Return Response object.

	    attribute [R] ctx
		   Return Ruby hash object.  It persists until request finishes.
		   So  values  set in request phase hook can be retrieved in re-
		   sponse phase hook.

	    attribute [R] phase
		   Return the current phase.

	    attribute [R] remote_addr
		   Return IP address of a remote client.  If connection is  made
		   via UNIX domain socket, this returns the string "localhost".

	    attribute [R] server_addr
		   Return  address of server that accepted the connection.  This
		   is a string which specified in --frontend  option,  excluding
		   port  number, and not a resolved IP address.  For UNIX domain
		   socket, this is a path to UNIX domain socket.

	    attribute [R] server_port
		   Return port number of the server frontend which accepted  the
		   connection from client.

	    attribute [R] tls_used
		   Return true if TLS is used on the connection.

	    attribute [R] tls_sni
		   Return  the	TLS  SNI value which client sent in this connec-
		   tion.

	    attribute [R] tls_client_fingerprint_sha256
		   Return the SHA-256 fingerprint of a client certificate.

	    attribute [R] tls_client_fingerprint_sha1
		   Return the SHA-1 fingerprint of a client certificate.

	    attribute [R] tls_client_issuer_name
		   Return the issuer name of a client certificate.

	    attribute [R] tls_client_subject_name
		   Return the subject name of a client certificate.

	    attribute [R] tls_client_serial
		   Return the serial number of a client certificate.

	    attribute [R] tls_client_not_before
		   Return the start date of  a	client	certificate  in  seconds
		   since the epoch.

	    attribute [R] tls_client_not_after
		   Return  the end date of a client certificate in seconds since
		   the epoch.

	    attribute [R] tls_cipher
		   Return a TLS cipher negotiated in this connection.

	    attribute [R] tls_protocol
		   Return a TLS protocol version negotiated in this connection.

	    attribute [R] tls_session_id
		   Return a session ID for this connection in hex string.

	    attribute [R] tls_session_reused
		   Return true if, and only if a SSL/TLS session is reused.

	    attribute [R] alpn
		   Return ALPN identifier negotiated in this connection.

	    attribute [R] tls_handshake_finished
		   Return true if SSL/TLS handshake has finished.  If it returns
		   false in the request phase hook, the request is  received  in
		   TLSv1.3 early data (0-RTT) and might be vulnerable to the re-
		   play  attack.   nghttpx  will send Early-Data header field to
		   backend servers to indicate this.

     class Nghttpx::Request
	    Object to represent request from client.  The  modification  to  Re-
	    quest object is allowed only in request phase hook.

	    attribute [R] http_version_major
		   Return HTTP major version.

	    attribute [R] http_version_minor
		   Return HTTP minor version.

	    attribute [R/W] method
		   HTTP method.  On assignment, copy of given value is assigned.
		   We don't accept arbitrary method name.  We will document them
		   later,  but	well  known methods, like GET, PUT and POST, are
		   all supported.

	    attribute [R/W] authority
		   Authority (i.e., example.org), including optional port compo-
		   nent .  On assignment, copy of given value is assigned.

	    attribute [R/W] scheme
		   Scheme (i.e., http, https).	On  assignment,  copy  of  given
		   value is assigned.

	    attribute [R/W] path
		   Request  path, including query component (i.e., /index.html).
		   On assignment, copy of given value  is  assigned.   The  path
		   does  not  include  authority component of URI.  This may in-
		   clude query component.  nghttpx makes  certain  normalization
		   for path.  It decodes percent-encoding for unreserved charac-
		   ters (see <https://tools.ietf.org/html/rfc3986#section-2.3>),
		   and resolves ".." and ".".  But it may leave characters which
		   should be percent-encoded as is. So be careful when comparing
		   path against desired string.

	    attribute [R] headers
		   Return  Ruby  hash  containing copy of request header fields.
		   Changing values in returned	hash  does  not  change  request
		   header  fields  actually  used  in  request	processing.  Use
		   Nghttpx::Request#add_header or Nghttpx::Request#set_header to
		   change request header fields.

	    add_header(key, value)
		   Add header entry associated with key.  The value can be  sin-
		   gle	string	or array of string.  It does not replace any ex-
		   isting values associated with key.

	    set_header(key, value)
		   Set header entry associated with key.  The value can be  sin-
		   gle string or array of string.  It replaces any existing val-
		   ues associated with key.

	    clear_headers()
		   Clear all existing request header fields.

	    push(uri)
		   Initiate  to  push  resource  identified by uri.  Only HTTP/2
		   protocol supports this feature.   For  the  other  protocols,
		   this  method is noop.  uri can be absolute URI, absolute path
		   or relative path to the current  request.   For  absolute  or
		   relative  path,  scheme  and authority are inherited from the
		   current request.  Currently, method is always  GET.	 nghttpx
		   will  issue	request  to  backend servers to fulfill this re-
		   quest.  The request and response phase hooks will  be  called
		   for pushed resource as well.

     class Nghttpx::Response
	    Object to represent response from backend server.

	    attribute [R] http_version_major
		   Return HTTP major version.

	    attribute [R] http_version_minor
		   Return HTTP minor version.

	    attribute [R/W] status
		   HTTP status code.  It must be in the range [200, 999], inclu-
		   sive.   The	non-final  status code is not supported in mruby
		   scripting at the moment.

	    attribute [R] headers
		   Return Ruby hash containing copy of response  header  fields.
		   Changing  values  in  returned  hash does not change response
		   header fields actually  used  in  response  processing.   Use
		   Nghttpx::Response#add_header  or Nghttpx::Response#set_header
		   to change response header fields.

	    add_header(key, value)
		   Add header entry associated with key.  The value can be  sin-
		   gle	string	or array of string.  It does not replace any ex-
		   isting values associated with key.

	    set_header(key, value)
		   Set header entry associated with key.  The value can be  sin-
		   gle string or array of string.  It replaces any existing val-
		   ues associated with key.

	    clear_headers()
		   Clear all existing response header fields.

	    return(body)
		   Return custom response body to a client.  When this method is
		   called in request phase hook, the request is not forwarded to
		   the	backend,  and  response phase hook for this request will
		   not be invoked.  When this method is called in response phase
		   hook, response from backend server is canceled and discarded.
		   The status code and response header fields should be set  be-
		   fore using this method.  To set status code, use Nghttpx::Re-
		   sponse#status.   If	status code is not set, 200 is used.  To
		   set response header fields, Nghttpx::Response#add_header  and
		   Nghttpx::Response#set_header.  When this method is invoked in
		   response phase hook, the response headers are filled with the
		   ones received from backend server.  To send completely custom
		   header  fields, first call Nghttpx::Response#clear_headers to
		   erase all existing  header  fields,	and  then  add	required
		   header  fields.  It is an error to call this method twice for
		   a given request.

	    send_info(status, headers)
		   Send non-final (informational) response to a client.   status
		   must  be  in  the  range [100, 199], inclusive.  headers is a
		   hash containing response header fields.  Its key  must  be  a
		   string, and the associated value must be either string or ar-
		   ray	of strings.  Since this is not a final response, even if
		   this method is invoked, request is still forwarded to a back-
		   end unless Nghttpx::Response#return is called.   This  method
		   can	be  called  multiple  times.   It cannot be called after
		   Nghttpx::Response#return is called.

   MRUBY EXAMPLES
     Modify request path:

	class App
	  def on_req(env)
	    env.req.path = "/apps#{env.req.path}"
	  end
	end

	App.new

     Don't forget to instantiate and evaluate object at the last line.

     Restrict permission of viewing a content to a specific client addresses:

	class App
	  def on_req(env)
	    allowed_clients = ["127.0.0.1", "::1"]

	    if env.req.path.start_with?("/log/") &&
	       !allowed_clients.include?(env.remote_addr) then
	      env.resp.status = 404
	      env.resp.return "permission denied"
	    end
	  end
	end

	App.new

API ENDPOINTS
     nghttpx exposes API endpoints to manipulate it via HTTP based API.  By  de-
     fault,  API  endpoint  is disabled.  To enable it, add a dedicated frontend
     for API using --frontend option with "api" parameter.  All  requests  which
     come from this frontend address, will be treated as API request.

     The response is normally JSON dictionary, and at least includes the follow-
     ing keys:

     status
	    The  status of the request processing.  The following values are de-
	    fined:

	    Success
		   The request was successful.

	    Failure
		   The request was failed.  No change has been made.

     code   HTTP status code

     Additionally, depending on the API endpoint, data key may be  present,  and
     its value contains the API endpoint specific data.

     We wrote "normally", since nghttpx may return ordinal HTML response in some
     cases  where  the	error  has  occurred before reaching API endpoint (e.g.,
     header field is too large).

     The following section describes available API endpoints.

   POST /api/v1beta1/backendconfig
     This API replaces the current backend server settings  with  the  requested
     ones.   The request method should be POST, but PUT is also acceptable.  The
     request body must be nghttpx configuration file format.  For  configuration
     file format, see FILES section.  The line separator inside the request body
     must  be  single  LF (0x0A).  Currently, only backend option is parsed, the
     others are simply ignored.  The semantics of this API is replace  the  cur-
     rent  backend  with  the backend options in request body.	Describe the de-
     sired set of backend severs, and nghttpx makes it happen.	If there  is  no
     backend  option is found in request body, the current set of backend is re-
     placed with the backend option's default value, which is 127.0.0.1,80.

     The replacement is done instantly without breaking existing connections  or
     requests.	 It  also  avoids  any	process creation as is the case with hot
     swapping with signals.

     The one limitation is that only numeric IP address is allowed in backend in
     request body unless "dns" parameter is used while non numeric  hostname  is
     allowed in command-line or configuration file is read using --conf.

   GET /api/v1beta1/configrevision
     This  API	returns configuration revision of the current nghttpx.	The con-
     figuration revision is opaque string, and it changes after  each  reloading
     by  SIGHUP.   With  this  API,  an  external application knows that whether
     nghttpx has finished reloading its configuration by comparing the	configu-
     ration  revisions between before and after reloading.  It is recommended to
     disable persistent (keep-alive) connection for this  purpose  in  order  to
     avoid  to	send a request using the reused connection which may bound to an
     old process.

     This API returns response including data key.  Its value  is  JSON  object,
     and it contains at least the following key:

     configRevision
	    The configuration revision of the current nghttpx

SEE ALSO
     nghttp(1), nghttpd(1), h2load(1)

Author
     Tatsuhiro Tsujikawa

Copyright
     2012, 2015, 2016, Tatsuhiro Tsujikawa

1.69.0				  Apr 19, 2026			      NGHTTPX(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=nghttpx&sektion=1&manpath=FreeBSD+Ports+15.1.quarterly>

home | help