在Ubuntu 16.04上配置Nginx启用HTTP/2协议

作者: 丘山 分类: Vultr中文文档 发布时间: 2018-06-26 14:01

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稳定版本,请按照下面的步骤依次运行命令:

  1. 我们需要下载用于签署包和软件源的Nginx公共PGP密钥,并将其添加到包管理器使用的密钥环中,以验证从软件源下载的包的真实性。

    wget https://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key

  2. 从文件系统中删除PGP密钥:

    rm nginx_signing.key

  3. 添加新的软件源

    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

  4. 更新你的软件包列表并安装Nginx:

    apt update && apt install nginx -y

  5. 要验证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.

  1. 生成私钥:

    openssl genrsa -aes128 -out example.com.key 2048

    运行此命令后,您需要输入2次密码。由于密码短语令人讨厌,我们将删除它。

  2. 从私钥中删除密码短语:

    openssl rsa -in example.com.key -out example.com.key

  3. 生成证书签名请求(CSR):

    openssl req -new -sha256 -key example.com.key -out cert-request.csr

    我们正在创建单域证书,因此我们需要将common-name字段设置为等于example.com

  4. 创建证书:

    openssl x509 -req -days 365 -in cert-request.csr -signkey example.com.key -out example.com.crt

  5. 整理证书和私钥:

    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

  6. 准备nginx虚拟主机目录

    mkdir /etc/nginx/sites-available && mkdir /etc/nginx/sites-enabled

  7. 然后运行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/*;

  8. 准备虚拟主机配置文件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支持。

  9. 使用以下命令为/etc/nginx/sites-available/example.com.conf创建符号链接:

    ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled

  10. 测试配置语法

    nginx -t

  11. 重新启动Nginx以应用您的更改:

    systemctl restart nginx

  12. example.com域添加到/etc/hosts文件

    echo '127.0.0.1 example.com' >> /etc/hosts

安装elinks

为了测试您的虚拟主机,我们这里使用基于文本的浏览器 – elinks。

  1. 要安装elinks,请使用以下命令:

    apt install elinks

  2. 测试你的example.com虚拟主机运行:

    elinks https://example.com

  3. 要退出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协议使用h2HTTP/2.0标识符指示。使用开发工具打开网络面板并刷新页面。

结论

现在您应该意识到在Nginx配置中启用HTTP/2是多么“容易”,但这不是全部。首先,您应该考虑使用强大的密码套件在服务器上启用TLS/SSL,并确保您没有使用加入黑名单的密码。只有在服务器上启用强大的TLS/SSL后,才能开始考虑启用HTTP/2

发表评论

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