如何在Ubuntu 18.04上使用HTTP / 2支持设置Nginx

介绍

Nginx是一个快速可靠的开源Web服务器。由于其低内存占用,高可扩展性,易于配置以及对各种协议的支持,它获得了普及。

HTTP / 2是超文本传输协议的新版本,它在Web上用于将页面从服务器传递到浏览器。HTTP / 2是近二十年来HTTP的第一次重大更新:1999年,当网页通常只是一个带有内联CSS样式表的HTML文件时,HTTP1.1被引入公众。互联网从那时起发生了翻天覆地的变化,现在我们面临着HTTP 1.1的限制 - 协议限制了大多数现代网站的潜在传输速度,因为它将部分页面下载到队列中(前一部分必须在下载之前完全下载)下一部分开始),平均现代网页需要下载大约100个请求(每个请求是图片,js文件,css文件等)。

HTTP / 2解决了这个问题,因为它带来了一些根本性的变化:

  • 所有请求都是并行下载的,而不是队列中的
  • HTTP标头已压缩
  • 页面传输为二进制文件,而不是文本文件,这样更有效
  • 即使没有用户的请求,服务器也可以“推送”数据,从而提高具有高延迟的用户的速度

尽管HTTP / 2不需要加密,但两个最流行的浏览器谷歌Chrome和Mozilla Firefox的开发人员表示,出于安全考虑,他们仅支持HTTPS连接的HTTP / 2。因此,如果您决定设置具有HTTP / 2支持的服务器,则还必须使用HTTPS保护它们。

本教程将帮助您设置具有HTTP / 2支持的快速安全的Nginx服务器。

先决条件

在我们开始之前,我们需要一些东西:

  • 一个Ubuntu 18.04服务器,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 一个具有sudo权限非root用户,在您的服务器上启用防火墙,如果您使用的是腾讯云的CVM服务器,您可以直接在腾讯云控制台中的安全组进行设置。
  • 安装在您的服务器上安装Nginx。
  • 配置为指向您的服务器的域名。如果你没有域名,建议您先去这里注册一个域名
  • 为您的服务器配置的TLS / SSL证书。你有两个选择:
  • Nginx配置为将流量从端口80重定向到端口443,这应该包含在先前的先决条件中。
  • Nginx配置为使用2048位或更高的Ephemeral Diffie-Hellman(DHE)密钥,这也应该包含在之前的先决条件中。

第1步 - 启用HTTP / 2支持

如果您按照Nginx安装教程中的服务器块设置步骤进行操作,则应该为您的/etc/nginx/sites-available/your_domain域设置一个服务器块, 并且该 server_name指令已经正确设置。我们将做的第一个更改是修改域的服务器块以使用HTTP / 2。

打开您的域的配置文件:

sudo nano /etc/nginx/sites-available/your_domain

在文件中,找到与端口443关联的listen变量:

...
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; 
...

第一个用于IPv6连接。第二个用于所有IPv4连接。我们将为两者启用HTTP / 2。

修改每个listen指令从而来包括http2

...
    listen [::]:443 ssl http2 ipv6only=on; 
    listen 443 ssl http2; 
...

这告诉Nginx在支持的浏览器中使用HTTP / 2。

保存配置文件并编辑文本编辑器。

每当您对Nginx配置文件进行更改时,都应检查配置是否存在语法错误,如下所示:

sudo nginx -t

如果语法没有错误,您将看到以下输出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

接下来,我们将配置我们的服务器以使用更严格的密码列表。

第2步 - 删除旧的和不安全的密码套件

HTTP / 2有一个旧的和不安全的密码的黑名单,所以我们必须避免它们。密码套件是加密算法,描述了如何加密传输的数据。

您将用于定义密码的方法取决于您为Nginx配置TLS / SSL证书的方式。

如果您使用Certbot获取证书,它还会创建包含对HTTP / 2不够强大的密码的/etc/letsencrypt/options-ssl-nginx.conf文件。不幸的是,修改此文件将阻止Certbot将来应用更新,因此我们只是告诉Nginx不要使用此文件,我们将指定我们自己的密码列表。

打开域的服务器块配置文件:

sudo nano /etc/nginx/sites-available/your_domain

找到包含该options-ssl-nginx.conf文件的行并将其注释掉:

    # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>

在该行下方,添加此行以定义允许的密码:

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

保存文件并退出编辑器。

如果您使用自签名证书或使用来自第三方的证书并根据先决条件对其进行配置,请/etc/nginx/snippets/ssl-params.conf在文本编辑器中打开该文件:

sudo nano /etc/nginx/snippets/ssl-params.conf

找到以下行:

...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...

修改它,使它看起来像这样:

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

保存文件并退出编辑器。

再次检查配置是否存在语法错误:

sudo nginx -t

如果您发现任何错误,请解决它们并再次测试。

一旦看到没有语法错误,请重新启动Nginx:

sudo systemctl reload nginx

重新启动服务器后,让我们验证它是否正常工作。

