如何在Ubuntu 22.04上安装支持HTTP/2的Nginx

A previous version of this tutorial was written by Sergey Zhukaev.

介绍

Nginx是一个快速可靠的开源Web服务器。由于其低内存占用、高可伸缩性、易于配置以及对各种协议的支持而备受青睐。

HTTP/2是超文本传输协议的新版本,用于在网络上从服务器传递页面到浏览器。HTTP/2是近二十年来的首次重大更新:HTTP1.1于1999年向公众发布,当时网页的大小要小得多。自那时以来,互联网发生了巨大变化,我们现在面临HTTP 1.1的局限性。该协议限制了大多数现代网站的潜在传输速度,因为它按顺序下载页面的各个部分 – 先下载完上一部分,然后才开始下载下一部分 – 而平均现代网页要下载数十个单独的CSS、JavaScript和图像资源。

HTTP/2解决了这个问题,因为它带来了一些基本的改变:

  • 所有请求都是并行下载的,而不是排队下载
  • HTTP头部被压缩
  • 页面作为二进制传输,而不是作为文本文件,这更加高效
  • 服务器可以在没有用户请求的情况下“推送”数据,这提高了延迟高的用户的速度

即使HTTP/2不要求加密,但两个最流行的浏览器Google Chrome和Mozilla Firefox的开发者表示,出于安全考虑,他们将仅支持HTTP/2的HTTPS连接。因此,如果您决定搭建支持HTTP/2的服务器,则必须同时使用HTTPS来确保安全。

本教程将帮助您设置一个快速且安全的Nginx服务器,支持HTTP/2。

前提条件

开始之前,您需要准备以下几样东西:

  • 一个Ubuntu 22.04服务器,您可以通过遵循Ubuntu 22.04初始服务器设置指南来设置,包括一个sudo非根用户和防火墙。
  • 在您的服务器上安装Nginx,您可以通过遵循在Ubuntu 22.04上安装Nginx来完成。
  • A domain name configured to point to your server. You can purchase one on Namecheap or get one for free on Freenom. You can learn how to point domains to DigitalOcean Droplets by following the documentation on How To Manage Your Domain With DigitalOcean.
  • A TLS/SSL certificate configured for your server. You have two options:
  • Nginx配置为将流量从端口80重定向到端口443,这应该是由先前的先决条件覆盖的。
  • Nginx配置为使用2048位或更高的短暂Diffie-Hellman(DHE)密钥,这也应该由先前的先决条件覆盖。

步骤1 — 启用HTTP/2支持

如果您遵循了Nginx安装教程中的服务器块设置步骤,则应该在/etc/nginx/sites-available/your_domain下为您的域设置了一个服务器块,并且server_name指令已经适当设置。我们将要做的第一个更改是修改您的域的服务器块以使用HTTP/2。

使用nano或您喜欢的编辑器打开您域的配置文件:

  1. sudo nano /etc/nginx/sites-enabled/your_domain

在文件中,找到与端口443相关的listen变量:

/etc/nginx/sites-enabled/your_domain
...
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; 
...

第一个用于IPv6连接。第二个用于所有IPv4连接。我们将为两者启用HTTP/2。

修改每个listen指令以包括http2

/etc/nginx/sites-enabled/your_domain
...
    listen [::]:443 ssl http2 ipv6only=on; 
    listen 443 ssl http2; 
...

这告诉Nginx在支持的浏览器中使用HTTP/2。

保存配置文件并退出文本编辑器。如果您正在使用nano,按Ctrl+X,然后在提示时按Y,然后按Enter。

每当您更改Nginx配置文件时,都应该使用-t标志检查配置文件中的错误,该标志运行Nginx的内置语法检查命令:

  1. sudo nginx -t

如果语法无误,则会收到以下输出:

Output of sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

接下来,您将配置您的Nginx服务器使用更严格的密码列表以改善服务器的安全性。

第2步-删除旧的和不安全的密码套件

HTTP/2有一个黑名单,其中包含应避免使用的旧的和不安全的密码套件。密码套件是描述传输数据应如何加密的加密算法。

您将使用的方法取决于您如何为Nginx配置TLS/SSL证书。

