如何使用 SSL 终止设置 Nginx 负载平衡

介绍

本文将向您展示如何在负载平衡器上设置 Nginx 负载平衡与 SSL 终止,仅使用一个 SSL 证书。

关于 SSL 终止

Nginx 可以配置为负载平衡器,以便在多个后端服务器周围分配流量。SSL 终止是负载平衡器上发生的过程,该过程处理 SSL 加密/解密,以便负载平衡器和后端服务器之间的流量以 HTTP 进行。

SSL Termination Diagram

前提条件

在本教程中,命令必须作为 root 用户或具有 sudo 特权的用户运行,您可以在 Users Tutorial中看到如何设置。

以下指南可作为参考:

无需 LAMP 服务器,但我们将在本教程中使用它作为例子。

设置

本教程使用以下3个滴滴:

首页 > 首页 > 首页 >

  • 圖片: Ubuntu 14.04
  • 主機名稱: loadbalancer
  • 私人 IP: 10.130.227.33

Droplet 2 (Backend)

  • 圖片: Ubuntu 14.04
  • 主機名稱: web1
  • 個人 IP: 10.130.227.11

(下)

  • 图像:Ubuntu 14.04
  • 主机名: web2
  • 个人 IP: 10.130.227.22

網域名稱 - example.com

所有这些 Droplets 都必须启用 私人网络

在三个服务器上更新和升级软件:

1apt-get update && apt-get upgrade -y

** 重新启动每个服务器以应用升级。** 这很重要,因为OpenSSL需要最新版本才能安全。

我们将为域名设置一个新的 Nginx 虚拟主机,上游模块负载平衡后端。

在设置 Nginx 负载平衡之前,您应该在您的 VPS 上安装 Nginx。

1apt-get install nginx

在两个后端服务器上,更新您的存储库并安装Apache:

1apt-get install apache2

将 PHP 安装在两个后端服务器上:

1apt-get install php5 libapache2-mod-php5 php5-mcrypt

若要了解更多信息,请参阅 此文章

生成密钥并创建SSL证书

在本节中,您将通过创建 SSL 证书所需的步骤进行操作。 本文详细介绍了 Nginx 上的 SSL 证书。

创建SSL证书目录并切换到它。

1mkdir -p /etc/nginx/ssl/example.com
2cd /etc/nginx/ssl/example.com

创建私钥:

1openssl genrsa -des3 -out server.key 2048

删除其护照:

1openssl rsa -in server.key -out server.key

创建一个CSR(证书签名请求):

1openssl req -new -key server.key -out server.csr

