Apache2 httpd 早在 2015 年开始在正式支持 HTTP/2 了,但是可能由于现在 nginx 成了主流,openSUSE 官方似乎对 apache 也不是很上心,除了正常的升级外,仍然将老掉牙的 HTTP/1.1 作为默认。HTTP/2 相比 HTTP/1.1 的核心优势在于彻底解决了 HTTP/1.1 的传输瓶颈,显著提升了高并发场景下的网页加载性能。最主要的改善体现在多路复用机制上:HTTP/1.1 在请求多个资源时需要建立多个 TCP 连接(或按顺序排队),而 HTTP/2 可以在同一个 TCP 连接中并发传输任意数量的请求与响应。所以现在已经没有必要继续停留在HTTP/1.1上了。
给 apache2 升级 HTTP/2 还有一个额外的好处,就是必须切换之 event 工作模式。传统的 prefork 采用主进程-子进程模型。主进程(Master)负责监听端口,并预先创建(fork)若干个独立的子进程。这样的话并法连接一多,就会创建很多进程来处理每个连接,很快服务器就不堪重负响应变慢。event 模式采用的和 Nginx 一样的异步模式,可以高效的处理并发连接,理论上可以获得和 Nginx 一样的性能。
激活 HTTP/2 的第一步是将 apache 的工作模式由 prefork 切换为 event:
sudo zypper install apache2-mod_fcgid php8-fpm php8-pear apache2-event php8-fpm-apache
sudo a2enmod proxy
sudo a2enmod proxy_fcgi
sudo a2enmod setenvif
sudo a2enmod fcgid
sudo a2dismod php8
官方文档提到要在 /etc/php8/fpm/php-fpm.d/www.conf 的末尾加上以下能,不过我没这么做,也没遇到异常:
php_admin_value[include_path] = /usr/share/php/PEAR
官方文档还提到要修改 /etc/apache2/conf.d/mod_fcgid.conf,其实是多余的。php8-fpm-apache 包已经提供了这个功能。
接下来激活 php-fpm 服务:
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
再检查 /etc/apache2/httpd.conf 配置,看是不是给 MinSpareServers 和 MaxSpareServers 设置了值,如果有请注释掉或者删掉相应的行。
接下来修改 /etc/sysconfig/apache2,确认将设置修改为:
APACHE_MPM="event"
接下来重启 apache 服务:
sudo systemctl restart apache2
试试网页能不能打开,如果网页打开正常,可以继续下一步,激活 http2 支持:
sudo a2enmod http2
sudo a2enflag HTTP2
sudo systemctl restart apache2
接下来用 curl 测试,应该可以看到 http2 标记了。
curl -I -k –http2 https://xxx.com