升级HTTP 2.0历程

21. 五月 2017 服务器 2

最近服务器频繁受到攻击,挂了一片服务,实不相瞒1G内存小服务器随便一打就倒了,而且我又是那种懒得管的人。。趁这次重新配置了一圈,升级了一下组件,其中就包括nginx升级和http2.0的部署。

HTTP 2.0是由SPDY发展而来的,两者的设计差不多:压缩、多路复用、安全性,但是二者的实现有区别,所以不互相兼容。关于HTTP 2.0的相关技术细节有几篇博文通俗易懂,推荐一下,就不复述了:

HPACK:HTTP/2 头部压缩技术介绍  HPACK完全解析

Negotiation:HTTP/2协议协商机制

另外还有官方文档。不过我是不推荐一上来直接读官方文档的,效率会比较低,但是最后还是要读的……

 

首先要升级https。这一步是必须的,虽然官方并没有说http2需要跟https绑定,但是目前浏览器都是这么干的,所以想要在浏览器上实现http2,网站就必须是https的。

首先需要申请https证书。我看了一些知乎讨论之后尝试了两种:

  1. CheapSSLSecurity的付费版,便宜的一年3刀,限定域名的,对博客来说够用,按页面提示输入信息就可以了,下单后两天一直PENDING状态。。。怒退款。。。
  2. 阿里云的证书服务,提供了免费的DV SSL证书,是Symantec提供的(对这个公司莫名有好感?),也是填入基本信息,十分钟左右就完成了,可以直接在页面下载.pem和.key文件,准备配置服务器了。

Nginx是从1.9版本开始支持http2的,现在最新版本是1.12,但是centos仓库远没有支持到这个版本,需要编译安装。

./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,设置为如下:

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修改为:

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历程”

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据