使用此 CSR 获取有效证书(https://andsky.com/tech/tutorials/how-to-set-up-apache-with-a-free-signed-ssl-certificate-on-a-vps)或使用以下命令生成自签证书。

1openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

一旦完成,此目录将包含以下文件:

  • server.key - 私钥
  • ca-certs.pem - 您的 CA 的根和中间证书的集合. 只有当您从 CA 获得有效证书时才会出现。

虚拟主机文件和上游模块

在 Nginx 目录中创建虚拟主机文件

1nano /etc/nginx/sites-available/example.com

添加包含后端服务器的私人IP地址的上游模块

1upstream mywebapp1 {
2    server 10.130.227.11;
3    server 10.130.227.22;
4}

此块包含域名、上游服务器的引用以及应该传递到后端的标题。

 1server {
 2    listen 80;
 3    server_name example.com www.example.com;
 4	
 5    location / {
 6        proxy_pass http://mywebapp1;
 7        proxy_set_header Host $host;
 8        proxy_set_header X-Real-IP $remote_addr;
 9        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
10        proxy_set_header X-Forwarded-Proto $scheme;
11    }
12}

proxy_set_header指令用于将有关请求的关键信息传递给上游服务器。

保存此文件并创建一个符号链接到网站启用目录。

1ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

执行配置测试以检查错误。

1service nginx configtest

如果没有出现任何错误,请重新加载 nginx 服务。

1service nginx reload

负载平衡现在已为 HTTP 配置。

启用SSL

将下列指令添加到虚拟主机文件(/etc/nginx/sites-available/example.com)中的服务器 {}块中。

1listen 443 ssl;
2ssl on;
3ssl_certificate         /etc/nginx/ssl/example.com/server.crt;
4ssl_certificate_key     /etc/nginx/ssl/example.com/server.key;
5ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;

如果您正在使用自签证证书,请忽略ssl_trusted_certificate指令,现在服务器块应该是这样的:

 1server {
 2    listen 80;
 3    listen 443 ssl;
 4    server_name example.com www.example.com;
 5
 6    ssl on;
 7    ssl_certificate         /etc/nginx/ssl/example.com/server.crt;
 8    ssl_certificate_key     /etc/nginx/ssl/example.com/server.key;
 9    ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;
10
11    location / {
12        proxy_pass http://mywebapp1;
13        proxy_set_header Host $host;
14        proxy_set_header X-Real-IP $remote_addr;
15        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
16        proxy_set_header X-Forwarded-Proto $scheme;
17    }
18}

检查配置错误并重新加载 Nginx 服务。

1service nginx configtest && service nginx reload

保护后台服务器

目前,在后端服务器上托管的网站可以被任何知道其公共IP地址的人直接访问,这可以通过配置后端的Web服务器只在私人界面上聆听来防止。

编辑ports.conf文件。

1nano /etc/apache2/ports.conf

找下面的线条:

1Listen 80

用后端服务器自己的私人IP地址代替它:

1Listen 10.130.227.22:80

在所有后端服务器上执行此操作,然后重新启动 Apache。

1service apache2 restart

下一步是限制HTTP访问到负载平衡器的私人IP。

1iptables -I INPUT -m state --state NEW -p tcp --dport 80 ! -s 10.130.227.33 -j DROP

用负载平衡器的私人 IP 地址替换示例,并在所有后端服务器上执行此规则。

测试设置

在所有后端服务器上创建一个 PHP 文件(本示例中的 web1 和 web2)。

1nano /var/www/html/test.php

它应该打印访问的域名、服务器的IP地址、用户的IP地址和访问的端口。

1<?php
2    header( 'Content-Type: text/plain' );
3    echo 'Host: ' . $_SERVER['HTTP_HOST'] . "\n";
4    echo 'Remote Address: ' . $_SERVER['REMOTE_ADDR'] . "\n";
5    echo 'X-Forwarded-For: ' . $_SERVER['HTTP_X_FORWARDED_FOR'] . "\n";
6    echo 'X-Forwarded-Proto: ' . $_SERVER['HTTP_X_FORWARDED_PROTO'] . "\n";
7    echo 'Server Address: ' . $_SERVER['SERVER_ADDR'] . "\n";
8    echo 'Server Port: ' . $_SERVER['SERVER_PORT'] . "\n\n";
9?>

使用curl -k在自签名的证书设置上,让 curl 忽略 SSL 错误。

1curl https://example.com/test.php https://example.com/test.php https://example.com/test.php

结果将类似于下列。

 1Host: example.com
 2   Remote Address: 10.130.245.116
 3   X-Forwarded-For: 117.193.105.174
 4   X-Forwarded-Proto: https
 5   Server Address: 10.130.227.11
 6   Server Port: 80
 7
 8   Host: example.com
 9   Remote Address: 10.130.245.116
10   X-Forwarded-For: 117.193.105.174
11   X-Forwarded-Proto: https
12   Server Address: 10.130.227.22
13   Server Port: 80
14
15   Host: example.com
16   Remote Address: 10.130.245.116
17   X-Forwarded-For: 117.193.105.174
18   X-Forwarded-Proto: https
19   Server Address: 10.130.227.11
20   Server Port: 80

请注意,服务器地址在每个请求上都会发生变化,这表明不同的服务器正在响应每个请求。

硬化SSL配置

本节解释了根据最佳实践配置SSL,以消除较旧的加密和协议的漏洞。

启用 SSL 会话缓存可提高 HTTPS 网站的性能. 以下指令必须放在 之后 ssl_trusted_certificate. 它们允许大小为 20MB 的共享缓存,缓存寿命为 _10 分钟。

1ssl_session_cache shared:SSL:20m;
2ssl_session_timeout 10m;

指定要在 SSL 连接中使用的协议和加密器. 在这里,我们忽略了 SSLv2 并禁用了 MD5 和 DSS 等不安全加密器。

1ssl_prefer_server_ciphers on;
2ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
3ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;

Strict Transport Security指示所有支持 Web 浏览器只使用 HTTPS。

1add_header Strict-Transport-Security "max-age=31536000";

检查配置错误并重新加载 Nginx 服务。

1service nginx configtest && service nginx reload

完整配置

配置和硬化SSL终止后,完整的配置文件将看起来如下:

/etc/nginx/可用网站/example.com

1upstream mywebapp1 {
2    server 10.130.227.11;
3    server 10.130.227.22;
4}

server { listen 80; listen 443 ssl; server_name example.com www.emxaple.com;

    ssl on;
    ssl_certificate         /etc/nginx/ssl/example.com/server.crt;
    ssl_certificate_key     /etc/nginx/ssl/example.com/server.key;
    ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;
	
    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 10m;
	
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
	
    add_header Strict-Transport-Security "max-age=31536000";
1location / {
2        proxy_pass http://mywebapp1;
3        proxy_set_header Host $host;
4        proxy_set_header X-Real-IP $remote_addr;
5        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
6        proxy_set_header X-Forwarded-Proto $scheme;
7    }
8}

执行 SSL 服务器测试,此设置应获得 A+ 级别。

1curl https://example.com/test.php https://example.com/test.php https://example.com/test.php

进一步阅读

有关负荷平衡算法的更多信息,请阅读 本文

Published At
Categories with 技术
comments powered by Disqus