15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
01.11.2024

如何在 Ubuntu 上安装支持 HTTP/2 的 Nginx(完整指南)

Nginx 是世界上部署最广泛的网络服务器之一,以其卓越的性能、低内存占用和处理数千个并发连接的能力而闻名。与 HTTP/2 结合使用时,Nginx 成为一个更加强大的平台——支持多路复用请求、报头压缩、服务器推送,并显著减少页面加载时间。

本综合指南将逐步引导您在 Ubuntu 20.04 和 Ubuntu 22.04 LTS 上安装具有完整 HTTP/2 支持的 Nginx,从初始设置到 SSL 配置、服务器块优化和实时验证。

> 本指南适合谁? 系统管理员、开发人员和网站所有者,他们希望在 Linux 服务器上最大化网络性能。如果您在 VPS 托管计划或 专用服务器上运行您的网站,本教程直接适用于您的环境。

目录

  1. 什么是 HTTP/2 及其重要性?
  2. 前置条件
  3. 步骤 1 — 更新系统软件包索引
  4. 步骤 2 — 安装 Nginx
  5. 步骤 3 — 安装 OpenSSL
  6. 步骤 4 — 使用 Let’s Encrypt 获取免费 SSL 证书
  7. 步骤 5 — 配置 Nginx 以支持 HTTP/2
  8. 步骤 6 — 优化您的 Nginx HTTP/2 配置
  9. 步骤 7 — 测试 Nginx 配置
  10. 步骤 8 — 重启 Nginx 并应用更改
  11. 步骤 9 — 验证 HTTP/2 是否活跃
  12. 故障排除常见问题
  13. 结论

什么是 HTTP/2 及其重要性?

HTTP/2 是超文本传输协议的第二个主要版本,在 RFC 7540 中标准化。它旨在解决自 1997 年以来一直在使用的 HTTP/1.1 的性能限制。

HTTP/2 相比 HTTP/1.1 的主要优势:

功能HTTP/1.1HTTP/2
多路复用每个连接一个请求多个同时请求
报头压缩纯文本报头HPACK 压缩
服务器推送不支持支持
二进制协议基于文本二进制分帧
连接重用有限完全持久
延迟更高显著降低

对于网站所有者来说,启用 HTTP/2 直接转化为 更快的页面加载、更好的 Core Web Vitals 分数和改进的 SEO 排名——因为 Google 将页面速度作为排名信号。

> 重要提示: HTTP/2 需要 HTTPS(TLS/SSL)。您不能在任何现代浏览器上通过未加密的连接运行 HTTP/2。这就是为什么获取 SSL 证书是本指南中的强制步骤。如果您需要为您的域获取受信任的证书,AlexHost 为所有用例提供 SSL 证书

前置条件

在开始之前,请确保您已准备好以下内容:

  • 运行 Ubuntu 20.04 LTS 或 Ubuntu 22.04 LTS 的服务器(两者的步骤几乎相同)
  • 具有 sudo 权限的非 root 用户或直接 root 访问权限
  • 已注册的域名通过 A 记录指向您的服务器 IP 地址
  • 端口 80 和 443 在防火墙中开放(UFW 或 iptables)
  • 对 Linux 命令行的基本熟悉

如果您还没有域名,可以直接通过 AlexHost 域名注册注册一个,并在几分钟内将其指向您的服务器。

步骤 1 — 更新系统软件包索引

始终从刷新您的软件包索引开始,以确保您安装的是所有软件的最新可用版本:

sudo apt update && sudo apt upgrade -y

此命令更新本地软件包列表并升级系统上已安装的任何过时软件包。

步骤 2 — 安装 Nginx

安装 Nginx 软件包

Ubuntu 的默认存储库包含 Nginx 的稳定版本。使用以下命令安装它:

sudo apt install nginx -y

启动 Nginx 服务

安装后,立即启动 Nginx 服务:

sudo systemctl start nginx

启用 Nginx 在启动时自动启动

确保 Nginx 在每次服务器重启时自动启动:

sudo systemctl enable nginx

验证 Nginx 正在运行

确认服务处于活跃状态并正在运行:

sudo systemctl status nginx

您应该看到类似的输出:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since ...

允许 Nginx 通过防火墙

如果您的服务器上启用了 UFW,请允许 HTTP 和 HTTPS 流量:

sudo ufw allow 'Nginx Full'
sudo ufw status

Nginx Full 打开端口 80(HTTP)和端口 443(HTTPS),两者都是此设置所需的。

步骤 3 — 安装 OpenSSL

HTTP/2 依赖于 TLS,而 TLS 又依赖于 OpenSSL。安装它以确保所有加密依赖项都可用:

sudo apt install openssl -y

验证已安装的版本:

openssl version

您应该看到类似 OpenSSL 3.0.x 的输出。任何高于 1.0.2 的版本都完全支持 HTTP/2 所需的密码套件。

步骤 4 — 使用 Let’s Encrypt 获取免费 SSL 证书

Let’s Encrypt 提供免费、自动可续期的 SSL/TLS 证书,受所有主要浏览器信任。Certbot 客户端使整个过程变得简单直接。

安装 Certbot 和 Nginx 插件

sudo apt install certbot python3-certbot-nginx -y

请求您的 SSL 证书

your_domain.com 替换为您实际注册的域名:

sudo certbot --nginx -d your_domain.com -d www.your_domain.com

