关于nginx:轻松让你的nginx服务器支持HTTP2协议

41次阅读

共计 3971 个字符,预计需要花费 10 分钟才能阅读完成。

简介

nginx 是一个高效的 web 服务器,因为其独特的响应解决机制和低内存耗费,深得大家的青睐,并且 nginx 可和多种协定配合应用,而 HTTP2 协定又是一个十分优良的协定,如果将两者联合起来会产生意想不到的成果,明天咱们将会解说如何在 nginx 中配置 HTTP2 协定。

HTTP1.1 和 HTTP2

HTTP 的全称是 Hypertext Transfer Protocol,是在 1989 年 World Wide Web 倒退起来之后呈现的标准协议,用来在 WWW 上传输数据。HTTP/1.1 是 1997 年在原始的 HTTP 协定根底上进行的补充和优化。

到了 2015 年,为了适应疾速发送的 web 利用和古代浏览器的需要,倒退出了新的 HTTP/ 2 协定,次要在手机浏览器、延时解决、图像处理和视频解决方面进行了优化。

绝对于 HTTP1.1 来说,HTTP2 有如下几个长处:

  1. 应用多路复用技术,在同一个连贯中能够并行处理多个申请。
  2. 能够压缩 HTTP 头,缩小申请的大小。
  3. 数据传输格局是以二进制进行的,所以传输更加无效。
  4. 服务器能够向客户端推送数据,从而让应用程序能够解决更加简单的性能。

只管 HTTP2 并不要求应用加密,然而对于古代浏览器来说如 Google Chrome 和 Mozilla Firefox 默认 HTTP2 和 HTTPS 是一起应用的,所以如果你想配置 HTTP2 的话,还是须要同时配置 SSL。

装置最新的 nginx

在写本文的时候,nginx 最新的版本是 1.21.1。咱们能够从 nginx 官网上下载对应的编译好的文件,间接解压即可运行。或者能够下载它的源文件,手动进行编译装置。

如果你是在 mac 环境,能够间接应用 brew 命令来进行装置:

brew install nginx

装置结束之后会通知咱们一些有用的信息:

Docroot is: /usr/local/var/www

The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.

nginx will load all files in /usr/local/etc/nginx/servers/.

To have launchd start nginx now and restart at login:
  brew services start nginx
Or, if you don't want/need a background service you can just run:
  nginx

这里就不一一具体解说了,感兴趣的敌人能够自行摸索。

开启 HTTP2 反对

从下面能够晓得,nginx 默认的配置文件是 /usr/local/etc/nginx/nginx.conf,关上该文件能够看到最初一行:

