介绍
NGINX是一个快速和可靠的开源网络服务器。 由于其低内存占用,高可扩展性,易于配置和支持绝大多数不同的协议,它获得了它的流行。
支持的协议之一是相对较新的HTTP / 2,它于2015年5月发布.HTTP / 2的主要优点是其内容丰富的网站的高传输速度。
本教程将帮助您设置一个快速和安全的Nginx服务器与HTTP / 2支持。
先决条件
在我们开始之前,我们需要一些东西:
- Ubuntu 16.04 Droplet
- 使用sudo特权的非root用户(查看初始服务器设置与Ubuntu 16.04的详细信息。)
- 完全注册域名。 你可以购买一个Namecheap或得到一个免费Freenom 。
- 确保您的域名配置为指向您的Droplet。 看看这个教程 ,如果你需要帮助。
- SSL证书。 生成自签名的证书 , 获得让我们加密一个自由的 ,或买一个来自其他供应商 。
就这些。 如果你有上面列出的一切,你就准备好了。
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
输出应类似于以下内容:
nginx version: nginx/1.10.0 (Ubuntu)
在接下来的几个步骤中,我们将修改Nginx配置文件。 每个步骤将更改Nginx配置选项。 我们将一路测试配置文件的语法。 最后,我们将验证Nginx是否支持HTTP / 2,并进行一些更改以优化性能。
第2步 - 更改侦听端口并启用HTTP / 2
我们将第一个变化将是侦听端口更改从80
到443
。
让我们打开配置文件:
sudo nano /etc/nginx/sites-available/default
默认情况下,Nginx设置为监听端口80,这是标准的HTTP端口:
listen 80 default_server;
listen [::]:80 default_server;
正如你可以看到,我们有两个不同的listen
变量。 第一个是所有IPv4连接。 第二个用于IPv6连接。 我们将为两者启用加密。
修改监听端口为443
,这是使用HTTPS协议:
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
请注意,除了ssl
,我们还增加http2
到线路。 这个变量告诉Nginx在支持的浏览器上使用HTTP / 2。
第3步 - 更改服务器名称
我们使用的server_name
条目指定域名应该与配置文件相关联。 找到server_name
在配置文件中的条目。
默认情况下, server_name
设置为_
(下划线),这意味着配置文件是负责所有传入的请求。 改变_
为您的实际域名,就像这样:
server_name example.com;
保存配置文件并编辑文本编辑器。
每当你修改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
第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
模块,定义证书的位置:
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;
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键的位置:
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
第7步 - 将所有HTTP请求重定向到HTTPS
由于我们有兴趣通过HTTPS仅提供内容,我们应该告诉Nginx它应该做什么,如果服务器接收到HTTP请求。
在我们文件的底部,我们将创建一个新的服务器块,用于将所有HTTP请求重定向到HTTPS(确保将服务器名称替换为您的实际域名):
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
保存文件,并退出配置文件。
检查语法错误的配置:
sudo nginx -t
第8步 - 重新加载Nginx
这是所有的Nginx配置更改。 因为我们检查每个更改的语法错误,您应该准备重新启动Nginx并测试您的更改。
总而言之,忽略注释掉的行,您的配置文件现在应该类似于:
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的内容。
在这一点上,我们的服务器准备好通过HTTP / 2协议提供内容,但仍然有一些事情,我们应该做准备服务器在生产中使用。
第10步 - 优化Nginx的最佳性能
在这一步中,我们将调整主要的Nginx配置文件,以获得最佳性能和安全性。
首先,让我们打开nginx.conf
通过键入控制台的情况如下:
sudo nano /etc/nginx/nginx.conf
启用连接凭据缓存
与HTTP相比,HTTPS在服务器和用户之间建立初始连接需要相对较长的时间。 为了尽量减少页面加载速度的差异,我们将启用连接凭据的缓存。 这意味着,不是在每个请求的页面上创建新的会话,服务器将使用缓存版本的凭据。
要启用会话缓存,在末尾加上这些行http
的块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
:
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 restart nginx
结论
您的Nginx服务器现在提供HTTP / 2页。 如果你想测试你的SSL连接的强度,请访问Qualys公司SSL实验室 ,并运行对您的服务器进行测试。 如果一切配置正确,您应该得到一个安全的A +标记。