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

FreeBSD Manual Pages

  
 
  

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>)[;[<PAT-
       TERN>[:...]][[;<PARAM>]...]
	      Set   backend   host   and    port.   The	 multiple  backend ad-
	      dresses 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 programming 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 request  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  listener  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., specifying
	      "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	 indi-
	      cate   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 normal path,	match is made around the boundary of path com-
	      ponent  separator,"/".  On the other hand,  the  wildcard	  path
	      does  not	take  into account the path component  separator.  All
	      paths which  include 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	  pattern   "/foo*"   matches	 "/foo/"   and
	      "/foobar".  But it does not match	"/foo",	or "/fo".

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

	      When  doing   a  match, nghttpx made  some normalization to pat-
	      tern, request host and path.  For	host part, they	are  converted
	      to  lower	case.  For path	part, percent-encoded unreserved char-
	      acters  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 "/http-
	      bin/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
	      effect	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 to-
	      gether forming  load balancing  group.

	      Several parameters <PARAM> are accepted  after  <PATTERN>.   The
	      parameters  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=<DU-
	      RATION>",	 "group=<GROUP>",   "group-weight=<N>",	 "weight=<N>",
	      and "dnf".    The	 parameter   consists	of  keyword,   and op-
	      tionally 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  op-
	      tional	"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 cleart-
	      ext TCP unless  "tls" keyword is used (see below).

	      TLS  can	 be  enabled  by  specifying   optional	 "tls" parame-
	      ter.  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 backend <N>	times in  a row, this	backend	  is   assumed
	      to  be   offline,	 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 at-
	      tempts  to  make	a connection to	the failed backend, and	if the
	      connection is made  successfully <N> times  in a row, the	 back-
	      end  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"  parame-
	      ter, and	its <METHOD> is	not "none",  session affinity  is  en-
	      abled  for all backend  servers sharing the same	<PATTERN>.  It
	      is advised  to  set  "affinity" parameter	 to  all  backend  ex-
	      plicitly	if session affinity  is	desired.  The session affinity
	      may   break  if	one  of	 the   backend	gets unreachable,   or
	      backend  settings	 are   reloaded	 or replaced by	API.

	      If   "affinity=cookie"	is   used,    the   additional config-
	      uration		       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	deter-
	      mined by a request scheme.  If a request scheme is "https", then
	      Secure  attribute	 is set.  Otherwise, it	 is not	set.  If  <SE-
	      CURE> is "yes", the  Secure attribute  is	 always	set.   If <SE-
	      CURE>  is	"no",	the   Secure   attribute  is   always	 omit-
	      ted.   "affinity-cookie-stickiness=<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 des-
	      ignated  backend server breaks affinity, but adding  new backend
	      server  does   not  cause	breakage.  If  the designated  backend
	      server  becomes unavailable, new backend server is chosen	 as if
	      the request does not have	 an  affinity  cookie.	  <STICKINESS>
	      defaults	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	 reloading 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 feature is  enabled   for	 all  backend  servers
	      sharing the   same   <PATTERN>.	 It    is   advised   to   set
	      "redirect-if-no-tls"    parameter	  to	all   backends explic-
	      itly if this feature is desired.

	      If "upgrade-scheme"  parameter is	used along  with "tls" parame-
	      ter,  HTTP/2  :scheme  pseudo header field is changed to "https"
	      from "http" when forwarding a request to this  particular	 back-
	      end.   This  is	a  workaround for a backend server  which  re-
	      quires  "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
	      backends	which  share the same pattern must have	the same mruby
	      path.

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

	      "group=<GROUP>"  parameter specifies  the	name   of  group  this
	      backend  address belongs to.  By default,	it belongs to  the un-
	      named  default 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   se-
	      lected   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 addresses	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  addresses,  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
	      balancing	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   ig-
	      nored  if	 session affinity is enabled.

	      If  "dnf"	 parameter  is	 specified, an incoming	request	is not
	      forwarded	to a backend  and just consumed	along  with  the   re-
	      quest  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	abbre-
	      viation of "do not forward".

	      Since  ";"  and  ":"  are	 used as delimiter, <PATTERN> must not
	      contain  these characters.  In order  to include ":"  in	 <PAT-
	      TERN>,  one  has	to  specify  "%3A"  (which  is percent-encoded
	      from  of	 ":")  instead.	   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 de-
	      scribed  below.	Note   that  "api"  and	  "healthmon"  parame-
	      ters are mutually	exclusive.

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

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

	      To  make this  frontend as  API endpoint,	 specify "api" parame-
	      ter.   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
	      requests	which  come through  this address are replied with 200
	      HTTP status, without no body.

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

	      To  receive   HTTP/3  (QUIC)  traffic,   specify	"quic" parame-
	      ter.   It	  makes	 nghttpx  listen on  UDP port rather than  TCP
	      port.   UNIX   domain  socket,   "api",  and "healthmon"	 para-
	      meters  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  re-
	      quires  authentication,  specify	 <USER>	  and	<PASS>.	  Note
	      that   they  must	 be properly  percent-encoded.	This proxy  is
	      used  when the  backend connection  is HTTP/2.  First,  make   a
	      CONNECT  request	to  the	proxy  and  it connects	 to the	 back-
	      end  on behalf  of nghttpx.   This forms	tunnel.	  After	 that,
	      nghttpx	 performs   SSL/TLS  handshake	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.  Set-
	      ting 0 to	this option means read rate is unlimited.

	      Default: 0

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

	      Default: 0

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

	      Default: 0

       --write-burst=<SIZE>
	      Set  maximum write  burst	size  on frontend   connection.	  Set-
	      ting  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
	      implemented 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	unlim-
	      ited.  Not implemented 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  ac-
	      cepts.  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 --backend-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  number of connections per host with		 --http2-proxy
	      option,	       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  completed 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
	      platforms	 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 ac-
	      tive 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  ac-
	      tive 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 connec-
	      tion.

	      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 shutdown,  and	 the  connection itself	is left	intact.

	      Default: 1m

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

	      Default: 0

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

	      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 back-
	      end.

	      Default: 30s

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

	      Default: 2s

       --listener-disable-timeout=<DURATION>
	      After accepting  connection failed,  connection listener is dis-
	      abled  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
	      interval	to  temporarily	 disable backend  when nghttpx	failed
	      to  connect to  it.  These intervals are calculated  using expo-
	      nential 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 prefer-
	      ence order.  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  cer-
	      tificates,  they	are  loaded  at	startup	regardless of this op-
	      tion.

       --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  pro-
	      tected it'll be requested	interactively.

       --subcert=<KEYPATH>:<CERTPATH>[[;<PARAM>]...]
	      Specify	 additional   certificate   and	  private  key	 file.
	      nghttpx will  choose certificates	based on  the  hostname	 indi-
	      cated  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 consider-
	      ation.   This  allows  nghttpx to	send ML-DSA or ECDSA  certifi-
	      cate to  modern clients,	while sending RSA based	certificate to
	      older clients.  This option can be used multiple times.

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

	      "sct-dir=<DIR>"	specifies  the	 path to  directory which con-
	      tains	     *.sct	     files	     for	   TLS
	      signed_certificate_timestamp extension (RFC 6962).  This feature
	      requires	 OpenSSL   >=	1.0.2.	  See	also --tls-sct-dir op-
	      tion.

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

       --alpn-list=<LIST>
	      Comma delimited list of  ALPN protocol identifier	sorted in  the
	      order  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
	      certificate.  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-version  and   --tls-max-proto-version  are  en-
	      abled.   If  the	protocol  list	advertised  by client does not
	      overlap  this range,  you	 will  receive the  error message "un-
	      known  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-version  and   --tls-max-proto-version  are  en-
	      abled.   If  the	protocol  list	advertised  by client does not
	      overlap  this range,  you	 will  receive the  error message "un-
	      known  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,  possibly	replacing current set  of keys.	 It is
	      up   to  extern  TLS ticket  key generator  to rotate  keys fre-
	      quently.	 See "TLS SESSION  TICKET RESUMPTION" section in  man-
	      ual page to know the data	format in  memcached  entry.   Option-
	      ally,  memcached	 connection  can  be  encrypted	 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 consid-
	      ered.    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	 aban-
	      doning  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 dis-
	      abling 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	behav-
	      iour.   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	  con-
	      tinue   to   be	used   on   the	 active	 TLS  session.	 After
	      --tls-dyn-rec-idle-timeout has elapsed, the record size  is  re-
	      duced   to  1300	bytes.	 Specify  0 to always use  the maximum
	      record size,  regardless of idle period.	 This  behaviour   ap-
	      plies   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
	      behaviour	  applies  to all TLS  based frontends,	and TLS	HTTP/2
	      backends.

	      Default: 1s

       --no-http2-cipher-block-list
	      Allow  block  listed  cipher suite  on  frontend	HTTP/2 connec-
	      tion.						   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 connec-
	      tion.						   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
	      positional    command-line  argument <CERT>, or  certificate op-
	      tion in configuration file.    For    additional	 certificates,
	      use  --subcert 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  for-
	      matted  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   en-
	      abled  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-cipher-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 <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 first identity and  se-
	      cret 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-cipher-block-list
	      option.  But be aware its	implications.

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

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

	      Default: 16K

       --tls-ktls
	      Enable ktls.

   HTTP/2
       -c, --frontend-http2-max-concurrent-streams=<N>
	      Set  the	maximum	number of  the concurrent streams in one fron-
	      tend 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 re-
	      quests are set by	a remote server.

	      Default: 100

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

	      Default: 65535

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

	      Default: 65535

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

	      Default: 65535

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

	      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 se-
	      curity.

       --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
	      supported	 if   both frontend and	 backend are HTTP/2 in default
	      mode.  In	 this case, server push	from backend  session  is  re-
	      layed   to  frontend,  and  server push via Link header field is
	      also supported.

       --frontend-http2-optimize-write-buffer-size
	      (Experimental) Enable write  buffer size optimization  in	 fron-
	      tend  HTTP/2  TLS	 connection.  This optimization	aims to	reduce
	      write buffer  size so  that it  only contains bytes   which  can
	      send immediately.	  This makes  server more responsive to	prior-
	      itized  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  win-
	      dow    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    --frontend-http2-connection-window-size.
	      Since    the  stream  is subject to stream level window size, it
	      should be	adjusted using --frontend-http2-window-size option  as
	      well.    This  option  is	only  effective	on  recent Linux plat-
	      form.

       --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
	      dynamic 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
	      dynamic 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" parame-
	      ter 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,
	      --accesslog-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 re-
		sponse 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 mil-
		liseconds 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
		minor version.

	      	$tls_cipher: cipher used for SSL/TLS connection.

	      	$tls_client_fingerprint_sha256:	SHA-256	fingerprint of	client
		certificate.

	      	$tls_client_fingerprint_sha1:	SHA-1	fingerprint  of	client
		certificate.

	      	$tls_client_subject_name:   subject  name    in	  client  cer-
		tificate.

	      	$tls_client_issuer_name:    issuer    name    in   client cer-
		tificate.

	      	$tls_client_serial:    serial	 number	   in	  client  cer-
		tificate.

	      	$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.

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

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

	      	$method: HTTP method

	      	$path:	 Request   path	  including  query.   For  CONNECT re-
		quest, authority is recorded.

	      	$path_without_query:  $path   up  to  the   first  '?' charac-
		ter.	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	disam-
	      biguation	(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  re-
	      ceived	from  backend	rather	 than  when   request transac-
	      tion 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,
	      --errorlog-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 re-
	      quest.

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

       --no-add-x-forwarded-proto
	      Don't append  additional X-Forwarded-Proto  header field to  the
	      backend	 request.     If    inbound	client	  sets	X-For-
	      warded-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
	      requests.

       --add-forwarded=<LIST>
	      Append  RFC  7239	Forwarded header field	with parameters	speci-
	      fied 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     --forwarded-by	and  --forwarded-for  options  respec-
	      tively.	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 re-
	      quests.

       --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	inter-
	      face    address  of   the	 connection, including port number, is
	      sent with	"by" parameter.	 In case of UNIX domain	 socket,  "lo-
	      calhost"	is  used  instead of address and  port.	 User can also
	      specify the static obfuscated string.  The limitation is that it
	      must start with	"_",  and   only    consists	of   character
	      set [A-Za-z0-9._-], as described in RFC 7239.

	      Default: obfuscated

       --forwarded-for=(obfuscated|ip)
	      Specify  the   parameter	value  sent  out   with	 "for" parame-
	      ter  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  ad-
	      dress.

	      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  re-
	      quests.

       --no-location-rewrite
	      Don't   rewrite  location	 header	field  in default  mode.  When
	      --http2-proxy  is	used, location header  field will not  be  al-
	      tered 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
	      regardless of this option.

       --altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
	      Specify	protocol  ID,	port,  host   and  origin   of	alter-
	      native  service.	 <HOST>,   <ORIGIN> and	<PARAMS> are optional.
	      Empty <HOST>  and	<ORIGIN>  are allowed  and they	  are  treated
	      as   nothing  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
	      appends  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 num-
	      ber.

	      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 num-
	      ber.

	      Default: 500

       --error-page=(<CODE>|*)=<PATH>
	      Set file path  to	custom error page  served when nghttpx	origi-
	      nally  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 regard-
	      less 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	"redi-
	      rect-if-not-tls" parameter in --backend option.

	      Default: 443

       --require-http-scheme
	      Always require http or https scheme in HTTP  request.   It  also
	      requires	that   https  scheme   must be	used for  an encrypted
	      connection.  Otherwise,  http scheme  must be used.   This   op-
	      tion  is	 recommended  for   a	server	deployment  which  di-
	      rectly  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 requests.  This is hint to nghttpx,	and it	may allow  ad-
	      ditional 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
	      denoted  in <PATH>.  The	output is done	in HTTP/1 header field
	      format 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
	      denoted  in <PATH>.  The	output is done	in HTTP/1 header field
	      format 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	direc-
	      tory 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 pur-
	      pose.   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 fea-
	      ture is disabled.

       --max-worker-processes=<N>
	      The maximum number of  worker  processes.	  nghttpx  spawns  new
	      worker  process when  it reloads	its configuration.  The	previ-
	      ous  worker  process enters graceful termination period and will
	      terminate	 when it finishes  handling  the  existing     connec-
	      tions.	  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	termi-
	      nated  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	grace-
	      fully.   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.	Speci-
	      fying 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
	      received 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 fron-
	      tend QUIC	 connections.  A qlog file  is created per  each  QUIC
	      connection.   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 connec-
	      tion.   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
	      connection.   <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  to-
	      kens and Connection IDs.	It is not used to encrypt  QUIC	 pack-
	      ets.   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 connection.  The
	      other ones are used to decrypt data for  the   existing  connec-
	      tions.	Specifying multiple  keying materials enables  key ro-
	      tation.	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 read-
	      ing  given file fails, all loaded	 keying	  materials  are  dis-
	      carded  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	inter-
	      nally on startup and reload.

       --quic-server-id=<HEXSTRING>
	      Specify  server	ID  encoded in Connection  ID to identify this
	      particular  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	 fron-
	      tend connection.

	      Default: 256K

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

	      Default: 1M

       --frontend-http3-max-window-size=<SIZE>
	      Sets   the   maximum  per-stream	window	size  of  HTTP/3 fron-
	      tend connection.	The window  size is adjusted based on the  re-
	      ceiving  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 fron-
	      tend connection.	The window  size is adjusted based on the  re-
	      ceiving  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	 fron-
	      tend HTTP/3 connection.

	      Default: 100

   Misc
       --conf=<PATH>
	      Load  configuration  from	  <PATH>.   Please  note  that nghttpx
	      always   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 com-
	      mand-line	option name with leading -- stripped (e.g., frontend).
	      Put = between option name	and value.  Don't put extra leading or
	      trailing spaces.

	      When specifying arguments	including characters which  have  spe-
	      cial  meaning  to	 a  shell, we usually use quotes so that shell
	      does not interpret 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
	      argument	in the configuration file.  Specify yes	as an argument
	      (e.g., http2-proxy=yes).	If other string	is given,  it  is  ig-
	      nored.

	      To  specify  private key and certificate file which are given as
	      positional arguments in command-line, use	 private-key-file  and
	      certificate-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
	      using --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
	      accepting	  connection.	After  all  connections	 are  handled,
	      nghttpx exits.

       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
	  original  main  process when it is ready to serve requests.  For the
	  earlier versions of nghttpx, user has	to send	SIGQUIT	to the	origi-
	  nal 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  lat-
	  ter  is called worker	process.  If neverbleed	is enabled, the	worker
	  process spawns neverbleed daemon process which does RSA key process-
	  ing.	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) in response
       headers from backend server and extracts	URI-reference  with  parameter
       rel=preload (see	preload) 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 associ-
	  ated 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.  However, if	SIGUSR2	is used	to execute new binary and both
       old and new configurations use  same  filename,	new  binary  does  not
       delete the socket and continues 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	 auto-
       matic  key rotation is also enabled by default.	Every an hour, new en-
       cryption	key is generated, and previous encryption key becomes  decryp-
       tion 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 de-
       ploy key	generator program to update keys  frequently  (e.g.,  every  1
       hour).  The example 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 bi-
       nary 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  net-
       work byte order.

       First  4	bytes integer VERSION field, which must	be 1.  The 2 bytes in-
       teger 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	 appeared  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  en-
       able 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).
       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.  This format is the same one used	by nginx-ct and	mod_ssl_ct.  -
       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.   Therefore,	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 in-
       voked after all	response  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 request phase hook, per-pattern response  phase  hook,  and
       finally	global response	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  rea-
       son, and	at the same time, backend configuration	is replaced by API re-
       quest,  and  then the request uses new configuration on retry.  The re-
       sponse hook from	new configuration, if it is  specified,	 will  be  in-
       voked.

       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 fin-
		     ishes.  So	values set in request phase hook  can  be  re-
		     trieved in	response 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 "lo-
		     calhost".

	      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 con-
		     nection.

	      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  connec-
		     tion.

	      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 re-
		     turns false in the	request	phase hook, the	request	is re-
		     ceived in TLSv1.3 early data (0-RTT) and might be vulner-
		     able  to the replay 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
	      Request 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 as-
		     signed.  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
		     component	.   On	assignment, copy of given value	is as-
		     signed.

	      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.,  /in-
		     dex.html).	  On  assignment,  copy	 of given value	is as-
		     signed.  The path does not	include	authority component of
		     URI.  This	may include query  component.	nghttpx	 makes
		     certain  normalization  for path.	It decodes percent-en-
		     coding    for    unreserved     characters	    (see     -
		     https://tools.ietf.org/html/rfc3986#section-2.3), and re-
		     solves  ".."  and ".".  But it may	leave characters which
		     should be percent-encoded as is. So be careful when  com-
		     paring 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  process-
		     ing.	 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
		     single string or array of string.	It  does  not  replace
		     any existing values associated with key.

	      set_header(key, value)
		     Set  header  entry	associated with	key.  The value	can be
		     single string or array of string.	It replaces any	exist-
		     ing values	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 ab-
		     solute or relative	path, scheme and authority are	inher-
		     ited  from	the current request.  Currently, method	is al-
		     ways GET.	nghttpx	will issue request to backend  servers
		     to	 fulfill this request.	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],
		     inclusive.	 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 process-
		     ing.	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
		     single  string  or	 array of string.  It does not replace
		     any existing values associated with key.

	      set_header(key, value)
		     Set header	entry associated with key.  The	value  can  be
		     single string or array of string.	It replaces any	exist-
		     ing values	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  before  using  this
		     method.	   To	   set	    status	code,	   use
		     Nghttpx::Response#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  in-
		     voked  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  re-
		     quest.

	      send_info(status,	headers)
		     Send  non-final  (informational)  response	 to  a client.
		     status must be in the range [100, 199], inclusive.	 head-
		     ers is a hash containing response header fields.  Its key
		     must be a string, and the associated value	must be	either
		     string or array of	strings.  Since	this is	 not  a	 final
		     response,	even  if  this	method	is invoked, request is
		     still     forwarded     to	    a	   backend	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 ad-
       dresses:

	  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
       default,	API endpoint is	disabled.  To enable it, add a dedicated fron-
       tend  for  API  using  --frontend option	with "api" parameter.  All re-
       quests which come from this frontend address, will be  treated  as  API
       request.

       The  response  is  normally  JSON dictionary, and at least includes the
       following keys:

       status The status of the	request	processing.  The following values  are
	      defined:

	      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  re-
       quested	ones.	The request method should be POST, but PUT is also ac-
       ceptable.  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 current backend with	the backend options in
       request body.  Describe the desired 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 replaced 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 nu-
       meric 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
       configuration  revision is opaque string, and it	changes	after each re-
       loading by SIGHUP.  With	this API, an external application  knows  that
       whether	nghttpx	 has finished reloading	its configuration by comparing
       the configuration revisions between before and after reloading.	It  is
       recommended to disable persistent (keep-alive) connection for this pur-
       pose  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  ob-
       ject, 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.68.0				 Oct 25, 2025			    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.0.quarterly>

home | help