include servers/*;

所以咱们能够在 servers 中新建一个 www.flydean.com.conf 的文件作为明天要开启 HTTP2 反对的域名。

默认状况下,nginx 监听的端口是 80,如下所示:

listen 80 default_server;
listen [::]:80 default_server;

为什么会有两个 listen 呢?第一个 listen 指的是所有的 IPv4 连贯,第二个 listen 指的是 IPv6 连贯。

因为 HTTP2 须要开启 SSL 反对,所以咱们这里将其批改为 443,并且加上 http2 反对如下所示:

        listen       443 ssl http2;
        server_name  www.flydean.com;

下面的配置中咱们还指定了 server_name,这就是要拜访的域名地址,这里咱们应用 www.flydean.com。

增加 SSL 反对

要想增加 SSL 反对就须要增加证书,一种形式是购买或者在网上有一些收费的 SSL 证书可用,如果只是在测试环境中的话,还能够生成自签名证书。

这里咱们介绍一下如何生的自签名证书。这里咱们应用 openssl 命令来实现这个工作。

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfsigned.key -out selfsigned.crt
Generating a RSA private key

执行实现下面的命令,会要求你输出一些证书的信息如下:

Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:SH
Locality Name (eg, city) []:SH
Organization Name (eg, company) [Internet Widgits Pty Ltd]:flydean
Organizational Unit Name (eg, section) []:flydean
Common Name (e.g. server FQDN or YOUR name) []:127.0.0.1
Email Address []:flydean@163.com

而后就生成了两个文件:selfsigned.crt 和 selfsigned.key。

这里略微解说一下自签名证书生成的命令。

openssl 是一个十分弱小的密钥生成工具,能够实现绝大多数的密钥生成工作。

req 示意的是这是一个 X.509 certificate signing request (CSR)。

-x509 示意咱们心愿生成的是一个自签名的证书。

-nodes 示意咱们不须要对生成的密钥进行明码加密。

-days 365 示意证书的有效期。

-newkey rsa:2048 示意应用 RSA 算法同时生成证书和 key,key 的长度是 2048。

-keyout: 指定 key 的生成门路。

-out: 指定证书的生成门路。

这里即便是应用了 SSL,为了保障平安,咱们还能够应用一项叫做完满的向前窃密的技术,这里须要生成 Diffie-Hellman group:

openssl dhparam -out dhparam.pem 2048

这个命令会须要一些工夫,生成之后,咱们就能够开始 nginx 的 SSL 配置了。

        ssl_certificate      ssl/selfsigned.crt;
        ssl_certificate_key  ssl/selfsigned.key;

批改加密算法

咱们晓得曾经存在很多加密算法,随着密码学技术的倒退,很多算法曾经被证实是不平安的。所以这里咱们须要对默认的加密算法进行批改。

默认的算法是:

        ssl_ciphers  HIGH:!aNULL:!MD5;

咱们将其批改为:

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Diffie–Hellman 对音讯进行加密

尽管咱们应用 private key 配置了客户端和服务器端的加密连贯,在建设连贯之后,在 ServerKeyExchange 这一步,单方还会询问对信息的加密形式来用来构建加密通道。

ServerKeyExchange 的内容可能蕴含两种模式:

  • 如果抉择的是 RSA 协定,那么传递的就是 RSA 构建公钥明码的参数(E,N)。咱们回忆一下 RSA 中构建公钥的公式:$ 密文 = 明文 ^E\ mod\ N$,只有晓得了 E 和 N,那么就晓得了 RSA 的公钥,这里传递的就是 E,N 两个数字。具体内容能够参考 RSA 算法详解
  • 如果抉择的是 Diff-Hellman 密钥替换协定,那么传递的就是密钥替换的参数,具体内容能够参考更加平安的密钥生成办法 Diffie-Hellman

这里咱们抉择应用 Diffie–Hellman,还记得上一大节,咱们创立的 Diffie–Hellman 文件吗?这里间接应用即可。

默认状况下 Nginx 应用的是 1028-bit DHE (Ephemeral Diffie-Hellman) key, 这个比拟容易被破解,所以须要应用咱们本人生成的文件。

       ssl_dhparam  ssl/dhparam.pem;

重定向所有的 HTTP 申请到 HTTPS

默认状况下咱们拜访网站都是 HTTP 的,所以须要将 HTTP 申请重定向到 HTTPS:

server {
       listen         80;
       listen    [::]:80;
       server_name    www.flydean.com;
       return         301 https://$server_name$request_uri;
}

启动 nginx 并测试

好了,到此为止所有的 nginx 配置都实现了,咱们应用上面的命令测试 nginx 文件和启动:

nginx -t
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

nginx

要拜访网站,还须要配置一下 host 将 www.flydean.com 指到你的 nginx server 上。

而后就能够拜访 www.flydean.com 了。

这里可能会呈现一个问题,如果你是自签名的证书,在 chrome 默认的平安环境中会认为这个证书是有效的,还须要将该证书退出证书的信赖链中。

怎么看出这个网站到底应用的那种协定呢?

关上浏览器的调试开关,到网络的 tab,点击拜访的页面,能够看到上面的内容:

能够看到版本是 HTTP/ 2 并且响应头带有 X -Firefox-Spdy h2。

总结

好了,你曾经能够配置一个完满的 HTTPS 并且反对 HTTP2 协定的网站了。祝贺!

本文已收录于 http://www.flydean.com/01-nginx-http2/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

正文完
 0