步骤3 - 验证HTTP / 2是否已启用

让我们确保服务器正在运行并使用HTTP / 2。

使用该curl命令向您的站点发出请求并查看标题:

curl -I -L https://your_domain

您将看到以下输出:

HTTP/1.1 301 Moved Permanently
Server: nginx/1.14.0 (Ubuntu)
Date: Fri, 06 Jul 2018 19:07:12 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Location: https://your_domain/
​
HTTP/2 200
server: nginx/1.14.0 (Ubuntu)
date: Fri, 06 Jul 2018 19:07:12 GMT
content-type: text/html
content-length: 16
last-modified: Fri, 06 Jul 2018 16:55:37 GMT
etag: "5b3f9f09-10"
accept-ranges: bytes

您还可以验证Google Chrome中是否正在使用HTTP / 2。打开Chrome并导航至http://your_domain。打开Chrome开发者工具(查看 - > 开发人员 - > 开发人员工具)并重新加载页面(查看 - > 重新加载此页面)。导航到“ 网络”选项卡,右键单击以“ 名称”开头的表标题行,然后从弹出菜单中选择“ 协议”选项。

您将在新的Protocol列中看到h2(代表HTTP / 2),表明HTTP / 2正在运行。

此时,您已准备好通过HTTP / 2协议提供内容。让我们通过启用HSTS来提高安全性和性能。

第4步 - 启用HTTP严格传输安全性(HSTS)

即使您的HTTP请求重定向到HTTPS,您也可以启用HTTP严格传输安全性(HSTS)以避免必须执行这些重定向。如果浏览器找到HSTS标头,它将不会尝试在给定时间段内通过常规HTTP再次连接到服务器。无论如何,它只使用加密的HTTPS连接交换数据。此标头还可以保护我们免受协议降级攻击

在编辑器中打开Nginx配置文件:

sudo nano /etc/nginx/nginx.conf

将此行添加到文件以启用HSTS:

http {
...
    ##
    # Virtual Host Configs
    ##
​
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    add_header Strict-Transport-Security "max-age=15768000" always;
}
...

max-age是以秒为单位来设定的。该15768000的值相当于6个月。

默认情况下,此标头不会添加到子域请求中。如果您有子域并希望HSTS应用于所有子域,则应在行尾添加includeSubDomains变量,如下所示:

add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

保存文件,然后退出编辑器。

再次检查配置是否存在语法错误:

sudo nginx -t

最后,重新启动Nginx服务器以应用更改。

sudo systemctl reload nginx

结论

您的Nginx服务器现在提供HTTP / 2页面。如果您想测试SSL连接的强度,请访问Qualys SSL Lab并对您的服务器运行测试。如果一切配置正确,您应该获得安全性的A +标记。

更多Ubuntu教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Set Up Nginx with HTTP/2 Support on Ubuntu 18.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏惨绿少年

SSH服务详解

第1章 SSH服务 1.1 SSH服务协议说明 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Wo...

4080
来自专栏散尽浮华

Linux下部署SSH登录时的二次身份验证环境记录(利用Google Authenticator)

一般来说,使用ssh远程登录服务器,只需要输入账号和密码,显然这种方式不是很安全。为了安全着想,可以使用GoogleAuthenticator(谷歌身份验证器)...

6199
来自专栏农夫安全

【补充】任意密码重置姿势

跟第三个有点类似,只判断了接收端和验证码是否一致,未判断接收端是否和用户匹配,因此修改接收端可达到重置目的

1202
来自专栏技术博客

VS2010链接TFS遇见错误:TF204017,没有访问工作区域,需要一个或者多个必须权限

  最近刚刚搭建好服务器,然后准备将VSS源代码迁移到TFS源代码管理服务器上面。在我本机先用的服务器帐号来上传初始化源代码数据库,然后我又用自己的帐号进行迁出...

1242
来自专栏听Allen瞎扯淡

在公司内网如何更新IntelliJ的插件

最近小伙伴们更新IntelliJ后,发现没法安装或者更新插件了,每次尝试在线安装时总会提示SSL错误。特别是要玩Scala的小伙伴更是抓狂,因为本身Intell...

3992
来自专栏沈唁志

PHP中利用PHPMailer配合QQ邮箱实现发邮件

2142
来自专栏gaoqin31

linux挂载windows共享目录

3.  进入控制面板->网络和共享中心->更改高级共享设置->密码保护的共享->关闭密码保护共享

4762
来自专栏程序员宝库

SSH 登录流程分析

本文首发于 https://jaychen.cc 作者:jaychen(https://segmentfault.com/u/chenjiayao) 写一篇短文...

5278
来自专栏Java学习123

windows环境下 curl 安装和使用

3996
来自专栏云计算教程系列

如何在CentOS上使用双重身份验证

在本教程中,您将学习如何在CentOS 7上使用一次性密码进行SSH上的双重身份验证。

2313

扫码关注云+社区

领取腾讯云代金券