如何使用nginx配置负载均衡
负载均衡是扩展应用程序并提高其性能和冗余的绝佳方法。Nginx是一种流行的Web服务器软件,可以配置为简单但功能强大的负载均衡器,以提高服务器资源的可用性和效率。在负载 均衡配置中,nginx充当在多个单独服务器上工作的分布式Web应用程序的单个入口点。
本文介绍如何使用nginx为云服务器配置负载均衡。作为先决条件,您需要至少安装两台主机并安装Web服务器软件,以便了解负载均衡器的优势。
安装nginx
目前,最新版本的CentOS,Debian和Ubuntu都提供nginx软件包,可以使用命令快速安装nginx。
1 2 3 4 |
#Debian和Ubuntu sudo apt-get update #然后安装Nginx开源版 sudo apt-get install nginx |
1 2 3 4 5 6 |
#CentOS #安装额外的软件包存储库 sudo yum install epel-release #更新存储库并安装Nginx sudo yum update sudo yum install nginx |
安装完成后,进入nginx主配置文件夹。
1 |
cd /etc/nginx/ |
根据您的操作系统不同,Web服务器配置文件将位于两个位置之一。
Ubuntu和Debian遵循在 /etc/nginx/sites-available/中存储虚拟主机文件的规则,这些规则通过符号链接到 /etc/nginx/sites-enabled/来启用。可以使用以下命令启用任何新的虚拟主机文件。
1 |
sudo ln -s /etc/nginx/sites-available/vhost /etc/nginx/sites-enabled/vhost |
CentOS用户可以在/etc/nginx/conf.d/下找到其主机配置文件,nginx会加载此文件加下所有.conf类型的虚拟主机文件。可以在这个目录中至少找到一个默认配置default.conf,然后重新启动nginx。
1 |
sudo systemctl restart nginx |
通过在Web浏览器中打开负载均衡服务器的IP地址来测试服务器是否回复HTTP请求。当您看到nginx的默认欢迎页面时,nginx安装成功。
如果您在加载页面时遇到问题,请检查防火墙是否阻止了您的连接。例如,在CentOS 7上,默认防火墙规则不允许HTTP流量,请使用以下命令启用它。
1 2 |
sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --reload |
然后尝试刷新浏览器。
将nginx配置为负载均衡器
安装并测试nginx后,您可以开始配置nginx以实现负载平衡功能。从本质上讲,需要做的就是设置nginx,其中包含要监听的连接类型以及重定向位置的说明。要实现此目的,请使用您喜欢的任何文本编辑器创建新的配置文件,例如使用vi:
1 |
sudo vi /etc/nginx/conf.d/load-balancer.conf |
在load-balancer.conf中,您需要定义以下两个段:upstream 和server ,请参阅下面的示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#定义要包含在负载均衡方案中的服务器。 #最好使用服务器的私有IP以获得更好的性能和安全性。 http { upstream backend { server 10.1.0.101; server 10.1.0.102; server 10.1.0.103; } #该服务器接受到端口80的所有流量并将其传递给上游upstream 。 #请注意,upstream名称和proxy_pass需要匹配。 server { listen 80; location / { proxy_pass http://backend; } } } |
然后保存文件并退出编辑器。
接下来,您需要禁用先前在安装后测试的默认服务器配置。同样取决于您的操作系统,这部分略有不同。
在Debian和Ubuntu系统上,您需要从启用站点的文件夹中删除默认符号链接。
1 |
sudo rm /etc/nginx/sites-enabled/default |
CentOS的主机不使用相同的链接,而是简单地将重命名default.conf在conf.d /目录下的东西,不是结束的.conf,例如:
1 |
sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled |
然后使用以下命令重新启动nginx
1 |
sudo systemctl restart nginx |
检查nginx是否成功启动。如果重新启动失败,请查看刚刚创建的 /etc/nginx/conf.d/load-balancer.conf,以确保没有错误类型或缺少分号。
在Web浏览器中输入负载均衡nginx的IP地址时,请求会被传递到后端其中一个服务器。
负载均衡方法
如果没有定义其他方法,默认情况下nginx负载均衡会使用循环算法,如上面的第一个示例所示。使用循环方案,将根据您在load-balancer.conf 文件中设置的顺序轮流选择每个服务器。这平衡了短期操作的请求数量。
基于最少连接的负载均衡是另一种简单的方法。顾名思义,此方法将请求定向到当时具有最少活动连接的服务器。对于请求有时可能需要更长时间才能完成的应用程序,它比循环法更有效。
要启用最少连接均衡方法,请将参数least_conn添加到上游 部分,如下例所示。
1 2 3 4 5 6 |
upstream backend { least_conn; server 10.1.0.101; server 10.1.0.102; server 10.1.0.103; } |
虽然循环和最少连接平衡方案是公平的并且有其用途,但是它们不能提供会话持久性。如果您的Web应用程序要求用户随后被定向到与之前连接相同的后端服务器,则应使用IPhash方法。IPhash使用访问者IP地址作为密钥来确定应选择哪个主机来为请求提供服务。这允许访问者每次被定向到同一服务器。
要使用此方法,请将ip_hash 添加到 upstream 段,如下面的示例所示。
1 2 3 4 5 6 |
upstream backend { ip_hash; server 10.1.0.101; server 10.1.0.102; server 10.1.0.103; } |
在一组主机之间的可用资源不相等的服务器配置中,可能希望某些服务器优先于其它服务器。定义服务器权重允许您进一步微调 nginx 负载均衡。负载均衡中权重最高的服务器最常选择。
1 2 3 4 5 |
upstream backend { server 10.1.0.101 weight=4; server 10.1.0.102 weight=2; server 10.1.0.103; } |
例如,在上面的配置中,第一个服务器的选择频率是第二个服务器的两倍,是第三个服务器的四倍。
启用HTTPS的负载均衡
为您的网站启用HTTPS是保护访问者及其数据的好方法。建议大家开启https,可以提高搜索排名。了解如何在nginx上安装Let's Encrypt。
在负载均衡器中使用https加密比想象的要容易。需要做的就是在负载均衡器配置文件中添加另一个服务器server,该server使用SSL监听端口443上的HTTPS流量,并为 upstream 段设置 proxy_pass ,就像上一个示例中的HTTP一样。
再次打开配置文件进行编辑。
1 |
sudo vi /etc/nginx/conf.d/load-balancer.conf |
然后将以下服务器段添加到文件末尾。
1 2 3 4 5 6 7 8 9 10 |
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。
1 |
sudo systemctl restart nginx |
健康检查
为了知道哪些服务器可用,nginx的反向代理实现包括被动服务器健康检查。如果服务器无法响应请求或回复错误,nginx会检测到服务失败,并将尝试一段时间内避免转发请求到该服务器。
通过将参数max_fails设置为服务器行,可以在负载均衡器配置文件中定义特定时间段内连续不成功的连接尝试次数。默认情况下,如果未指定max_fails,则将此值设置为1.(可选)将max_fails设置为0将禁用对该服务器的运行状况检查。
如果将max_fails设置为大于1的值,则后续失败必须在特定时间范围内发生,以便无法计数。此时间范围由参数fail_timeout指定,该参数还定义服务器应被视为失败的时间。默认情况下,fail_timeout设置为10秒。
在服务器标记失败并且fail_timeout设置的时间已过后,nginx将开始使用客户端请求正常探测服务器。如果探测返回成功,则服务器再次标记为可用并且正常包含在负载平衡中。
1 2 3 4 5 |
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; } |
使用运行状况检查可以根据需要通过启动或关闭主机来使服务器后端适应当前需求。在高流量期间启动其他服务器可以在新资源自动供负载均衡器使用时轻松提高应用程序性能。
结论
如果您希望提高Web应用程序的性能和可用性,那么设置负载均衡器绝对值得考虑。使用nginx进行负载均衡功能强大且设置相对简单,并且与简单的加密解决方案(例如Let's Encrypt客户端)一起使用,它为您的Web场提供了一个很好的前端。
虽然使用多个主机可以保护您的Web服务具有冗余,但负载均衡器本身仍然可能单点故障。您可以通过在多个nginx之间设置浮动IP来进一步提高高可用性。
@ yinan
看一下日志,看一下请求是否到upstream,是不是后端也是nginx。
@ 爱哭鬼
您好,您的问题解决了吗?我遇到了同样的问题
博主你好!我的配置如下:
events{
}
http{
upstream my_server {
server 10.190.32.33:8079;
keepalive 2000;
}
server {
listen 10008;
server_name 10.190.32.30;
client_max_body_size 1024M;
location / {
proxy_pass http://my_server/;
}
}
}
我在浏览器访问10.190.32.30:10008后并没有打开10.190.32.33:8079这个站点,而是打开了nginx的主页,请问如何解决?谢谢!