闲逛到了 nginx 的官方网站,发现其已经使用上了 HTTP/2。虽然听说 HTTP/2 相比 HTTP/1.1 来说性能会高不少,但你这也太奢侈了,主页面那么少点点东西,你竟然发起了不下 90 个请求。好吧,你用 HTTP/2,你有资本。
突然我也来了兴趣,想装个...那啥,也想升级到 HTTP/2 试试。于是简单搜索了下:HTTP/2 Supported in Open Source NGINX 1.9.5 | NGINX。发现貌似很简单搞定。
nginx 的开源版本从 1.9.5 版本开始支持 HTTP/2。默认不编译该模块,在 ./configure 时需要加上 --with-http_v2_module 参数才能启用该模块。并且,要启用 HTTP/2,你的网站必须是 SSL 加密连接的,即启用了 HTTPS,HTTP/2 是建立在 HTTPS 之上的。
配置就很简单了,原来是 listen 443 ssl;,现在改成 listen 443 ssl http2; 就好了。nginx 端的配置貌似就只需要这么一步就好了。你可以看看我的博客的连接,已经走上了 HTTP/2(前提是你的浏览器支持)。
然而有一点比较尴尬的是,我博客程序是我自己用世界上最好的语言————PHP写的,在发送响应数据的头部时,我大量使用了类似 header('HTTP/1.1 200 OK'); 的写法。貌似会有问题,因为我现在的服务器版本已经是 HTTP/2,不再是 HTTP/1.1,但没管那么多,先升级上去试了试,结果发现貌似好像大概仿佛没有什么意外,程序依然正常,浏览器端看到的依然是 HTTP/2.0 的协议。我估计是 nginx 特意处理了。毕竟 PHP 这个网关躲在 nginx 这个 Web 服务器后面,并没有直接与浏览器交互,所以为了更快地升级,我猜它这样做了。
于是问题就来了,PHP 中返回状态行的最好写法该是怎样的?据我所知,有以下几种:
// 最原始的写法
header('HTTP/1.1 200 OK');
// CGI网关写法
header('Status: 200');
// FastCGI 网关写法
header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
// 最简单的写法
http_response_code(200);
,这几种写法的区分我并不是特别清楚,所以上面的注释可能有错。所以还请多搜索下。
我全部采用的是第1种写法(最原始的写法),看起来工作正常,暂时就不管了。