Docs
Turn on HTTP/2
Turn on HTTP/2
With HTTP/1.1 a browser downloads at most about six files at a time from one domain, and every other file waits in line. A typical page with 60–100 images, scripts and styles loads in waves. HTTP/2 sends all of them over one connection at once, with compressed headers, so the same page starts showing sooner, most noticeably on a phone with high latency. Nothing on the site has to change: the HTML, the files and the addresses stay the same.
Every current browser supports HTTP/2, and most servers have supported it for years; often it just was not turned on. The site checklist shows a warning when the page is served only over HTTP/1.1. HTTP/3 counts as a pass too.
Before you start: HTTPS
Browsers use HTTP/2 only over HTTPS. A site still served over plain http:// has to get a certificate and a redirect first: see Redirect HTTP to HTTPS.
Check it yourself
Replace example.com with your site:
curl -s -o /dev/null --http2 -w '%{http_version}\n' https://example.com/
openssl s_client -connect example.com:443 -servername example.com -alpn h2 </dev/null 2>/dev/null | grep -i alpn
The first command prints 2 (or 3) when HTTP/2 works and 1.1 when it does not. The second shows what the server agreed to during the TLS handshake: ALPN protocol: h2 is HTTP/2, No ALPN negotiated means the server does not offer it.
How to fix
Pick the server that the visitor's browser actually talks to. If the site runs behind Cloudflare, that is Cloudflare, and the origin server does not matter for this item.
nginx
First check the version with nginx -v. The setting moved in version 1.25.1.
nginx 1.25.1 and newer, in the site's server { … } block for port 443:
server {
listen 443 ssl;
http2 on;
# …
}
Older nginx (for example 1.22 on Debian 12, 1.24 on Ubuntu 24.04), add http2 to the listen line:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
# …
}
The site's file is in /etc/nginx/sites-available/ on Debian and Ubuntu and in /etc/nginx/conf.d/ on Rocky, Alma and CentOS. Test and apply:
sudo nginx -t && sudo systemctl reload nginx
Apache and LiteSpeed
With server access (Apache). HTTP/2 is mod_http2, available since Apache 2.4.17. On Debian and Ubuntu enable it with sudo a2enmod http2; on Rocky, Alma and CentOS install it with sudo dnf install mod_http2. Then add this to the <VirtualHost *:443> of the site, or once to the main configuration for all sites:
Protocols h2 http/1.1
One condition: HTTP/2 does not work with the prefork MPM, which Debian and Ubuntu use when PHP runs as mod_php. Check with apachectl -V | grep -i mpm. If it says prefork, switch to PHP-FPM and the event MPM first (replace 8.3 with your PHP version):
sudo apt install php8.3-fpm
sudo a2dismod php8.3 mpm_prefork
sudo a2enmod mpm_event proxy_fcgi setenvif http2
sudo a2enconf php8.3-fpm
sudo apachectl configtest && sudo systemctl restart apache2
A change of MPM needs a full restart, not a reload. On Rocky, Alma and CentOS PHP-FPM with event is already the default.
LiteSpeed serves HTTP/2 (and HTTP/3) on HTTPS without any setting. A LiteSpeed host that answers only with HTTP/1.1 has turned it off at the server level; ask support.
cPanel
Shared hosting: HTTP/2 is a server-wide setting that only the host can change. Ask support to turn it on; most hosts already have it.
Your own server with WHM:
- Open WHM → EasyApache 4 and click Customize next to the current profile.
- Under Apache MPM, choose
mod_mpm_event(ormod_mpm_worker). HTTP/2 does not work withprefork. - Under Apache Modules, turn on
mod_http2. - Go to Review and click Provision.
If the server still runs PHP as an Apache module (DSO), switching away from prefork requires moving PHP to PHP-FPM, which you do in MultiPHP Manager.
Plesk
In Plesk, nginx answers visitors and HTTP/2 is turned on by default in current versions. If the check shows HTTP/1.1, turn it on from the server's command line:
plesk bin http2_pref --enable
HTTP/2 needs nginx: if it was turned off (the site runs on Apache alone), turn it back on with plesk sbin nginxmng --enable or ask the host. On shared Plesk hosting, ask the host to run the command above.
Cloudflare
When the site runs behind Cloudflare (orange cloud), Cloudflare serves visitors over HTTP/2 on every plan, whatever the origin server supports. HTTP/3 can be turned on in the domain's Network settings (HTTP/3 (with QUIC)).
If the check still shows HTTP/1.1, the record is probably DNS only (grey cloud), so visitors talk to your server directly. Turn on the proxy or fix the server using its tab.
Node.js and Next.js
Node.js has an http2 module, but in production a Node or Next.js application usually sits behind nginx, a load balancer or a platform such as Vercel, and that is where HTTP/2 is decided. Vercel and Netlify serve HTTP/2 and HTTP/3 by default. Behind your own nginx, follow the nginx tab; the connection from nginx to the application can stay HTTP/1.1.
IIS and ASP.NET
IIS 10 (Windows Server 2016 and newer) uses HTTP/2 automatically for every HTTPS binding. IIS 8.5 and older (Windows Server 2012 R2) cannot do it; the only way there is a newer Windows Server or a proxy such as Cloudflare in front.
On Windows Server 2019 and newer, the HTTPS binding has a Disable HTTP/2 checkbox (Site → Bindings → Edit). Make sure it is not ticked.
Hosted platforms
Shopify, Wix, Squarespace and Webflow serve every site over HTTP/2 or HTTP/3. If the checklist shows HTTP/1.1 for a site on one of them, the domain probably does not point at the platform directly, for example through an old proxy; check its DNS records.
Confirm the fix
Run the curl command from Check it yourself again, then open the target in PulseKeeper and click Check now on the Checklist tab. The item turns OK within a few minutes instead of at the next daily run.