layui 本身不决定 http/2 是否生效,真正起作用的是 nginx 的 tls 协商、http/2 启用、静态路径精简和缓存策略是否闭环;必须确认 alpn 协商成功(输出 h2)、with-http_v2_module 已启用、openssl ≥1.0.2、location 隔离精简、强缓存与 brotli 压缩适配,缺一则多路复用退化为 http/1.1 排队加载。

直接说结论:Layui 本身不决定 HTTP/2 是否生效,真正起作用的是 Nginx 配置是否让浏览器通过单个 HTTPS 连接并发加载 /layui/css/layui.css、/layui/js/layui.js、/layui/fonts/iconfont.woff2 等数十个小文件——关键不在 Layui 目录取名或引入方式,而在 Nginx 的 TLS 协商、HTTP/2 启用、静态路径精简和缓存策略是否闭环。
确认 Nginx 已真正跑在 HTTP/2 上
很多配置看似写了 listen 443 ssl http2,但浏览器 Network 面板仍显示 http/1.1,说明 ALPN 协商失败,后续所有优化都白搭。
- 运行
openssl s_client -alpn h2 -connect your.site:443 -servername your.site 2>/dev/null | grep "ALPN protocol",输出必须是h2,不是空或http/1.1 -
nginx -V 2>&1 | grep -o with-http_v2_module必须有输出;nginx -V 2>&1 | grep -i openssl显示 OpenSSL ≥ 1.0.2(推荐 ≥ 1.1.1) - Chrome DevTools → Network → 右键表头勾选
Protocol和Connection ID:同一Connection ID下出现多个h2请求,才是真多路复用
静态 location 必须隔离且极简
Layui 资源通常放在 /layui/ 路径下,若该 location 混入 proxy_pass、rewrite 或 SSI,会强制走重路径,拖慢每个 stream 的响应速度,抵消多路复用收益。
- 用前缀匹配明确隔离:
location ^~ /layui/ { ... },避免正则 location 穿透误启代理逻辑 - 只保留
alias(不是root):alias /var/www/static/layui/;,URI/layui/css/layui.css直接对应磁盘/var/www/static/layui/css/layui.css - 关闭所有非必要模块:
ssi off;、access_log off;、删掉所有proxy_*、rewrite、add_header X-等无关指令
缓存与压缩必须适配小文件高频特性
Layui 的 CSS、JS、字体、图标都是不变资源,HTTP/2 多路复用最怕反复建 stream,所以要靠强缓存延长连接复用时间,同时避免运行时压缩消耗 CPU。
- 加长效缓存头:
expires 1y;+add_header Cache-Control "public, immutable"; - 启用 Brotli(优于 gzip):
brotli on;+brotli_types text/css application/javascript font/woff2;,注意跳过已压缩格式如.woff2、.png - 禁用运行时 gzip:
gzip off;在该 location 块内,避免和 Brotli 冲突或重复压缩
容易被忽略的连接与文件句柄瓶颈
几十个 Layui 小文件在高并发下会瞬间触发大量短连接,若系统限制没调,Nginx 会卡在 accept() 或 open() 系统调用上,表现为请求延迟陡增或 502/503。
- worker 进程数设为物理核心数(非超线程数),搭配
worker_cpu_affinity绑核,例如 4 核写worker_cpu_affinity 0001 0010 0100 1000; -
open_file_cache max=10000 inactive=60s valid=60s min_uses=2 errors on;,防止反复 stat() 和 open() 成瓶颈 - 系统级 ulimit 必须同步调:
* soft nofile 65535和* hard nofile 65535写入/etc/security/limits.conf
HTTP/2 加速 Layui 的本质,是让浏览器用一个连接把几十个请求“塞满发出去”,而不是让 Nginx 把每个文件单独处理得更快——所以最易失效的点,永远在 TLS 协商是否成功、location 是否真轻量、缓存是否真长效。这三个环节断一环,多路复用就退化成 HTTP/1.1 的排队加载。











