升级HTTP 2.0历程
最近服务器频繁受到攻击,挂了一片服务,实不相瞒1G内存小服务器随便一打就倒了,而且我又是那种懒得管的人。。趁这次重新配置了一圈,升级了一下组件,其中就包括nginx升级和http2.0的部署。
HTTP 2.0是由SPDY发展而来的,两者的设计差不多:压缩、多路复用、安全性,但是二者的实现有区别,所以不互相兼容。关于HTTP 2.0的相关技术细节有几篇博文通俗易懂,推荐一下,就不复述了:
HPACK:HTTP/2 头部压缩技术介绍 HPACK完全解析
Negotiation:HTTP/2协议协商机制
另外还有官方文档。不过我是不推荐一上来直接读官方文档的,效率会比较低,但是最后还是要读的……
首先要升级https。这一步是必须的,虽然官方并没有说http2需要跟https绑定,但是目前浏览器都是这么干的,所以想要在浏览器上实现http2,网站就必须是https的。
首先需要申请https证书。我看了一些知乎讨论之后尝试了两种:
- CheapSSLSecurity的付费版,便宜的一年3刀,限定域名的,对博客来说够用,按页面提示输入信息就可以了,下单后两天一直PENDING状态。。。怒退款。。。
- 阿里云的证书服务,提供了免费的DV SSL证书,是Symantec提供的(对这个公司莫名有好感?),也是填入基本信息,十分钟左右就完成了,可以直接在页面下载.pem和.key文件,准备配置服务器了。
Nginx是从1.9版本开始支持http2的,现在最新版本是1.12,但是centos仓库远没有支持到这个版本,需要编译安装。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
./configure \ --prefix=/usr \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --pid-path=/var/run/nginx/nginx.pid \ --with-openssl=/root/openssl-1.1.0e \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_flv_module \ --with-http_gzip_static_module \ --http-log-path=/var/log/nginx/access.log \ --http-client-body-temp-path=/var/tmp/nginx/client \ --http-proxy-temp-path=/var/tmp/nginx/proxy \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi \ --with-http_stub_status_module \ --with-http_dav_module \ --with-http_v2_module make && make install |
这里有两行是比较重要的:
首先我用 --with-openssl=/root/openssl-1.1.0e 指定了openssl的源码,这是因为openssl是从1.0.2开始支持ALPN的,而chrome在51版本之后正式放弃NPN使用ALPN,如果不使用新版的openssl,会导致在chrome 51之后的版本上无法使用http2。
另外编译要加入 --with-http_v2_module (据说默认也会编,我没试,先加上了)
安装完成后,将以前的blog.conf放回到/etc/nginx/conf.d中,blog可以正常访问了。
之后我们在/etc/nginx中新建文件夹key,并把刚才下载的.pem和.key放到这个文件夹里,新建一个blog-https.conf,设置为如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
server { listen 443 ssl http2; ssl on; ssl_certificate /etc/nginx/key/blog.yiz96.com.pem; ssl_certificate_key /etc/nginx/key/blog.yiz96.com.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; server_name blog.yiz96.com; root /path/blog; include conf.d/global/restrictions.conf; include conf.d/global/wordpress.conf; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml$ "/index.php?xml_sitemap=params=$2" last; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml\.gz$ "/index.php?xml_sitemap=params=$2;zip=true" last; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html$ "/index.php?xml_sitemap=params=$2;html=true" last; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html.gz$ "/index.php?xml_sitemap=params=$2;html=true;zip=true" last; } |
后半部分是wordpress官方提供的标准nginx配置,可以根据需要修改,前面是ssl配置,里面设置了超时,禁用了一些不安全的加密协议,并指定了使用http2.
然后重启nginx,访问https://blog.yiz96.com,就OK了。这里再推荐一个chrome插件 HTTP/2 and SPDY indicator,在访问HTTP2的页面的时候,有个蓝色小⚡️会亮起来,就很容易知道是否是通过HTTP2访问的了。
之后还可以通过nginx设置使原来的http流量跳转到https,将原来的blog-http.conf修改为:
1 2 3 4 5 6 7 |
server { listen 80; server_name blog.yiz96.com; root /path/blog; return 301 https://blog.yiz96.com$request_uri; } |
301代表Permanently Moved,浏览器缓存这个包,之后都会自动跳转到https协议的。
2 thoughts on “升级HTTP 2.0历程”