如何在 Ubuntu 18.04 上设置支持 HTTP/2 的 Nginx如何在 Ubuntu 18.04 上设置支持 HTTP/2 的 Nginx如何在 Ubuntu 18.04 上设置支持 HTTP/2 的 Nginx如何在 Ubuntu 18.04 上设置支持 HTTP/2 的 Nginx
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Ubuntu 18.04 上设置支持 HTTP/2 的 Nginx

本教程的先前版本由 Sergey Zhukaev 编写。

介绍

Nginx 是一种快速可靠的开源 Web 服务器。它因其低内存占用、高可扩展性、易于配置和支持多种协议而广受欢迎。

HTTP/2 是超文本传输协议的新版本,在 Web 上用于将页面从服务器传送到浏览器。 HTTP/2 是近二十年来 HTTP 的第一次重大更新:HTTP1.1 于 1999 年向公众推出,当时网页通常只是带有内联 CSS 样式表的单个 HTML 文件。从那时起,互联网发生了翻天覆地的变化,现在我们面临着 HTTP 1.1 的限制——该协议限制了大多数现代网站的潜在传输速度,因为它会在队列中下载部分页面(前一部分必须在下载之前完全下载)下一部分开始),一个现代网页平均需要大约100个请求才能下载(每个请求是一张图片、js文件、css文件等)。

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

  • 所有请求都是并行下载的,而不是在队列中
  • HTTP 标头已压缩
  • 页面以二进制形式传输,而不是文本文件,效率更高
  • 即使没有用户的请求,服务器也可以“推送”数据,这提高了高延迟用户的速度

尽管 HTTP/2 不需要加密,但两个最流行的浏览器 Google Chrome 和 Mozilla Firefox 的开发人员表示,出于安全原因,他们将仅支持 HTTP/2 用于 HTTPS 连接。因此,如果您决定设置支持 HTTP/2 的服务器,您还必须使用 HTTPS 保护它们。

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

先决条件

在我们开始之前,我们需要做一些事情:

  • 按照 Ubuntu 18.04 初始服务器设置指南设置一台 Ubuntu 18.04 服务器,包括 sudo 非根用户和防火墙。
  • 在您的服务器上安装了 Nginx,您可以按照如何在 Ubuntu 18.04 上安装 Nginx 进行操作。
  • 配置为指向您的服务器的域名。您可以在如何使用 DigitalOcean 管理您的域上购买一个。
  • 为您的服务器配置的 TLS/SSL 证书。您有以下三种选择:
    • 您可以从如何在 Ubuntu 18.04 上使用 Let's Encrypt 保护 Nginx 获得免费证书。
    • 您还可以按照如何在 Ubuntu 18.04 中为 Nginx 创建自签名 SSL 证书来生成和配置自签名证书。
    • 您可以了解如何在 Ubuntu 18.04 中为 Nginx 创建自签名 SSL 证书。

    第 1 步 — 启用 HTTP/2 支持

    如果您遵循 Nginx 安装教程中的服务器块设置步骤,您应该在 /etc/nginx/sites-available/your_domain 为您的域设置一个服务器块server_name 指令已正确设置。我们将进行的第一个更改是修改您域的服务器块以使用 HTTP/2。

    打开您的域的配置文件:

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

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

    ...
        listen [::]:443 ssl ipv6only=on; 
        listen 443 ssl; 
    ...
    

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

    修改每个 listen 指令以包含 http2:

    ...
        listen [::]:443 ssl http2 ipv6only=on; 
        listen 443 ssl http2; 
    ...
    

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

    保存配置文件并退出文本编辑器。

    每当您更改 Nginx 配置文件时,您应该检查配置是否存在语法错误,如下所示:

    1. sudo nginx -t

    如果语法没有错误,您将看到以下输出:

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    

    接下来,我们将配置我们的服务器以使用更严格的密码列表。

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

    HTTP/2 有一个旧的和不安全的密码黑名单,所以我们必须避免使用它们。密码套件是描述传输数据应如何加密的加密算法。

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

    如果您使用 Certbot 获取证书,它还会创建文件 /etc/letsencrypt/options-ssl-nginx.conf,其中包含的密码强度不足以支持 HTTP/2。不幸的是,修改这个文件会阻止 Certbot 将来应用更新,所以我们只告诉 Nginx 不要使用这个文件,我们将指定我们自己的密码列表。

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

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

    找到包含 options-ssl-nginx.conf 文件的行并将其注释掉:

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

    在该行下方,添加此行以定义允许的密码:

    
    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

    找到以下行:

    ...
    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;
    ...
    

    修改它,使其看起来像这样:

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

    保存文件并退出编辑器。

    再次检查配置是否存在语法错误:

    1. sudo nginx -t

    如果您看到任何错误,请解决它们并再次测试。

    一旦您没有看到语法错误,请重新启动 Nginx:

    1. sudo systemctl reload nginx

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

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

    让我们确保服务器正在运行并使用 HTTP/2。

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

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

    您将看到以下输出:

    Output
    HTTP/1.1 301 Moved Permanently Server: nginx/1.14.0 (Ubuntu) Date: Fri, 06 Jul 2018 19:07:12 GMT Content-Type: text/html Content-Length: 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: text/html content-length: 16 last-modified: Fri, 06 Jul 2018 16:55:37 GMT etag: "5b3f9f09-10" accept-ranges: bytes

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

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

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

    第 4 步 — 启用 HTTP 严格传输安全 (HSTS)

    即使您的 HTTP 请求重定向到 HTTPS,您也可以启用 HTTP 严格传输安全 (HSTS) 以避免必须进行这些重定向。如果浏览器找到 HSTS 标头,它将不会在给定时间段内再次尝试通过常规 HTTP 连接到服务器。无论如何,它只会使用加密的 HTTPS 连接来交换数据。这个标头还可以保护我们免受协议降级攻击。

    在编辑器中打开 Nginx 配置文件:

    sudo nano /etc/nginx/nginx.conf
    

    将此行添加到文件以启用 HSTS:

    http {
    ...
        ##
        # Virtual Host Configs
        ##
    
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
        add_header Strict-Transport-Security "max-age=15768000" always;
    }
    ...
    

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

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

    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
    

    保存文件,然后退出编辑器。

    再次检查配置是否存在语法错误:

    1. sudo nginx -t

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

    1. sudo systemctl reload nginx

    结论

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

©2015-2025 艾丽卡 support@alaica.com