如何建立与Nginx的HTTP / 2支持在Ubuntu 16.04

介绍

NGINX是一个快速和可靠的开源网络服务器。 由于其低内存占用,高可扩展性,易于配置和支持绝大多数不同的协议,它获得了它的流行。

支持的协议之一是相对较新的HTTP / 2,它于2015年5月发布.HTTP / 2的主要优点是其内容丰富的网站的高传输速度。

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

先决条件

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

就这些。 如果你有上面列出的一切,你就准备好了。

HTTP 1.1和HTTP / 2之间的差异

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

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

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

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

第1步 - 安装最新版本的Nginx

支持HTTP / 2协议在Nginx 1.9.5中引入。 幸运的是,Ubuntu 16.04中的默认存储库包含的版本高于此版本,因此我们不必添加第三方存储库。

首先,更新apt包装系统中的可用软件包列表:

sudo apt-get update

然后,安装Nginx:

sudo apt-get install nginx

安装过程完成后,您可以通过键入以下内容检查Nginx的版本:

sudo nginx -v

输出应类似于以下内容:

sudo nginx的输出
nginx version: nginx/1.10.0 (Ubuntu)

在接下来的几个步骤中,我们将修改Nginx配置文件。 每个步骤将更改Nginx配置选项。 我们将一路测试配置文件的语法。 最后,我们将验证Nginx是否支持HTTP / 2,并进行一些更改以优化性能。

第2步 - 更改侦听端口并启用HTTP / 2

我们将第一个变化将是侦听端口更改从80443

让我们打开配置文件:

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

默认情况下,Nginx设置为监听端口80,这是标准的HTTP端口:

/ etc / nginx / sites-available / default
listen 80 default_server;
listen [::]:80 default_server;

正如你可以看到,我们有两个不同的listen变量。 第一个是所有IPv4连接。 第二个用于IPv6连接。 我们将为两者启用加密。

修改监听端口为443 ,这是使用HTTPS协议:

/ etc / nginx / sites-available / default
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;

请注意,除了ssl ,我们还增加http2到线路。 这个变量告诉Nginx在支持的浏览器上使用HTTP / 2。

第3步 - 更改服务器名称

我们使用的server_name条目指定域名应该与配置文件相关联。 找到server_name在配置文件中的条目。

默认情况下, server_name设置为_ (下划线),这意味着配置文件是负责所有传入的请求。 改变_为您的实际域名,就像这样:

/ etc / nginx / sites-available / default
server_name example.com;

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

每当你修改Nginx配置文件,你应该检查配置语法错误,像这样:

sudo nginx -t

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

输出sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

第4步 - 添加SSL证书

接下来,您需要配置Nginx使用您的SSL证书。 如果您不知道SSL证书是什么或当前没有SSL证书,请按照本文前提条件部分中的一个教程。

创建一个目录以将您的SSL证书存储在Nginx配置目录中:

sudo mkdir /etc/nginx/ssl

将您的证书和私钥复制到此位置。 我们还将重命名文件以显示它们关联的域。 当您有多个域与此服务器相关联时,这将在以后派上用场。 替换example.com与您的实际主机名:

sudo cp /path/to/your/certificate.crt /etc/nginx/ssl/example.com.crt
sudo cp /path/to/your/private.key /etc/nginx/ssl/example.com.key

现在,让我们再次打开我们的配置文件并配置SSL。

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

在内部新的生产线server模块,定义证书的位置:

/ etc / nginx / sites-available / default
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;

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

第5步 - 避免旧密码套件

HTTP / 2有一个巨大的黑名单老不安全的密码,所以我们必须避免他们。 密码套件是一组加密算法,其描述了应该如何加密传输数据。

我们将使用一个真正流行的密码集,其安全性由互联网巨头如CloudFlare批准。 它不允许使用MD5加密(自1996年以来被称为不安全,但尽管这一事实,它的使用甚至到今天是广泛的)。

打开以下配置文件:

sudo nano /etc/nginx/nginx.conf

添加此行之后ssl_prefer_server_ciphers on;

/etc/nginx/nginx.conf
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

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

再次检查语法错误的配置:

sudo nginx -t

第6步 - 增加密钥交换安全

建立安全连接的第一步是在服务器和客户端之间交换私钥。 问题是,到目前为止,它们之间的连接没有加密 - 这意味着数据的传输对任何第三方都可见。 这就是为什么我们需要Diffie-Hellman-Merkle算法。 关于它是如何工作的技术细节是不能简单地说来解释复杂的事,但如果你是在细节很感兴趣,你可以看这部YouTube影片

默认情况下,Nginx使用1028位DHE(临时Diffie-Hellman)密钥,这是相对容易解密。 为了提供最大的安全性,我们应该建立自己的,更安全的DHE密钥。

为此,请发出以下命令:

sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

请记住,我们应该在与SSL证书相同的文件夹中生成DH参数。 在本教程中,证书位于/etc/nginx/ssl/ 这样做的原因是Nginx总是在证书文件夹中查找用户提供的DHE密钥,如果存在,则使用它。

