HTTP/2 可以让我们的应用更快、更简单、更稳定 – 这几词凑到一块是很罕见的!HTTP/2 将很多以前我们在应用中针对 HTTP/1.1 想出来的“歪招儿”一笔勾销,把解决那些问题的方案内置在了传输层中。不仅如此,它还为我们进一步优化应用和提升性能提供了全新的机会!
——《Web 性能权威指南》
Ubuntu18.04 官方源已经包含带有HTTP2模块的 Apache/2.4.29 ,所以我们可以很简单的启用 HTTP2。
1 |
$ sudo a2enmod http2 |
首先启用 http2 模块,然后在虚拟主机的配置文件中或者在 Apache2 的全局配置文件中加入:
1 |
Protocols h2 http/1.1 |
当客户端支持时优先使用 HTTP2 ,其次是 http/1.1,表明了一种优先顺序。
目前为止就已经启用完成了,但如果你是使用的 Apache2+PHP 架构的应用程序,由于 mpm_prefork 模块不支持 mod_http2,所以我们需要切换 mpm_prefork、mod_php 到 mpm_event 和 php-fpm 来解决这个问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Install php-fpm and enable $ sudo apt install php-fpm $ sudo systemctl enable php7.2-fpm # To enable PHP 7.2 FPM in Apache2 $ sudo a2enmod proxy_fcgi setenvif $ sudo a2enconf php7.2-fpm # First to disable PHP 7.2/ mpm_prefork to avoid conflicts,then enable. $ sudo a2dismod php7.2 mpm_prefork $ sudo a2enmod mpm_event |
最后使用 Firefox 的开发者工具测试一下:
OK, 大功告成。
注意:
最近发现在 ubuntu 22.04 / Apache/2.4.52 系统上,启用 http2 模块之后,服务器不定时的卡死无响应。
典型特性是使用 ps -A | grep apache 查看服务进程,会发现进程只剩下两个。
使用 strace -p <pid> 查看,可以看到进程卡住在 futex 函数上,类似如下:
1 2 3 |
strace -p 8537 Process 8537 attached - interrupt to quit futex(0xafcc1050, FUTEX_WAKE_PRIVATE, 12, NULL |
发生上述问题的情况下,通过可以禁用 HTTP2 解决此问题,原因暂时没有找到。