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 or earlier.  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
	      or earlier.

	      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	  or   earlier.	   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
	      --tls13-client-ciphers for TLSv1.2 or earlier.

	      Default:
	      TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

       --ecdh-curves=<LIST>
	      Set  supported  curve  list  for	frontend  connections.	<LIST>
	      is a  colon separated list of curve  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  shared   elliptic	curves	(e.g.,
	      P-256) between  client and server	are also taken into  consider-
	      ation.   This allows nghttpx  to send ECDSA certificate  to mod-
	      ern 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".	  If  a	protocol version lower than TLSv1.2 is
	      specified, make sure that	the compatible ciphers	are   included
	      in --ciphers option.   The default cipher	 list  only   includes
	      ciphers	compatible  with TLSv1.2 or above.  The	available ver-
	      sions are: TLSv1.3, TLSv1.2, TLSv1.1, and	TLSv1.0

	      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, TLSv1.2,
	      TLSv1.1, and TLSv1.0

	      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.67.0				 Sep 02, 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>

home | help