的文件路径(在我们的情况下,它是经过可变2048 )指定了密钥的长度。 有2048位长度的关键是足够安全的, 由Mozilla基金会建议 ,但如果你正在寻找更多的加密,可以将其更改为4096

生成过程大约需要5分钟。

一旦完成,再次打开默认的Nginx配置文件:

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

里面新行server模块,定义自定义DHE键的位置:

/ etc / nginx / sites-available / default
ssl_dhparam  /etc/nginx/ssl/dhparam.pem;

第7步 - 将所有HTTP请求重定向到HTTPS

由于我们有兴趣通过HTTPS仅提供内容,我们应该告诉Nginx它应该做什么,如果服务器接收到HTTP请求。

在我们文件的底部,我们将创建一个新的服务器块,用于将所有HTTP请求重定向到HTTPS(确保将服务器名称替换为您的实际域名):

/ etc / nginx / sites-available / default
server {
       listen         80;
       listen    [::]:80;
       server_name    example.com;
       return         301 https://$server_name$request_uri;
}

保存文件,并退出配置文件。

检查语法错误的配置:

sudo nginx -t

第8步 - 重新加载Nginx

这是所有的Nginx配置更改。 因为我们检查每个更改的语法错误,您应该准备重新启动Nginx并测试您的更改。

总而言之,忽略注释掉的行,您的配置文件现在应该类似于:

/ etc / nginx / sites-available / default
server {
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name example.com;

        location / {
                try_files $uri $uri/ =404;
        }

        ssl_certificate /etc/nginx/ssl/example.com.crt;
        ssl_certificate_key /etc/nginx/ssl/example.com.key;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;
}


server {
       listen         80;
       listen    [::]:80;
       server_name    example.com;
       return         301 https://$server_name$request_uri;
}

要应用更改,请重新启动Nginx服务器。

sudo systemctl restart nginx

第9步 - 验证更改

让我们检查一下我们的服务器是否启动并运行。 打开Web浏览器,浏览到您的域(替换example.com与您的实际域名):

example.com

如果一切配置正确,您应该被自动重定向到HTTPS。 现在,让我们检查HTTP / 2的工作:打开Chrome开发者工具( 查看 - > 开发 - > 开发工具 ),并重新加载页面( 查看 - > 刷新本页 )。 然后导航到网络选项卡,单击与名称开头的表头行,在其上单击鼠标右键,并选择协议选项。

现在你应该看到h2在新柱(代表HTTP / 2)为您的网站提供的HTTP / 2的内容。

Chrome开发人员工具HTTP / 2检查

在这一点上,我们的服务器准备好通过HTTP / 2协议提供内容,但仍然有一些事情,我们应该做准备服务器在生产中使用。

第10步 - 优化Nginx的最佳性能

在这一步中,我们将调整主要的Nginx配置文件,以获得最佳性能和安全性。

首先,让我们打开nginx.conf通过键入控制台的情况如下:

sudo nano /etc/nginx/nginx.conf

启用连接凭据缓存

与HTTP相比,HTTPS在服务器和用户之间建立初始连接需要相对较长的时间。 为了尽量减少页面加载速度的差异,我们将启用连接凭据的缓存。 这意味着,不是在每个请求的页面上创建新的会话,服务器将使用缓存版本的凭据。

要启用会话缓存,在末尾加上这些行http的块nginx.conf文件:

/etc/nginx/nginx.conf
ssl_session_cache shared:SSL:5m;
ssl_session_timeout 1h;

ssl_session_cache指定缓存将包含会话信息的大小。 1 MB的它可以存储大约4000个会话的信息。 默认值5 MB对于大多数用户来说已经足够了,但是如果您预期流量很高,您可以相应地增加此值。

ssl_session_timeout限制特定会话被存储在高速缓存中的时间。 此值不应太大(超过一小时),但将值设置得太低也是毫无意义的。

启用HTTP严格传输安全(HSTS)

即使我们已经使所有常规HTTP请求在我们的Nginx配置文件中重定向到HTTPS,我们还应该启用HTTP严格传输安全,以避免首先执行那些重定向。

如果浏览器找到一个HSTS头,它不会尝试在给定的时间段再次通过常规HTTP连接到服务器。 不管是什么,它将只使用加密的HTTPS连接交换数据。 此报头还应保护我们免受协议降级攻击。

在加入这一行nginx.conf

/etc/nginx/nginx.conf
add_header Strict-Transport-Security "max-age=15768000" always;

max-age以秒为单位设置。 15768000秒等于6个月。

默认情况下,此标题不会添加到子域请求中。 如果您有子域名,并希望HSTS适用于所有的人,你应该添加includeSubDomains在该行的末尾变量,就像这样:

/etc/nginx/nginx.conf
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

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

再次检查语法错误的配置:

sudo nginx -t

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

sudo systemctl restart nginx

结论

您的Nginx服务器现在提供HTTP / 2页。 如果你想测试你的SSL连接的强度,请访问Qualys公司SSL实验室 ,并运行对您的服务器进行测试。 如果一切配置正确,您应该得到一个安全的A +标记。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