近期服务器的一些改进 / 2020-03-18

写出优雅且高效的服务是每一个开发者都在追求的目标,高性能意味着可以用更少的成本服务更多的用户。而作为开发者,在不断优化的过程中,也能丰富自己的经验,增长知识。近期,我对服务器做了一些优化升级,感觉很有意义。

缓存

这里主要说的是内存缓存。以redis为例,从文件中加载页面和从redis中加载的效率差别是巨大的。静态页面采用redis缓存将大大提升页面的响应速度,而大多数流行的web框架基本上都提供了非常优雅的页面缓存接口,稍作配置即可启用。而对于一些动态页面来说,也可以将不需要实时查询的数据缓存起来,避免直接操作数据库。

redis缓存一个绝好的使用场景就是维护用户登录会话,登录token的有效期正好对应redis缓存的超时时间,不需要再配合额外的信息。

增加缓存之后,可以明显感觉页面基本秒开,效果显著。

Nginx

常识讲:”相比Apache,Nginx占用更少的资源,具有更高效的性能“。我手中接触到的数据有限,没有感觉两者性能差别有多大。但从实际配置使用上来看,Nginx更加方便简洁。

我花了近1天时间将Apache的服务切换到Nginx,基本上没有遇到过大问题,遇到的一些小问题,也都能稍作搜索即可解决。我印象中最开始部署Apache服务时可没有这么省心。Apache配置的规则在Nginx中也有非常优雅的实现,常规配置也都可以很快找到。

想从Apache切换到Nginx又担心影响服务的朋友完全可以放心,这个过程会比你想象中简单很多。如果你只有一个服务器,保险起见,可以先在非80/443端口启动Nginx服务,运行正常之后,再停止Apache同时将Nginx的端口配置为80和443并启动,做到平滑迁移。

HTTP/2

HTTP/2是下一代HTTP协议,也是HTTP/1.1后首次更新的大版本。2015年5月HTTP/2标准正式发布,目前大多数终端系统均已经支持HTTP/2,是时候将服务升级至HTTP/2了。相对HTTP/1.1,HTTP/2具有明显的优势。HTTP/2主要新增了如下特性:

  • 头部压缩

HTTP/1.1的头部信息有很多字段都是可以预知的,在HTTP/2中对头部信息进行了压缩,可节省网络流量。

  • 二进制分帧

HTTP/2采用二进制格式传输数据(HTTP/1.1采用的是文本格式),HTTP/2将请求和响应数据分割为更小的帧,均采用二进制编码。

  • 多路复用

HTTP/1.1中,如果想并发多个请求,必须使用多个TCP连接,且浏览器会对单个域名有6-8个的TCP请求的限制。在HTTP/2中,有了二进制分帧之后,一个域名只需要占用一个TCP连接,单个连接可以互不干扰的进行请求和响应。

  • 服务器推送

在HTTP/1.1中,终端浏览器需要先下载HTML,解析后再去加载js/css等资源。而在HTTP2中,服务器可直接向浏览器推送资源而不需要等待浏览器解析并请求。

基于以上重要的改进,HTTP/2可大幅提升性能和效率,更重要的是HTTP/2完全兼容HTTP/1.1,可以平滑过渡。Ngnix从1.9.5开始支持HTTP/2,简单配置即可:

listen 443 ssl http2

ALPN

特别注意的是,即使服务器启用HTTP/2,并不意味着在和客户端进行通信时就会使用HTTP/2,也有可能会降级到HTTP/1.1。ALPN协议允许服务端和客户端进行应用层协议的协商(类似的协议还有NPN,只不过目前Google仅支持ALPN),需要确认客户端是否支持HTTP/2。启用ALPN的要求:

  • OpenSSL版本1.0.2+

openssl version

  • Nginx 1.9.5+

nginx -V

HTTPS的安全等级

同样是开启HTTPS,也会因为使用到的TLS版本或加密套件不同而导致HTTPS的安全等级有所区别,推荐一个网站myssl.com,可以进行HTTPS、HTTP/2等支持检测。最优的HTTPS安全等级是A+,目前推荐的配置为:

ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;

HSTS

由于在建立HTTPS连接之前存在一次明文的HTTP请求和重定向,使得攻击者可以以中间人的方式劫持这次请求,从而进行后续的攻击。为了解决这个风险,HSTS的机制被采用。HSTS核心内容是一个HTTP响应头,它告诉浏览器:在接下来的一段时间内,当前域名只能通过HTTPS进行访问。Nginx的推荐配置为:

add_header Strict-Transport-Security "max-age=63072000" always;

这篇文章简单介绍了下最近服务器的升级优化内容,实际上我更希望用数据来说明改造后的收益,比如页面打开时间、HTTP/2的加载速度等,可是目前还没找到好用的分析工具,这个地方留个尾部,后续有时间补充上。

其它文章

优化Nginx配置提升网站性能
inode用尽导致磁盘空间不足
utf8mb4:MYSQL中使用Emoji
Let’s Encrypt acme.sh 泛域名证书
阿里云云盘扩容笔记