简介
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有如下几个长处:
- 应用多路复用技术,在同一个连贯中能够并行处理多个申请。
- 能够压缩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/wwwThe 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反对如下所示:
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.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_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 -tnginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is oknginx: configuration file /usr/local/etc/nginx/nginx.conf test is successfulnginx
要拜访网站,还须要配置一下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/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!