Skip to main content
Version: v5.9.x

HTTP2

HTTP/2

Fastify supports HTTP/2 over HTTPS (h2) or plaintext (h2c).

Currently, none of the HTTP/2-specific APIs are available through Fastify, but Node's req and res can be accessed through the Request and Reply interfaces. PRs are welcome.

Secure (HTTPS)

HTTP/2 is supported in all modern browsers only over a secure connection:

'use strict'

const fs = require('node:fs')
const path = require('node:path')
const fastify = require('fastify')({
http2: true,
https: {
key: fs.readFileSync(path.join(__dirname, '..', 'https', 'fastify.key')),
cert: fs.readFileSync(path.join(__dirname, '..', 'https', 'fastify.cert'))
}
})

fastify.get('/', function (request, reply) {
reply.code(200).send({ hello: 'world' })
})

fastify.listen({ port: 3000 })

ALPN negotiation enables both HTTPS and HTTP/2 over the same socket. Node core req and res objects can be either HTTP/1 or HTTP/2. Fastify supports both out of the box:

'use strict'

const fs = require('node:fs')
const path = require('node:path')
const fastify = require('fastify')({
http2: true,
https: {
allowHTTP1: true, // fallback support for HTTP1
key: fs.readFileSync(path.join(__dirname, '..', 'https', 'fastify.key')),
cert: fs.readFileSync(path.join(__dirname, '..', 'https', 'fastify.cert'))
}
})

// This route can be accessed through both protocols
fastify.get('/', function (request, reply) {
reply.code(200).send({ hello: 'world' })
})

fastify.listen({ port: 3000 })

Test the server with:

$ npx h2url https://localhost:3000

Plain or insecure

For microservices, HTTP/2 can connect in plain text, but this is not supported by browsers.

'use strict'

const fastify = require('fastify')({
http2: true
})

fastify.get('/', function (request, reply) {
reply.code(200).send({ hello: 'world' })
})

fastify.listen({ port: 3000 })

Test the new server with:

$ npx h2url http://localhost:3000