Select Page

A prior model of this instructional used to be written via Sergey Zhukaev.


Nginx is a quick and dependable open-source internet server. It received its recognition because of its low reminiscence footprint, prime scalability, ease of configuration, and give a boost to for all kinds of protocols.

HTTP/2 is a brand new model of the Hypertext Shipping Protocol, which is used at the Internet to ship pages from server to browser. HTTP/2 is the primary main replace of HTTP in nearly 20 years: HTTP1.1 used to be presented to the general public again in 1999 when webpages had been normally only a unmarried HTML report with inline CSS stylesheet. The Web has dramatically modified since then, and now we face the constraints of HTTP 1.1 — the protocol limits doable switch speeds for most current internet sites as it downloads portions of a web page in a queue (the former section should obtain utterly sooner than the obtain of the following section starts), and a median trendy webpage calls for about 100 request to be downloaded (each and every request is an image, js report, css report, and many others).

HTTP/2 solves this drawback as it brings a couple of basic adjustments:

  • All requests are downloaded in parallel, now not in a queue
  • HTTP headers are compressed
  • Pages switch as a binary, now not as a textual content report, which is extra environment friendly
  • Servers can “push” knowledge even with out the consumer’s request, which improves velocity for customers with prime latency

Despite the fact that HTTP/2 does now not require encryption, builders of 2 hottest browsers, Google Chrome and Mozilla Firefox, mentioned that for the protection causes they’re going to give a boost to HTTP/2 just for HTTPS connections. Therefore, if you make a decision to arrange servers with HTTP/2 give a boost to, you should additionally safe them with HTTPS.

This instructional will mean you can arrange a quick and safe Nginx server with HTTP/2 give a boost to.


Ahead of we get began, we can want a couple of issues:

  • One Ubuntu 18.04 server arrange via following the Ubuntu 18.04 initial server setup guide, together with a sudo non-root consumer and a firewall.
  • Nginx put in to your server, which you’ll be able to do via following How To Install Nginx on Ubuntu 18.04.
  • A website title configured to indicate in your server. You’ll acquire one on Namecheap or get one at no cost on Freenom. You’ll discover ways to level domain names to DigitalOcean Droplets via following the How To Set Up a Host Name with DigitalOcean instructional.
  • A TLS/SSL certificates configured to your server. You could have 3 solutions:
  • Nginx configured to redirect site visitors from port 80 to port 443, which will have to be lined via the former must haves.
  • Nginx configured to make use of a 2048-bit or upper Ephemeral Diffie-Hellman (DHE) key, which will have to even be lined via the former must haves.

Step 1 — Enabling HTTP/2 Fortify

If you happen to adopted the server block set up step in the Nginx installation tutorial, you’ll have a server block to your area at /and many others/nginx/sites-available/your_domain with the server_namedirective already set correctly. The primary trade we can make shall be to switch your area’s server block to make use of HTTP/2.

Open the configuration report to your area:

  • sudo nano /and many others/nginx/sites-available/your_domain

Within the report, find the concentrate variables related to port 443:

your_domain’>/and many others/nginx/sites-available/your_domain

    concentrate [::]:443 ssl ipv6only=on; 
    concentrate 443 ssl; 

The primary one is for IPv6 connections. The second is for all IPv4 connections. We will be able to permit HTTP/2 for each.

Alter each and every concentrate directive to incorporate http2:

your_domain’>/and many others/nginx/sites-available/your_domain

    concentrate [::]:443 ssl http2 ipv6only=on; 
    concentrate 443 ssl http2; 

This tells Nginx to make use of HTTP/2 with supported browsers.

Save the configuration report and edit the textual content editor.

Each time you’re making adjustments to Nginx configuration recordsdata, you will have to test the configuration for syntax mistakes, like this:

If the syntax is error-free, you’re going to see the next output:

Output of sudo nginx -t

nginx: the configuration report /and many others/nginx/nginx.conf syntax is fine
nginx: configuration report /and many others/nginx/nginx.conf take a look at is a success

Subsequent, we will configure our server to make use of a extra restrictive checklist of ciphers.

Step 2 — Casting off Previous and Insecure Cipher Suites

HTTP/2 has a blacklist of outdated and insecure ciphers, so we should keep away from them. Cipher suites are cryptographic algorithms that describe how the transferred knowledge will have to be encrypted.

The process you’ll be able to use to outline the ciphers will depend on how you’ve got configured your TLS/SSL certificate for Nginx.