如果您使用Certbot来获取证书,它还会创建文件/etc/letsencrypt/options-ssl-nginx.conf,其中包含对于HTTP/2不够安全的密码。然而,修改此文件将阻止Certbot在将来应用更新,因此我们只需告诉Nginx不要使用此文件,然后我们将指定我们自己的密码列表。

打开您域的服务器块配置文件:

sudo nano /etc/nginx/sites-enabled/your_domain

找到包含options-ssl-nginx.conf文件的行,并通过在该行开头添加#字符来注释它:

/etc/nginx/sites-enabled/your_domain

# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

在该行下面,添加以下行来定义允许使用的密码:

/etc/nginx/sites-enabled/your_domain

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

保存文件并退出编辑器。

如果您使用自签名证书或者使用了第三方证书并根据先决条件配置了它,请在文本编辑器中打开文件/etc/nginx/snippets/ssl-params.conf

  1. sudo nano /etc/nginx/snippets/ssl-params.conf

找到以下行:

/etc/nginx/snippets/ssl-params.conf
...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...

修改为使用以下密码列表:

/etc/nginx/snippets/ssl-params.conf

...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

保存文件并退出编辑器。

再次使用nginx -t命令检查语法错误:

  1. sudo nginx -t

如果遇到任何错误,请解决并重新测试。

一旦您的配置通过了语法检查,请使用systemctl命令重新启动Nginx:

  1. sudo systemctl reload nginx.service

服务器重新启动后,让我们验证它是否正常工作。

步骤3 —— 验证HTTP/2是否已启用

确保服务器正在运行并且已启用HTTP/2。

使用curl命令向您的网站发出请求并查看标头:

  1. curl -I -L --http2 https://your_domain

您将收到如下输出:

HTTP/2 200
**Server**: nginx/1.18.0 (Ubuntu)
**Date**: Tue, 21 Jun 2022 22:19:09 GMT
**Content-Type**: text/html
**Content-Length**: 612
**Last-Modified**: Tue, 21 Jun 2022 22:17:56 GMT
**Connection**: keep-alive
**ETag**: "62b24394-264"
**Accept-Ranges**: bytes

您还可以验证Google Chrome是否正在使用HTTP/2。打开Chrome并导航至https://your_domain。打开Chrome开发者工具(查看 -> 开发者 -> 开发者工具)并重新加载页面(查看 -> 重新加载此页)。导航至网络选项卡,右键单击以以名称开头的表头行,并从弹出菜单中选择协议选项。

您将看到一个新的协议列,其中包含h2(代表HTTP/2),表明HTTP/2正在运行。

在此时,您已准备好通过HTTP/2协议提供内容。让我们通过启用HSTS来提高安全性和性能。

步骤 4 — 启用HTTP Strict Transport Security(HSTS)

即使您的HTTP请求重定向到HTTPS,您也可以启用HTTP Strict Transport Security(HSTS)来避免进行这些重定向。如果浏览器发现了HSTS头,它将在一定时间内不再尝试通过常规HTTP连接到服务器。无论如何,它都将仅使用加密的HTTPS连接交换数据。该头部还可以保护我们免受协议降级攻击的影响。

再次打开您域名的服务器块配置文件:

sudo nano /etc/nginx/your_domain

将以下行添加到包含SSL密码的文件块中,以启用HSTS:

/etc/nginx/your_domain
server {
...
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    add_header Strict-Transport-Security "max-age=15768000" always;
}
...

max-age以秒为单位设置。值15768000相当于6个月。

默认情况下,此头部不会添加到子域请求中。如果您有子域并且希望HSTS应用于所有子域,您应在行的末尾添加includeSubDomains变量,如下所示:

/etc/nginx/your_domain
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

保存文件并退出编辑器。

再次检查语法错误的配置:

  1. sudo nginx -t

最后,重新启动Nginx服务器以应用更改。

  1. sudo systemctl reload nginx.service

结论

您的Nginx服务器现在正在提供HTTP/2页面。如果您想测试SSL连接的强度,请访问Qualys SSL实验室并对您的服务器运行测试。如果一切配置正确,您应该会获得安全性的A+评分。

要了解Nginx如何解析和实现服务器块规则的更多信息,请阅读理解Nginx服务器和位置块选择算法

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-with-http-2-support-on-ubuntu-22-04