简介

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/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

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

轻松让你的nginx服务器支持HTTP2协议的更多相关文章

  1. nginx支持http2协议

    1.http2协议 HTTP 2.0 的主要目标是改进传输性能,实现低延迟和高吞吐量.从另一方面看,HTTP 的高层协议语义并不会因为这次版本升级而受影响.所有HTTP 首部.值,以及它们的使用场景都 ...

  2. nginx配置支持http2

    1.简介 nginx 配置支持http2.目前大多数网站都是http1.1(如果你没有特别配置过的话) 一切都是为了访问更快. 2.如何查看自己网站的http版本 最简单的方法就F12啊,我这里是火狐 ...

  3. nginx编译支持HTTP2.0

    nginx编译支持HTTP2.0 nginx编译支持HTTP2.0 wget https://www.openssl.org/source/openssl-1.1.0i.tar.gz #openssl ...

  4. 06_Linux基础-NGINX和浏览器、网页的关系-云服务器ssh登陆-安装NGINX-上传网页-压缩命令-xz-gzip-bzip2-zip-tar-配置NGINX服务器支持下载功能-备份脚本

    06_Linux基础-NGINX和浏览器.网页的关系-云服务器ssh登陆-安装NGINX-上传网页-压缩命令-xz-gzip-bzip2-zip-tar-配置NGINX服务器支持下载功能-备份脚本 一 ...

  5. Nginx配置支持https协议-应用实践

    Nginx配置支持https协议-应用实践 https简介 HTTPS 是运行在 TLS/SSL 之上的 HTTP,与普通的 HTTP 相比,在数据传输的安全性上有很大的提升. TLS是传输层安全协议 ...

  6. 【技术博客】nginx服务器的https协议实现

    在本学期软件工程的Alpha和Beta阶段,我们的服务器部署都是使用基础的http协议,http在网络路由间的信息转发都为明文,这对我们网站的账户密码登录来说很不安全,因此在Gamma阶段我们实现了h ...

  7. nginx支持HTTP2的配置过程

    一.获取安装包 http://zlib.net/zlib-1.2.11.tar.gz https://www.openssl.org/source/openssl-1.0.2e.tar.gz (ope ...

  8. nginx如何启用对HTTP2的支持 | nginx如何验证HTTP2是否已启用

    nginx启用HTTP2特性 查看当前nginx的编译选项 1 #./nginx -V 2   3 nginx version: nginx/1.9.15 4 built by gcc 5.4.0 2 ...

  9. Nginx服务器性能优化与安全配置实践指南

    转载自:https://www.bilibili.com/read/cv16151784?spm_id_from=333.999.0.0 1.引言 1.1 目的 为了更好的指导部署与测试艺术升系统ng ...

随机推荐

  1. 双线性插值算法的FPGA实现

    本设计预实现720P到1080P的图像放大,输入是YUV444数据,分量像素位宽为10bit,采用的算法为双线性插值法,开发平台是xiinx K7开发板. 双线性插值法即双次线性插值,首先在横向线性插 ...

  2. 【Python从入门到精通】(十一)Python的函数的方方面面【收藏下来保证有用!!!】

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文主要介绍Python的函数,函数的定义,使用,可变参数等等都有详细介绍. 干货满满,建议收藏,需要用到时常看看. 小伙伴们如有问题及需要,欢迎 ...

  3. Leetcode No.14 Longest Common Prefix最长公共前缀(c++实现)

    1. 题目 1.1 英文题目 Write a function to find the longest common prefix string amongst an array of strings ...

  4. vue-- 利用过滤-实现搜索框的姓名的搜索

    <div class="fl w-200 m-l-30"> <el-input placeholder="输入用户名" v-model=&qu ...

  5. netty系列之:netty中的Channel详解

    目录 简介 Channel详解 异步IO和ChannelFuture Channel的层级结构 释放资源 事件处理 总结 简介 Channel是连接ByteBuf和Event的桥梁,netty中的Ch ...

  6. JavaEE精英进阶课学习笔记《博学谷》

    JavaEE精英进阶课学习笔记<博学谷> 第1章 亿可控系统分析与设计 学习目标 了解物联网应用领域及发展现状 能够说出亿可控的核心功能 能够画出亿可控的系统架构图 能够完成亿可控环境的准 ...

  7. 探究Presto SQL引擎(1)-巧用Antlr

    一.背景 自2014年大数据首次写入政府工作报告,大数据已经发展7年.大数据的类型也从交易数据延伸到交互数据与传感数据.数据规模也到达了PB级别. 大数据的规模大到对数据的获取.存储.管理.分析超出了 ...

  8. 获取异常信息里再出异常就找不到日志了,我TM人傻了

    本系列是 我TM人傻了 系列第三期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 最近组 ...

  9. RHCSA_DAY03

    cd 切换工作目录命令 cd(英文全拼:change directory)切换目录 命令格式:cd [-选项] [目录名] 提示:目录名称可以是绝对路径或相对路径,如果不指定目录名称,则切换到当前用户 ...

  10. C++水仙花 (如:153 = 1*1*1 + 5*5*5 + 3*3*3)

    1 #include <iostream> 2 #include <ctime> 3 using namespace std; 4 5 int main() 6 { 7 int ...