轻松让你的 nginx 服务器支持 HTTP2 协议
简介 nginx 是一个高效的 web 服务器,因为其独特的响应处理机制和低内存消耗,深得大家的喜爱,并且 nginx 可和多种协议配合使用,而 HTTP2 协议又是一个非常优秀的协议,如果将两者结合起来会产生意想不到的效果,今天我们将会讲解如何在 nginx 中配置 HTTP2 协议。
HTTP1.1 和 HTTP2HTTP 的全称是 Hypertext Transfer Protocol,是在 1989 年 World Wide Web 发展起来之后出现的标准协议,用来在 WWW 上传输数据。HTTP/1.1 是 1997 年在原始的 HTTP 协议基础上进行的补充和优化。
到了 2015 年,为了适应快速发送的 web 应用和现代浏览器的需求,发展出了新的 HTTP/2 协议,主要在手机浏览器、延时处理、图像处理和视频处理方面进行了优化。
相对于 HTTP1.1 来说,HTTP2 有如下几个优点:
使用多路复用技术,在同一个连接中可以并行处理多个请求。可以压缩 HTTP 头,减少请求的大小。数据传输格式是以二进制进行的,所以传输更加有效。服务器可以向客户端推送数据,从而让应用程序可以处理更加复杂的功能。尽管 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 thatnginx 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 nginxOr, 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 支持如下所示:
上面的配置中我们还指定了 server_name,这就是要访问的域名地址,这里我们使用 www.flydean.com。
添加 SSL 支持要想添加 SSL 支持就需要添加证书,一种方式是购买或者在网上有一些免费的 SSL 证书可用,如果只是在测试环境中的话,还可以生成自签名证书。
这里我们介绍一下如何生的自签名证书。这里我们使用 openssl 命令来完成这个工作。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfsigned.key -out selfsigned.crtGenerating a RSA private key 执行完成上面的命令,会要求你输入一些证书的信息如下:
Country Name (2 letter code) [AU]:CNState or Province Name (full name) [Some-State]:SHLocality Name (eg, city) []:SHOrganization Name (eg, company) [Internet Widgits Pty Ltd]:flydeanOrganizational Unit Name (eg, section) []:flydeanCommon Name (e.g. server FQDN or YOUR name) []:127.0.0.1Email 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_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 密文=明文 Emod N, 只要知道了 E 和 N,那么就知道了 RSA 的公钥,这里传递的就是 E,N 两个数字。具体内容可以参考 RSA 算法详解如果选择的是 Diff-Hellman 密钥交换协议,那么传递的就是密钥交换的参数,具体内容可以参考更加安全的密钥生成方法 Diffie-Hellman
这里我们选择使用 Diffie–Hellman,还记得上一小节,我们创建的 Diffie–Hellman 文件吗?这里直接使用即可。
默认情况下 Nginx 使用的是 1028-bit DHE (Ephemeral Diffie-Hellman) key,这个比较容易被破解,所以需要使用我们自己生成的文件。
重定向所有的 HTTP 请求到 HTTPS 默认情况下我们访问网站都是 HTTP 的,所以需要将 HTTP 请求重定向到 HTTPS:
server {listen 80;listen [::]:80;server_name www.flydean.com;return 301 https://server_namerequest_uri;}启动 nginx 并测试好了,到此为止所有的 nginx 配置都完成了,我们使用下面的命令测试 nginx 文件和启动:
nginx -tnginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is oknginx: 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/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
版权声明: 本文为 InfoQ 作者【程序那些事】的原创文章。
原文链接:【http://xie.infoq.cn/article/cb9cf2e5e9857af37df83d6e8】。文章转载请联系作者。
评论