再过不到两个月,Ubuntu18.04就要出来了,但是手上还有一些老机器还停留在14.04?:
1 2 3 4 5 6 7 8 9 10 11 |
Ubuntu 18.04 release date: 30th November: Feature Definition Freeze 4th January: Alpha 1 release 1st February: Alpha 2 release 1st March: Feature Freeze 8th March: First beta release 5th April: Final beta release 19th April: Final Freeze 26th April: Stable Ubuntu 18.04 LTS release |
没有足够的时间和动力来升级这几台老机器,但是一些常用的软件准备顺手升级一下。最基本的自然是升级nginx支持http2. http2的优势可以参见《当我们在谈论HTTP队头阻塞时,我们在谈论什么?》以及《低延迟与用户体验杂谈》。
Ubuntu 14.04开启nginx http2支持的前置条件
- nginx >=1.9.5
- openSSL >= 1.0.2
第一个条件大家一般都不会漏掉。但是第二个条件一般是http2无法成功开启时才发现。这是因为随14.04一起分发的openSSL版本是1.0.1f. 那么要开启http2支持,有两种方式:
- 使用他人编译好的ngingx with http2 support package安装;
- 升级本地openSSL版本,然后从源码编译安装。
而随Ubuntu 18.04一起分发的openSSL版本为1.1.0g, 因此不存在这个问题。
使用packaege安装(懒人专用)
这里需要注意一下,很多为提供14.04提供nginx安装包的源虽然可以让你安装更高版本的nginx,但是大多是使用openSSL 1.0.1编译的,因此无法支持http2, 比如jessis, nginx mainline为14.04提供的安装包是使用1.0.1编译的,因此不支持http2的。这里我们使用ondrej提供的源。
- 卸载已经安装的nginx(会保留配置文件,take is easy):
1 2 |
sudo apt-get remove nginx nginx-common |
- 添加ondrej nginx安装源:
1 2 |
sudo add-apt-repository ppa:ondrej/nginx |
如果出现如下错误:
1 2 |
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 92: ordinal not in range(128) |
应该是终端编码问题,尝试使用LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/nginx
解决。
- 更新源,并安装:
1 2 3 |
sudo apt-get update sudo apt-get install nginx |
从源码安装
修改nginx配置开启http2
设置nginx支持http2最关键是在https端口添加http2
指令:
1 2 |
listen 443 ssl http2; |
一个网站的参考配置模板如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
server { listen 443 ssl http2; ssl_certificate your_chained.pem; ssl_certificate_key your_domain.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; server_name your_domain.com; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:18010; } } |
小结
nginx开启http2的支持不要忘记了对openSSL最低版本的要求。其实http2已经不再时髦啦,http2+TLS1.3才是未来,可以参见《低延迟与用户体验杂谈》。后面会讲讲docker+nginx开启http2和TLS1.3的方式,这种方式即可以方便的尝试各个nginx版本,同时也不会破坏本地的nginx环境。