Certbot 将:

  1. 通过 HTTP 质询验证域所有权
  2. 从 Let’s Encrypt 颁发证书
  3. 自动修改您的 Nginx 配置以使用证书
  4. 设置从 HTTP 到 HTTPS 的重定向

按照交互式提示进行操作。当被问及是否将 HTTP 流量重定向到 HTTPS 时,选择 选项 2(重定向)——这是推荐的选择。

验证自动证书续期

Let’s Encrypt 证书在 90 天后过期。Certbot 安装 cron 作业或 systemd 计时器以自动续期。使用试运行测试续期过程:

sudo certbot renew --dry-run

如果没有出现错误,自动续期配置正确。

> 提示: 对于具有多个域或通配符证书的生产环境,请考虑使用 专用服务器以完全控制您的 SSL 基础设施。

步骤 5 — 配置 Nginx 以支持 HTTP/2

现在 SSL 已就位,您需要在 Nginx 服务器块配置中显式启用 HTTP/2。

打开 Nginx 配置文件

默认网站配置位于:

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

如果您为您的域创建了自定义服务器块(推荐),请改为打开该文件:

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

更新服务器块以启用 HTTP/2

找到 listen 443 ssl; 指令。Certbot 会自动添加此指令。修改它以包含 http2

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name your_domain.com www.your_domain.com;

    # SSL Certificate paths (set by Certbot)
    ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    root /var/www/your_domain.com/html;
    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ =404;
    }
}

# HTTP to HTTPS redirect block
server {
    listen 80;
    listen [::]:80;
    server_name your_domain.com www.your_domain.com;
    return 301 https://$host$request_uri;
}

关键变化在 listen 行:在 ssl 后添加 http2 为该虚拟主机激活 HTTP/2 协议。

保存并退出

CTRL + X,然后 Y,然后 Enter 以保存文件并退出 nano 编辑器。

步骤 6 — 优化您的 Nginx HTTP/2 配置

仅启用 HTTP/2 是一个好的开始,但应用额外的优化可确保您从设置中获得最大性能。

推荐的 SSL 和性能设置

在您的 server 块内添加或验证以下指令:

# Modern TLS protocols only
ssl_protocols TLSv1.2 TLSv1.3;

# Strong cipher suites compatible with HTTP/2
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;

# SSL session caching for performance
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;

# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

# HTTP Strict Transport Security (HSTS)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

# Additional security headers
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

# Gzip compression (complements HTTP/2)
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;

> 关于 HTTP/2 和 Gzip 的注意: HTTP/2 使用自己的 HPACK 报头压缩,但为响应体启用 Gzip 仍然为基于文本的资产提供显著的带宽节省。

步骤 7 — 测试 Nginx 配置

在重启 Nginx 之前,始终先测试配置是否存在语法错误。 配置错误的文件可能会导致整个网络服务器宕机。

运行内置配置测试:

sudo nginx -t

成功的测试会产生:

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

如果您看到任何错误,请仔细查看输出。错误消息将包含检测到问题的文件名和行号。

步骤 8 — 重启 Nginx 并应用更改

配置测试通过后,重启 Nginx 以应用所有更改:

sudo systemctl restart nginx

或者,如果您更喜欢零停机重新加载(应用配置更改而不中断活跃连接):

sudo systemctl reload nginx

对于 HTTP/2 启用,特别推荐完整 重启以确保新协议设置完全初始化。

步骤 9 — 验证 HTTP/2 是否活跃

重启 Nginx 后,使用以下方法之一确认 HTTP/2 实际上正在为客户端提供服务。

方法 1:使用 curl

curl 命令行工具可以报告所使用的协议版本:

curl -I --http2 https://your_domain.com

查找响应报头:

HTTP/2 200

如果您看到 HTTP/2 200,HTTP/2 正在正常工作。

方法 2:使用 OpenSSL 命令

openssl s_client -connect your_domain.com:443 -alpn h2

在输出中,查找:

ALPN protocol: h2

h2 是 HTTP/2 的 ALPN 标识符。如果您看到这个,您的服务器在 TLS 握手期间正确地宣传 HTTP/2 支持。

方法 3:使用浏览器开发者工具

  1. Google ChromeMozilla Firefox 中打开您的网站
  2. F12 打开开发者工具
  3. 导航到 Network 选项卡
  4. 重新加载页面(F5Ctrl+R
  5. 右键单击请求列表中的任何列标题并启用 Protocol
  6. 您应该看到 h2 列为您的域请求的协议

方法 4:使用在线 HTTP/2 测试工具

访问 https://tools.keycdn.com/http2-test 并输入您的域。该工具将确认 HTTP/2 是否活跃,并提供有关您的服务器 TLS 配置的其他详细信息。

故障排除常见问题

尽管配置了 HTTP/2,但浏览器中未显示

  • 原因: 浏览器缓存了较旧的 HTTP/1.1 连接。
  • 解决方案: 清除浏览器缓存和 Cookie,或在隐私/无痕窗口中测试。

nginx -t 返回 SSL 证书错误

  • 原因: 配置文件中的证书路径不正确。
  • 解决方案: 使用 sudo ls /etc/letsencrypt/live/your_domain.com/ 验证确切的路径,并相应地更新 ssl_certificatessl_certificate_key 指令。

端口 443 无法访问

  • 原因: 防火墙阻止 HTTPS 流量。
  • 解决方案: 运行 sudo ufw allow 443/tcp 并使用 sudo ufw status 验证。

Certbot 域验证失败

  • 原因: DNS A 记录尚未传播,或端口 80 被阻止。
  • 解决方案:
15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用