在Ubuntu 16.04上配置Nginx启用HTTP/2协议
文章目录[隐藏]
HTTP/2是现在过时的HTTP/1.1协议的新版本,它在1999年被标准化。自那时起,网络上的很多变化。我们的应用程序比他们的应用程序要复杂得多,因此为了应对这种情况,底层传输协议的变化是必要的。关于HTTP/2最重要的是它可以让你的网页更快地为最终用户使用。
简而言之,HTTP/2增加了5个关键特性:
- 单一、持久的连接
- 多路复用
- header压缩
- 资源优先
- 安全传输层(仅对浏览器有效)
解释所有这些功能超出了本教程的范围,但如果您想更深入地研究这个主题,我可以推荐摘自高性能浏览器的延伸阅读材料:–HTTP/2节选。
在本指南中,我们将在Ubuntu 16.04(Xenial)上安装Nginx的最新稳定版本,生成自签名SSL证书,在Nginx中启用HTTP/2协议,并安装基于文本的浏览器elinks
以充当HTTP客户端。
安装Nginx
要安装最新的Nginx稳定版本,请按照下面的步骤依次运行命令:
-
我们需要下载用于签署包和软件源的Nginx公共PGP密钥,并将其添加到包管理器使用的密钥环中,以验证从软件源下载的包的真实性。
wget https://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key
-
从文件系统中删除PGP密钥:
rm nginx_signing.key
-
添加新的软件源
printf "deb http://nginx.org/packages/ubuntu/ xenial nginx deb-src http://nginx.org/packages/ubuntu/ xenial nginx " >> /etc/apt/sources.list.d/nginx.list
-
更新你的软件包列表并安装Nginx:
apt update && apt install nginx -y
-
要验证Nginx版本,我们可以使用以下内容:
nginx -v # nginx version: nginx/1.10.1
如果一切顺利,运行
nginx -v
命令时应该在输出中看到类似1.10.x
模式。
自签名证书和HTTP/2
虽然HTTP/2规范没有强制浏览器在TLS之上运行HTTP/2,所有主流的浏览器都只支持配置在TLS上的HTTP/2,且并非支持任何TLS版本,而是仅支持TLS 1.2或其更高版本。
我们将为虚构的example.com
域创建自签名证书,在生产环境下,您需要真实的域名并为它选择可信的CA.
-
生成私钥:
openssl genrsa -aes128 -out example.com.key 2048
运行此命令后,您需要输入2次密码。由于密码短语令人讨厌,我们将删除它。
-
从私钥中删除密码短语:
openssl rsa -in example.com.key -out example.com.key
-
生成证书签名请求(CSR):
openssl req -new -sha256 -key example.com.key -out cert-request.csr
我们正在创建单域证书,因此我们需要将common-name字段设置为等于
example.com
域 -
创建证书:
openssl x509 -req -days 365 -in cert-request.csr -signkey example.com.key -out example.com.crt
-
整理证书和私钥:
mkdir -p /etc/ssl/testing/private && mkdir /etc/ssl/testing/certs mv example.com.key /etc/ssl/testing/private && mv example.com.crt /etc/ssl/testing/certs
-
准备nginx虚拟主机目录
mkdir /etc/nginx/sites-available && mkdir /etc/nginx/sites-enabled
-
然后运行
nano /etc/nginx/nginx.conf
并找到一个include /etc/nginx/conf.d/*.conf;
的指令。在这个指令下面添加include /etc/nginx/sites-enabled/*;
保存( CTRL + O ),然后退出( CTRL + X )。## # Virtual Hosts ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;
-
准备虚拟主机配置文件
nano /etc/nginx/sites-available/example.com.conf
在/etc/nginx/sites-available
目录中创建名为example.com.conf
的文件,并复制/粘贴以下代码:server { listen 80; listen [::]:80; server_name example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com; root /var/www/html; index index.nginx-debian.html; ssl_certificate /etc/ssl/testing/certs/example.com.crt; ssl_certificate_key /etc/ssl/testing/private/example.com.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; ssl_prefer_server_ciphers on; }
恭喜,您现在拥有支持HTTP/2的Web服务器。将
http2
参数添加到HTTPS虚拟主机中的listen
指令将为您提供HTTP/2支持。 -
使用以下命令为
/etc/nginx/sites-available/example.com.conf
创建符号链接:ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled
-
测试配置语法
nginx -t
-
重新启动Nginx以应用您的更改:
systemctl restart nginx
-
将
example.com
域添加到/etc/hosts
文件echo '127.0.0.1 example.com' >> /etc/hosts
安装elinks
为了测试您的虚拟主机,我们这里使用基于文本的浏览器 – elinks。
-
要安装elinks,请使用以下命令:
apt install elinks
-
测试你的
example.com
虚拟主机运行:elinks https://example.com
-
要退出elinks浏览器,请在键盘上按q ,然后按Enter键。
测试HTTP/2
要查看服务器支持什么协议,最简单的方法是使用openssl
工具包。
openssl s_client -connect example.com:443 -nextprotoneg ''
在这个命令的输出中你应该看到如下所示的内容:
CONNECTED(00000003)
Protocols advertised by server: h2, http/1.1
要查看运行中的HTTP/2 ,您可以使用浏览器开发人员工具。HTTP/2协议使用h2
或HTTP/2.0
标识符指示。使用开发工具打开网络面板并刷新页面。
结论
现在您应该意识到在Nginx配置中启用HTTP/2是多么“容易”,但这不是全部。首先,您应该考虑使用强大的密码套件在服务器上启用TLS/SSL,并确保您没有使用加入黑名单的密码。只有在服务器上启用强大的TLS/SSL后,才能开始考虑启用HTTP/2。