NGHTTPD(1)
π NGHTTPD(1) β the nghttp2 HTTP/2 server, bestie edition π
okay so you found the manual page for nghttpd, aka the HTTP/2 server from the nghttp2 squad. it's the whole manual, and we're gonna read it together like it's a group chat, no skipping, no skimming. every flag, every default, every warning β all of it stays. let's go π
β¨ NAME β¨
nghttpd β an HTTP/2 server. that's it, that's the name, and she's iconic for it.
π¦ SYNOPSIS π¦
nghttpd [OPTION]... <PORT> [<PRIVATE_KEY> <CERT>]
πΈ DESCRIPTION πΈ
period. it's an HTTP/2 server, and here's who's who in the cast:
<PORT>β the listening port number, babe. that's the number she's gonna be listening on.<PRIVATE_KEY>β the path to the server's private key. this one is required unless you pass--no-tls. no key, no vibes.<CERT>β the path to the server's certificate. also required unless you're out here with--no-tls.
π OPTIONS π
so many options, and honestly? each one ate.
-a,--address=<ADDR>β the address to bind to. if you don't say anything, the default IP address decided bygetaddrinfogets used, and she'll just do her thing.-D,--daemonβ run it in the background like the mysterious main character she is. β οΈ but listen: if-Dis used, the current working directory gets changed to/. so if you're gonna use this option, you must also specify the-doption. fr fr, don't skip that.-V,--verify-clientβ the server sends a client certificate request. if the client didn't send a certificate back, the handshake is terminated, no hesitation. lowkey though: currently this option just requests a client certificate and does not verify it. it's giving "asks for the notes but doesn't check them."-d,--htdocs=<PATH>β specify the document root. if you don't set this, the document root is just the current working directory. casual.-v,--verboseβ print debug info, like the reception and transmission of frames and name/value pairs. the receipts, basically. π--no-tlsβ disable SSL/TLS. no encryption, just vibes (and also this is what makes<PRIVATE_KEY>and<CERT>optional).-c,--header-table-size=<SIZE>β specify the decoder header table size.--encoder-header-table-size=<SIZE>β specify the encoder header table size. so here's the tea: the decoder (that's the client) specifies the maximum dynamic table size it accepts. then the negotiated dynamic table size is the minimum of this option's value and the value the client specified. teamwork, but make it β¨negotiationβ¨.--colorβ force colored log output. because plain logs are boring and we don't do boring here. π-p,--push=<PATH>=<PUSH_PATH,...>β push resources<PUSH_PATH>s whenever<PATH>gets requested. you can use this option repeatedly to set up multiple push configurations.<PATH>and<PUSH_PATH>s are relative to the document root β see the--htdocsoption. example:-p/=/foo.png -p/doc=/bar.css. proactive queen behavior. π-b,--padding=<N>β add at most<N>bytes to a frame payload as padding. specify0to disable padding.-m,--max-concurrent-streams=<N>β set the maximum number of concurrent streams in one HTTP/2 session.- Default:
100
- Default:
-n,--workers=<N>β set the number of worker threads.- Default:
1
- Default:
-e,--error-gzipβ make the error response gzipped. even the errors get compressed, she's efficient like that.-w,--window-bits=<N>β sets the stream level initial window size to2**<N>-1.-W,--connection-window-bits=<N>β sets the connection level initial window size to2**<N>-1.--dh-param-file=<PATH>β path to a file that contains DH parameters in PEM format. heads up: without this option, DHE cipher suites are not available. so if you want DHE, you gotta bring the file. π--early-responseβ start sending the response when the request HEADERS is received, rather than waiting for the complete request to arrive. impatient in the best way.--trailer=<HEADER>β add a trailer header to a response.<HEADER>must not include a pseudo header field (a header field name starting with:). the trailer is sent only if the response has a body part. example:--trailer 'foo: bar'.--hexdumpβ display the incoming traffic in hexadecimal (Canonical hex+ASCII display). if SSL/TLS is used, the decrypted data is what gets used. π--echo-uploadβ send back the uploaded content if the method isPOSTorPUT. she's just repeating it back to you, respectfully.--mime-types-file=<PATH>β path to a file containing MIME media types and the extensions that represent them.- Default:
/etc/mime.types
- Default:
--no-content-lengthβ don't send the content-length header field.--groups=<GROUPS>β specify the supported groups.- Default:
X25519:P-256:P-384:P-521
- Default:
--ktlsβ enable ktls.--versionβ display version information and exit.-h,--helpβ display this help and exit.
quick note before you go: the<SIZE>argument is an integer with an optional unit (like,10Kmeans10 * 1024). the units areK,MandGβ all powers of1024. π
π₯ SEE ALSO π₯
the rest of the fam:
π« Author π«
Tatsuhiro Tsujikawa β we thank her, we love her, she built this. π«Ά
π Copyright π
2012, 2015, 2016, Tatsuhiro Tsujikawa
and that's the whole page, bestie β you now know nghttpd better than like 90% of the internet. this was version 1.70.0, dated Jul 29, 2026, straight out of the nghttp2 manual β¨ go run that server, slay, and remember: it's still NGHTTPD(1) at the end of the day. πππ¦
π¦ where this page comes from
- alpine 3.24: nghttp2-doc 1.70.0-r0 Β· MIT
- nixpkgs unstable: nghttp2 1.70.0
- ubuntu stonking: nghttp2-server 1.70.0-1 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms