介绍
本文将向您展示如何在负载平衡器上设置 Nginx 负载平衡与 SSL 终止,仅使用一个 SSL 证书。
关于 SSL 终止
Nginx 可以配置为负载平衡器,以便在多个后端服务器周围分配流量。SSL 终止是负载平衡器上发生的过程,该过程处理 SSL 加密/解密,以便负载平衡器和后端服务器之间的流量以 HTTP 进行。
前提条件
在本教程中,命令必须作为 root 用户或具有 sudo 特权的用户运行,您可以在 Users Tutorial中看到如何设置。
以下指南可作为参考:
- [在Ubuntu 14.04上设置LAMP服务器(https://andsky.com/tech/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-14-04)
- 在 Nginx上设置SSL
- 在 Nginx上设置负载平衡
无需 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
进一步阅读
有关负荷平衡算法的更多信息,请阅读 本文。