负载均衡的优点
负载平衡是扩展应用程序并提高其性能和冗余的绝佳方法。Nginx 是一种流行的 Web 服务器软件,可以配置为简单但功能强大的负载均衡器,以提高服务器的资源可用性和效率。
Nginx 是如何工作的?Nginx 充当在多个独立服务器上运行的分布式 Web 应用程序的单一入口点。
本指南介绍了负载平衡的优点。了解如何使用 nginx 为云服务器设置负载平衡。
作为先决条件,您需要至少有两台安装并配置了 Web 服务器软件的主机才能看到负载均衡器的优势。如果您已经设置了一台 Web 主机,请通过创建自定义映像并将其部署到UpCloud 控制面板上的新服务器来复制它。
免费试用UpCloud!
安装nginx
要做的第一件事是设置一个新主机作为负载均衡器。如果您尚未部署新实例,请在 UpCloud 控制面板中部署。目前,nginx 软件包可在最新版本的 CentOS、Debian 和 Ubuntu 上使用。因此,请选择您喜欢的其中一个。
按照您喜欢的方式设置服务器后,安装最新的稳定版 nginx。使用以下方法之一。
# Debian 和 Ubuntu
sudo apt-get update
# 然后安装Nginx开源版本
sudo apt-get install nginx
sudo yum install epel-release
sudo yum update
sudo yum install nginx
安装后,将目录更改为 nginx 主配置文件夹。
cd /etc/nginx/
现在,根据您的操作系统,Web 服务器配置文件将位于两个位置之一。
Ubuntu 和 Debian 遵循在/etc/nginx/sites-available/中存储虚拟主机文件的规则 ,这些文件通过/etc/nginx/sites-enabled/ 的符号链接启用 。您可以使用以下命令启用任何新的虚拟主机文件。
sudo ln -s /etc/nginx/sites-available/ vhost /etc/nginx/sites-enabled/ vhost
CentOS 用户可以在 /etc/nginx/conf.d/ 下找到其主机配置文件,其中 加载任何.conf类型的虚拟主机文件。
检查是否至少找到默认配置,然后重新启动 nginx。
sudo systemctl restart nginx
测试服务器是否响应 HTTP 请求。在 Web 浏览器中打开负载均衡器服务器的公共 IP 地址。当您看到 nginx 的默认欢迎页面时,说明安装成功。
如果您在加载页面时遇到问题,请检查防火墙是否阻止您的连接。例如,在 CentOS 7 上,默认防火墙规则不允许 HTTP 流量,请使用以下命令启用它。
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
然后尝试重新加载您的浏览器。
将 nginx 配置为负载均衡器
当nginx安装并测试完毕后,开始配置其负载均衡。本质上,您所需要做的就是设置 nginx,并使用说明来侦听哪种类型的连接以及将它们重定向到何处。使用您喜欢的文本编辑器创建新的配置文件。以纳米为例:
sudo nano /etc/nginx/conf.d/load-balancer.conf
在load-balancer.conf中,您需要定义以下两个部分,上游和服务器,请参阅下面的示例。
# 定义负载均衡方案中包含哪些服务器。
# 最好使用服务器的私有IP以获得更好的性能和安全性。
# 你可以在你的网站上找到私有IP上云控制面板网络部分。
http {
upstream backend {
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
然后保存文件并退出编辑器。
接下来,禁用您之前测试过的安装后有效的默认服务器配置。同样,根据您的操作系统,这部分略有不同。
在 Debian 和 Ubuntu 系统上,您需要从启用站点的文件夹中删除默认的符号链接。
sudo rm /etc/nginx/sites-enabled/default
CentOS 主机不使用相同的链接。相反,只需将conf.d/目录中的default.conf重命名为不以.conf结尾的名称,例如:
sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled
然后使用以下命令重新启动 nginx。
sudo systemctl restart nginx
检查nginx是否启动成功。如果重新启动失败,请查看 您刚刚创建的/etc/nginx/conf.d/load-balancer.conf以确保没有错误或缺少分号。
当您在 Web 浏览器中输入负载均衡器的公共 IP 地址时,您应该传递到您的后端服务器之一。
负载均衡方法
如果没有定义其他方法,nginx 的负载平衡默认使用循环算法,如上面的第一个示例。使用循环方案时,将根据您在load-balancer.conf 文件中设置的顺序轮流选择每个服务器。这可以平衡短操作的请求数量。
基于最少连接的负载平衡是另一种简单的方法。顾名思义,此方法将请求定向到当时活动连接最少的服务器。对于请求有时需要更长时间才能完成的应用程序,它比循环法更公平。
要启用最少连接平衡方法,请将参数least_conn添加到上游 部分,如下例所示。
upstream backend {
least_conn;
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
循环法和最少连接平衡方案是公平的并且有其用途。但是,它们无法提供会话持久性。如果您的 Web 应用程序要求用户随后被定向到与上次连接期间相同的后端服务器,请改用 IP 哈希方法。IP 散列使用访问者的 IP 地址作为确定应选择哪个主机来服务请求的关键。这允许访问者每次都被定向到同一服务器,前提是该服务器可用且访问者的 IP 地址未更改。
要使用此方法,请将ip_hash参数添加到上游 段,如下面的示例所示。
upstream backend {
ip_hash;
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
在不同主机之间的可用资源不相等的服务器设置中,可能需要优先考虑某些服务器而不是其他服务器。定义服务器权重允许您进一步微调 nginx 的负载平衡。负载均衡器中权重最高的服务器最常被选择。
upstream backend {
server 10.1.0.101 weight=4;
server 10.1.0.102 weight=2;
server 10.1.0.103;
}
例如,在上面显示的配置中,选择第一个服务器的频率是第二个服务器的两倍,与第三个服务器相比,第二个服务器再次获得两倍的请求。
启用 HTTPS 的负载平衡
为您的网站启用 HTTPS,这是保护访问者及其数据的好方法。如果您尚未在网络主机上实现加密,我们强烈建议您查看我们的指南,了解如何在 nginx 上安装 Let's Encrypt。
将加密与负载均衡器结合使用比您想象的要容易。您需要做的就是将另一个服务器部分添加到负载均衡器配置文件中,该文件使用 SSL 侦听端口 443 上的 HTTPS 流量。然后为您的上游段设置 proxy_pass,就像上面示例中的 HTTP 一样。
再次打开您的配置文件进行编辑。
sudo nano /etc/nginx/conf.d/load-balancer.conf
然后将以下服务器段添加到文件末尾。
server {
listen 443 ssl;
server_name domain_name;
ssl_certificate /etc/letsencrypt/live/domain_name/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location / {
proxy_pass http://backend;
}
}
然后保存文件,退出编辑器并再次重新启动 nginx。
sudo systemctl restart nginx
当您使用专用网络连接到后端时,在负载均衡器上设置加密具有一些巨大的优势。
- 由于只有您的 UpCloud 服务器可以访问您的专用网络,因此它允许您在负载均衡器处终止 SSL,从而仅传递转发 HTTP 连接。
- 它还极大地简化了您的证书管理。您可以从单个主机获取和续订证书。
启用 HTTPS 后,您还可以选择对负载均衡器的所有连接强制加密。只需使用服务器名称侦听端口 80 并重定向到您的 HTTPS 端口即可更新您的服务器段。然后删除或注释掉不再需要的位置部分。请参阅下面的示例。
server {
listen 80;
server_name domain_name;
return 301 https://$server_name$request_uri;
#location / {
# proxy_pass http://backend;
#}
}
进行更改后再次保存文件。然后重启nginx。
sudo systemctl restart nginx
现在,与负载均衡器的所有连接都将通过加密的 HTTPS 连接提供服务。对未加密 HTTP 的请求也将被重定向为使用 HTTPS。这提供了到加密的无缝过渡。您的访客不需要做任何事情。
健康检查
为了了解哪些服务器可用,Nginx 的反向代理实现包括被动服务器健康检查。如果服务器无法响应请求或回复错误,nginx 将指出服务器已失败。它将尝试暂时避免将连接转发到该服务器。
可以在负载均衡器配置文件中定义在特定时间段内连续尝试连接失败的次数。将参数max_fails设置为服务器线路。默认情况下,当未指定max_fails时,该值设置为 1。(可选)将max_fails设置为 0 将禁用对该服务器的运行状况检查。
如果max_fails设置为大于 1 的值,则后续失败必须在特定时间范围内发生,以便对失败进行计数。该时间范围由参数fail_timeout指定,该参数还定义服务器应被视为失败的时间长度。默认情况下,fail_timeout设置为 10 秒。
当服务器被标记为失败并且超过了fail_timeout设置的时间后,nginx将开始通过客户端请求优雅地探测服务器。如果探测成功返回,服务器将再次标记为活动状态并正常包含在负载平衡中。
upstream backend {
server 10.1.0.101 weight=5;
server 10.1.0.102 max_fails=3 fail_timeout=30s;
server 10.1.0.103;
}
使用健康检查。它们允许您根据需要打开或关闭主机电源,使服务器后端适应当前需求。当您在高流量期间启动额外的服务器时,当新资源自动可供负载均衡器使用时,可以轻松提高应用程序性能。