If you happen to used Certbot to procure your certificate, it additionally created the report /and many others/letsencrypt/options-ssl-nginx.conf which accommodates ciphers which don’t seem to be robust sufficient for HTTP/2. Enhancing this report will sadly save you Certbot from making use of updates at some point, so we will simply inform Nginx to not use this report and we will specify our personal checklist of ciphers.

Open the server block configuration report to your area:

sudo nano /and many others/nginx/sites-available/your_domain

Find the road that comes with the options-ssl-nginx.conf report and remark it out:

your_domain’>/and many others/nginx/sites-available/your_domain

    # come with /and many others/letsencrypt/options-ssl-nginx.conf; # controlled via Certbot

Under that line, upload this line to outline the allowed ciphers:

your_domain’>/and many others/nginx/sites-available/your_domain


Save the report and go out the editor.

If you happen to used self-signed certificate or used a certificates from a 3rd birthday party and configured it in step with the necessities, open the report /and many others/nginx/snippets/ssl-params.conf for your textual content editor:

  • sudo nano /and many others/nginx/snippets/ssl-params.conf

Find the next line:

/and many others/nginx/snippets/ssl-params.conf


Alter it so it looks as if this:

/and many others/nginx/snippets/ssl-params.conf


Save the report and go out your editor.

As soon as once more, test the configuration for syntax mistakes:

If you happen to see any mistakes, cope with them and take a look at once more.

When you see no syntax mistakes, restart Nginx:

  • sudo systemctl reload nginx

With the server restarted, let’s check that it really works.

Step 3 — Verifying that HTTP/2 is Enabled

Let’s make sure that the server is operating and dealing with HTTP/2.

Use the curl command to make a request in your web page and consider the headers:

  • curl -I -L https://your_domain

You can see the next output:


HTTP/1.1 301 Moved Completely Server: nginx/1.14.0 (Ubuntu) Date: Fri, 06 Jul 2018 19:07:12 GMT Content material-Sort: textual content/html Content material-Period: 194 Connection: keep-alive Location: https://your_domain/ HTTP/2 200 server: nginx/1.14.0 (Ubuntu) date: Fri, 06 Jul 2018 19:07:12 GMT content-type: textual content/html content-length: 16 last-modified: Fri, 06 Jul 2018 16:55:37 GMT etag: "5b3f9f09-10" accept-ranges: bytes

You’ll additionally check that HTTP/2 is in use in Google Chrome. Open Chrome and navigate to http://your_domain. Open the Chrome Developer Equipment (View -> Developer -> Developer Equipment) and reload the web page (View -> Reload This Web page). Navigate to the Community tab, right-click at the desk header row that begins with Title, and make a selection the Protocol possibility from the popup menu.

You can see h2 (which stands for HTTP/2) in a brand new Protocol column, indicating that HTTP/2 is operating.

Chrome Developer Tools HTTP/2 check

At this level, you are ready to serve content material during the HTTP/2 protocol. Let’s enhance safety and function via enabling HSTS.

Step 4 — Enabling HTTP Strict Shipping Safety (HSTS)

Despite the fact that your HTTP requests redirect to HTTPS, you’ll be able to permit HTTP Strict Shipping Safety (HSTS) to keep away from having to do the ones redirects. If the browser reveals an HSTS header, it is going to now not check out to hook up with the server by means of common HTTP once more for a given period of time. It doesn’t matter what, it is going to alternate knowledge the usage of most effective encrypted HTTPS connection. This header additionally protects us from protocol downgrade attacks.

Open the Nginx configuration report for your editor:

sudo nano /and many others/nginx/nginx.conf

Upload this line to the report to permit HSTS:

/and many others/nginx/nginx.conf

http {
    # Digital Host Configs

    come with /and many others/nginx/conf.d/*.conf;
    come with /and many others/nginx/sites-enabled/*;
    add_header Strict-Shipping-Safety "max-age=15768000" at all times;

The max-age is about in seconds. The worth 15768000 is identical to six months.

By means of default, this header isn’t added to subdomain requests. When you have subdomains and wish HSTS to use to they all, you will have to upload the includeSubDomains variable on the finish of the road, like this:

/and many others/nginx/nginx.conf

add_header Strict-Shipping-Safety "max-age=15768000; includeSubDomains" at all times;

Save the report, and go out the editor.

As soon as once more, test the configuration for syntax mistakes:

In the end, restart the Nginx server to use the adjustments.

  • sudo systemctl reload nginx


Your Nginx server is now serving HTTP/2 pages. If you wish to take a look at the energy of your SSL connection, please consult with Qualys SSL Lab and run a take a look at in opposition to your server. If the whole thing is configured correctly, you will have to get an A+ mark for safety.