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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 轻松让你的nginx服务器支持HTTP2协议

目录



简介


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 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,点击访问的页面,可以看到下面的内容:


image.png


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


总结



好了,你已经可以配置一个完美的HTTPS并且支持HTTP2协议的网站了。恭喜!

相关文章
|
15天前
|
数据可视化 关系型数据库 MySQL
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
182 90
|
12天前
|
Ubuntu 应用服务中间件 网络安全
Nginx伪流媒体服务器搭建详细说明以及案例
Nginx伪流媒体服务器搭建步骤如下:1. 安装Nginx,根据系统选择命令;2. 编辑配置文件(/etc/nginx/nginx.conf),添加mp4相关设置;3. 创建视频目录/usr/share/nginx/html/videos并上传视频;4. 重启Nginx应用更改;5. 通过浏览器访问视频,如http://your_server_ip/videos/example.mp4。注意启用mp4模块,确保视频格式支持伪流媒体播放。
|
17天前
|
缓存 负载均衡 安全
HTTP代理服务器对速度提升有何作用?
在信息化时代,网络成为生活不可或缺的一部分。HTTP代理服务器位于客户端与服务器之间,通过数据压缩、缓存机制和路由优化等方式,有效提高数据传输速度并保护个人信息安全。使用91HTTP等工具,用户可在业务需求中获得更快更安全的网络体验。
35 4
|
1月前
|
应用服务中间件 PHP nginx
当你的nginx服务器和php服务器不在一起的时候,这个nginx 的root目录问题
两个服务器的网站代码目录需要对齐,docker容器里面也是一样
|
2月前
|
缓存 负载均衡 应用服务中间件
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇
通过使用Nginx的反向代理功能,可以有效地提高Web应用的性能、安全性和可扩展性。配置过程中需要注意不同场景下的具体需求,如负载均衡、SSL终止和缓存策略等。正确配置和优化Nginx反向代理可以显著提升系统的整体表现。
420 20
|
2月前
|
安全 网络协议 网络安全
解析HTTP代理服务器不稳定致使掉线的关键原因
随着数字化发展,网络安全和隐私保护成为核心需求。HTTP代理服务器掉线原因主要包括:1. 网络问题,如本地网络不稳定、路由复杂;2. 服务器质量差、IP资源不稳定;3. 用户配置错误、超时或请求频率异常;4. IP失效或协议不兼容。这些问题会影响连接稳定性。
97 8
|
3月前
|
应用服务中间件 Linux 网络安全
nginx安装部署ssl证书,同时支持http与https方式访问
为了使HTTP服务支持HTTPS访问,需生成并安装SSL证书,并确保Nginx支持SSL模块。首先,在`/usr/local/nginx`目录下生成RSA密钥、证书申请文件及自签名证书。接着,确认Nginx已安装SSL模块,若未安装则重新编译Nginx加入该模块。最后,编辑`nginx.conf`配置文件,启用并配置HTTPS服务器部分,指定证书路径和监听端口(如20000),保存后重启Nginx完成部署。
1148 8
|
3月前
|
弹性计算 负载均衡 网络协议
ECS中实现nginx4层7层负载均衡和ALB/NLB原SLB负载均衡
通过本文的介绍,希望您能深入理解并掌握如何在ECS中实现Nginx四层和七层负载均衡,以及如何使用ALB和NLB进行高效的负载均衡配置,以提高系统的性能和可靠性。
312 9
|
3月前
|
缓存 负载均衡 监控
HTTP代理服务器在网络安全中的重要性
随着科技和互联网的发展,HTTP代理IP中的代理服务器在企业业务中扮演重要角色。其主要作用包括:保护用户信息、访问控制、缓存内容、负载均衡、日志记录和协议转换,从而在网络管理、性能优化和安全性方面发挥关键作用。
120 2
|
3月前
|
存储 编解码 应用服务中间件
使用Nginx搭建流媒体服务器
本文介绍了流媒体服务器的特性及各种流媒体传输协议的适用场景,并详细阐述了使用 nginx-http-flv-module 扩展Nginx作为流媒体服务器的详细步骤,并提供了在VLC,flv.js,hls.js下的流媒体拉流播放示例。
422 2