介绍Nginx是一个快速可靠的开源Web服务器。它以低内存占用、高可扩展性、易于配置和支持多种协议而广受欢迎。HTTP/2是更新版本的超文本传输??协议,用于将页面从服务器传输到Web上的浏览??器。HTTP/2是近二十年来对HTTP的第一次重大更新:HTTP1.1于1999年被引入公共方式,当时网页的大小要小得多。从那时起,互联网发生了翻天覆地的变化,我们现在面临着HTTP1.1的限制。该协议限制了大多数现代网站的潜在传输速度,因为它会在队列中下载部分页面-前一部分必须完全下载才能开始下载下一部分-而普通的现代网页会下载数十个单独的CSS,JavaScript和图像资源。HTTP/2解决了这个问题,因为它引入了一些根本性的变化:所有的请求都是并行下载的,而不是在队列中;压缩的HTTP标头;页面以二进制文件而不是文本文件的形式传输,这样效率更高。服务器可以在没有用户请求的情况下“推送”数据,从而提高高延迟用户的速度。尽管HTTP/2不需要加密,但两个最流行的浏览器GoogleChrome和MozillaFirefox的开发者表示,出于安全原因,他们将只支持HTTP/2进行HTTPS连接。因此,如果您决定设置支持HTTP/2的服务器,则还必须使用HTTPS保护它们。本教程将帮助您设置一个快速且安全的支持HTTP/2的Nginx服务器。先决条件在开始之前,您需要一些东西:Ubuntu20.04服务器设置,包括sudo非根用户和防火墙。Nginx安装在你的服务器上,你可以按照如何在Ubuntu20.04上安装Nginx来安装。配置为指向您服务器的域名。为您的服务器配置的TLS/SSL证书。您有几个选择:您可以按照如何在Ubuntu20.04上使用Let'sEncrypt保护Nginx从Let'sEncrypt获得免费证书。您还可以按照如何在Ubuntu20.04中为Nginx创建自签名SSL证书来生成和配置自签名证书。Nginx配置为将流量从端口80重定向到端口443,这应该包含在前面的先决条件中。Nginx配置为使用2048位或更高版本的EphemeralDiffie-Hellman(DHE)密钥,这也应该包含在前面的先决条件中。第1步—启用HTTP/2支持如果您按照Nginx安装教程中的服务器块设置步骤进行操作,则您的域中应该有一个服务器块,并且正确设置了指令。我们要做的第一个更改是修改您域的服务器块以使用HTTP/2。/etc/nginx/sites-available/your_domainserver_name使用nano或您喜欢的编辑器打开域的配置文件:sudonano/etc/nginx/sites-enabled/your_domain在文件中,找到与端口443关联的侦听变量:/etc/nginx/sites-enabled/your_domain...listen[::]:443sslipv6only=on;listen443ssl;...第一个用于IPv6连接。第二个用于所有IPv4连接。我们将为两者启用HTTP/2。修改每个listen指令以包含http2:/etc/nginx/sites-enabled/your_domain...listen[::]:443sslhttp2ipv6only=on;listen443sslhttp2;...这告诉Nginx在支持的浏览器中使用HTTP/2。保存配置文件并退出文本编辑器。如果您使用的是nano,请按Ctrl+X,然后按Y,然后在出现提示时按Enter。每当你对Nginx配置文件进行更改时,你应该运行带有-t标志的Nginx内置语法检查命令来检查配置是否有错误:sudonginx-t如果没有语法错误,你将收到如下输出this:sudonginx-tnginx:theconfigurationfile/etc/nginx/nginx.confsyntaxisoknginx:configurationfile/etc/nginx/nginx.conftestissuccessful的输出接下来,您将配置Nginx服务器以使用更严格的密码列表来增加服务器的安全性.第2步——删除旧的和不安全的密码套件HTTP/2有一个应该避免的旧的和不安全的密码套件的阻止列表。密码套件是描述传输数据应如何加密的加密算法。您将用于定义密码的方法取决于您如何使用TLS/SSL证书配置Nginx。如果您使用Certbot获取证书,它还会创建/etc/letsencrypt/options-ssl-nginx.conf文件,其中包含对HTTP/2不够安全的密码。但是,修改此文件将阻止Certbot将来应用更新,因此我们将告诉Nginx不要使用此文件,我们将指定我们自己的密码列表。打开域的服务器块配置文件:sudonano/etc/nginx/sites-enabled/your_domain找到包含options-ssl-nginx.conf文件的行,并通过在该行的开头添加#字符将其注释掉:/etc/nginx/sites-enabled/your_domain#include/etc/letsencrypt/options-ssl-nginx.conf;#managedbyCertbot<^>在该行下方,添加此行以定义允许的密码:/etc/nginx/sites-enabled/your_domainssl_ciphersEECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;保存文件并退出编辑器。如果您使用自签名证书或使用第三方证书并根据先决条件进行配置,请在文本编辑器中打开文件/etc/nginx/snippets/ssl-params.conf:sudonano/etc/nginx/snippets/ssl-params.conf找到以下行:/etc/nginx/snippets/ssl-params.conf...ssl_ciphersECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;...修改它以使用以下密码列表:/etc/nginx/snippets/ssl-params.conf。..ssl_ciphersEECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;保存文件并退出编辑器。使用以下nginx-t命令再次检查配置是否存在语法错误:sudonginx-t如果遇到任何错误,请解决它们并再次测试。一旦您的配置通过语法检查,使用以下systemctl命令重新启动Nginx:sudosystemctlreloadnginx.service重新启动服务器后,让我们验证它是否有效。第3步-验证HTTP/2是否已启用让我们确保服务器正在运行并使用HTTP/2。使用此curl命令向您的站点发出请求并查看标头:curl-I-L--http2https://your_domain您将收到如下输出:HTTP/2200server:nginx/1.18.0(Ubuntu)date:Wed,10Nov202117:53:10GMTcontent-type:text/htmlcontent-length:612last-modified:Tue,09Nov202123:18:37GMTetag:"618b01cd-264"accept-ranges:bytes您还可以验证HTTP/2用于谷歌浏览器。打开Chrome并导航至。打开Chrome开发人员工具(查看->开发人员->开发人员工具)并重新加载页面(查看->重新加载此页面)。导航到“网络”选项卡,右键单击以“名称”开头的表标题行,然后从弹出菜单中选择“协议”选项。https://your_domain你将有一个新的协议列h2包含(对于HTTP/2),表明HTTP/2正在运行。此时,您已准备好通过HTTP/2协议提供内容。让我们通过启用HSTS来提高安全性和性能。第4步-启用HTTP严格传输安全(HSTS)即使您的HTTP请求被重定向到HTTPS,您也可以启用HTTP严格传输安全(HSTS)以避免必须执行这些重定向。如果浏览器找到HSTS标头,它将不会在给定时间段内再次尝试通过常规HTTP连接到服务器。无论如何,它只会使用加密的HTTPS连接交换数据。这个标头还可以保护我们免受协议降级攻击。再次打开域的服务器块配置文件:sudonano/etc/nginx/your_domain将此行添加到包含SSL密码的文件的同一块以启用HSTS:/etc/nginx/your_domainserver{...ssl_ciphersEECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;add_headerStrict-Transport-Security"max-age=15768000"always;}...atmax-ageinseconds设置为单位。值15768000相当于6个月。默认情况下,此标头不会添加到子域请求中。如果你有子域并希望HSTS应用于所有子域,你应该在行的末尾添加includeSubDomains变量,如下所示:/etc/nginx/your_domainadd_headerStrict-Transport-Security"max-age=15768000;includeSubDomains"always;保存文件,并退出编辑器。再次检查配置是否有语法错误:sudonginx-t最后,重新启动Nginx服务器以应用更改。sudosystemctlreloadnginx.service结论您的Nginx服务器现在正在为HTTP/2页面提供服务。如果您想测试SSL连接的强度,请访问QualysSSLLabs并针对您的服务器运行测试。如果一切配置正确,您应该获得A+安全标记。
