Nginx配合PHP 8.0怎么开启HTTP/2?提升并发要怎么配置?

文章导读
Nginx 配合 PHP 8.0 开启 HTTP/2 必须在 HTTPS 环境下配置,监听端口需添加 http2 参数并启用 TLS 1.2 以上协议。提升并发性能不仅依赖 HTTP/2 协议,更需要调整 PHP-FPM 进程管理策略和 Nginx _worker_connections_ 参数,否则可能因后端处理瓶颈导致协议升级无效。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Nginx 配合 PHP 8.0 开启 HTTP/2 必须在 HTTPS 环境下配置,监听端口需添加 http2 参数并启用 TLS 1.2 以上协议。提升并发性能不仅依赖 HTTP/2 协议,更需要调整 PHP-FPM 进程管理策略和 Nginx _worker_connections_ 参数,否则可能因后端处理瓶颈导致协议升级无效。

先说结论:HTTP/2 启用强制要求 HTTPS 证书,并发能力提升取决于 PHP-FPM 进程池配置与 Nginx 事件模型匹配度。

  • 适合:已部署 SSL 证书且需要降低延迟、提升多请求并发处理的 Web 场景。
  • 先准备:确认为 Nginx 编译了 http_v2_module 模块,且拥有有效的 SSL 证书文件。
  • 验收:通过浏览器开发者工具或 curl 命令确认协议版本为 h2,且 PHP-FPM 无进程阻塞日志。

命令速用版

以下配置片段可直接用于 Nginx server 块与 PHP-FPM 池配置,注意路径需根据实际环境调整。

Nginx HTTPS 与 HTTP/2 启用配置:

server {
    listen 443 ssl http2;
    server_name yourdomain.com;
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.0-fpm.sock;
        include fastcgi_params;
    }
}

PHP-FPM 进程池优化配置(www.conf):

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.max_requests = 500

为什么会这样

HTTP/2 通过多路复用减少 TCP 连接开销,但 PHP 作为同步脚本语言,其并发瓶颈通常在于 FPM 进程数量而非网络协议。

主流浏览器仅支持通过 TLS 加密通道协商 HTTP/2 协议,明文 HTTP 无法启用 h2 特性。若 Nginx 开启了 HTTP/2 但 PHP-FPM 进程池耗尽,请求会排队等待,导致整体响应时间增加,掩盖了 HTTP/2 带来的传输层优势。因此,必须同时优化 Nginx 的连接处理能力与 PHP 的脚本执行并发度。

分步处理

按顺序执行以下操作,确保每一步验证通过后再进行下一步。

1. 确认 Nginx 模块支持

执行命令nginx -V,检查输出中是否包含`--with-http`_v2_module。若缺失,需重新编译 Nginx 或安装支持 HTTP/2 的版本。

2. 配置 SSL 与 HTTP/2 监听

编辑 Nginx 配置文件,将listen 443 ssl;修改为listen 443 ssl http2;。确保ssl_certificate指向包含完整证书链的文件,避免握手失败。

3. 调整 PHP-FPM 进程策略

编辑 PHP 8.0 FPM 配置文件(如/etc/php/8.0/fpm/pool.d/www.conf)。将pm设置为dynamic,根据服务器内存调整pm.max_children。内存不足时调低该值,防止 OOM。

4. 优化 Nginx 连接参数

nginx.confevents块中,设置worker_connections为 1024 或更高。在http块中配置keepalive_timeout与上游保持连接,减少握手开销。

怎么验证是否生效

配置完成后,通过以下方法确认 HTTP/2 与并发配置已生效。

Nginx配合PHP 8.0怎么开启HTTP/2?提升并发要怎么配置?

1. 协议版本检查

使用命令curl -I `--http2` https://yourdomain.com,观察返回头或 verbose 信息中是否显示 HTTP/2。或在浏览器开发者工具 Network 面板查看 Protocol 列是否为 h2。

2. 并发压力测试

使用压测工具发送并发请求,观察 Nginx 错误日志/var/log/nginx/error.log。若出现worker_connections are not enough,需调大该值。

3. PHP 进程状态监控

检查 PHP-FPM 状态页或日志,确认无大量进程处于 busy 状态。若进程频繁重启,需调整pm.max_requests

常见坑

配置过程中容易遇到以下问题,需提前规避。

1. 未配置 HTTPS 强制跳转

若未强制 HTTPS,客户端可能仍使用 HTTP/1.1 访问。需在 server 块添加 301 重定向规则,将所有 80 端口请求跳转至 443。

2. 缓冲区大小不足

PHP 输出较大内容时,若 Nginxfastcgi_buffers设置过小,可能导致 502 错误。建议根据实际响应大小调整缓冲区配置。

3. 证书链不完整

SSL 证书若缺少中间证书,部分客户端无法完成 TLS 握手,导致 HTTP/2 协商失败。务必使用包含完整链的证书文件。

常见问题

HTTP/2 可以不启用 HTTPS 吗?

主流浏览器不支持明文 HTTP/2,必须配置 SSL 证书并启用 HTTPS 才能协商 h2 协议。

PHP-FPM 的 pm 模式选 static 还是 dynamic?

内存充足且流量稳定选 static 响应最快,内存有限或流量波动大选 dynamic 更节省资源。

开启 HTTP/2 后网站变慢了怎么办?

检查 PHP 脚本执行时间,可能是后端处理瓶颈而非网络问题,需优化数据库查询或启用 OPcache。

参考来源

  • Nginx 反向代理支持 HTTP2 协议提升并发性能指南
  • ThinkPHP 如何在 Nginx 配置 HTTP2_Nginx 开启 ThinkPHP 的 HTTP2【指南】
  • Nginx 开启 HTTP/2 配置,加速网站访问
  • Nginx 怎么配合 PHP 优化_高并发 Web 服务器配置指南【教程】
  • 【PHP 部署性能优化终极指南】:Nginx + PHP-FPM 高并发配置秘诀全公开