通常我们在项目中使用微软的 NLB(Network Load Balancing) 做网络负载均衡。本文将向大家展示如何使用 Nginx 来做网络负载均衡。Nginx 仅仅只是替换掉 NLB,其他服务器架构及配置和以往保持一致
Nginx介绍
Nginx (engine x) 是一款轻量级、高性能的 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3/SMTP 服务,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上 Nginx 的并发能力在同类型的网页服务器中表现较好,中国大陆使用 Nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等
Nginx也可作为负载均衡服务,Nginx 采用 C 编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多,可以使用 Nginx 作为一个非常高效的 HTTP 负载均衡器,将流量分配到多个应用服务器,并通过 Nginx 提高 Web 应用的性能、可伸缩性和可靠性
如大家所知,Microsoft Network Load Balance来搭建,不管在单播、多播和多播模式都有不同的要求,并且对网络基础结果也有不同要求(详见配置网络基础结构以支持 NLB 操作模式 - WindowsServer | Microsoft Docs 链接地址:https://docs.microsoft.com/zh-cn/troubleshoot/windows-server/networking/configure-network-to-support-nlb-operation-mode),每种模式也有不同的优缺点
本文尝试和描述通过搭建基于Nginx的Apriso Web服务器负载平衡集群,作为替换NLB集群的一种尝试,整个过程并没有经过严格测试和验证,本文仅作为一个入门式的搭建和尝试,投入正常应用前需要进行更多的测试和验证
Nginx下载和安装
下载Nginx
nginx:download(http://nginx.org/en/download.html)
下载后解压缩到本目录
Nginx几个主要的命令
nginx –t 验证配置是否正确
nginx –V 显示Nginx模块版本信息
Start Nginx 启动Nginx
nginx -s reload 重新装载配置文件
nginx -s stop 快速停止和关闭Nginx
nginx -s quit 退出Nginx
测试环境准备
配置Nginx负载平衡
修改Nginx配置文件如下 :
代码语言:javascript复制
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#服务器集群名称为WebCluster
upstream WebCluster {
server 192.168.132.132:80;
server 192.168.132.129:80;
}
server {
listen 80;
server_name ClusterServer;
#charset koi8-r;
#access_log logs/host.access.log main;
location /Apriso/Apriso/ {
root html;
index index.html index.htm;
#其中jq_one 对应着upstream设置的集群名称
proxy_pass http://WebCluster/Apriso/Apriso/;
#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /Apriso/Help/ {
root html;
index index.html index.htm;
#其中jq_one 对应着upstream设置的集群名称
proxy_pass http://WebCluster/Apriso/Help/;
#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /Apriso/Start/ {
root html;
index index.html index.htm;
#其中jq_one 对应着upstream设置的集群名称
proxy_pass http://WebCluster/Apriso/Start/;
#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /Apriso/HttpServices/ {
root html;
index index.html index.htm;
#其中jq_one 对应着upstream设置的集群名称
proxy_pass http://WebCluster/Apriso/HttpServices/;
#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /Apriso/CentralConfiguration/ {
root html;
index index.html index.htm;
#其中jq_one 对应着upstream设置的集群名称
proxy_pass http://WebCluster/Apriso/CentralConfiguration/;
#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /Apriso/Portal/ {
root html;
index index.html index.htm;
#其中jq_one 对应着upstream设置的集群名称
proxy_pass http://WebCluster/Apriso/Portal/;
#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
启动Nginx
配置 Apriso 服务器
修改三台服务器(Apriso2021App1、Apriso2021 Web1 /Web2)配置,使用在 Nginx 中定义的“webcluster”作为WebAddress,使用"Apriso2021App1" 作为 AppAddress
修改三台服务器数据库连接,使用 "Apriso2021" 作为数据库服务器:
三台服务器上的 DeploymentInfo.xml 文件中 machine 节点下添加 WebRole和 AppRole
代码语言:javascript复制<?xml version="1.0" encoding="utf-8"?>
<FlexNetDeployment xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<global>
<configurationVariables>
<variable name="Scheme" value="http" />
<variable name="AppAddress" value="APRISO2021App1" />
<variable name="WebAddress" value="WebCluster" />
<variable name="ProgramFilesPath" value="C:Program FilesDassault SystemesDELMIA Apriso 2021" />
<variable name="AprisoTempPath" value="C:TempAprisoTemp" />
<variable name="WebRootURL" value="http://${WebAddress}/Apriso" />
<variable name="WebSitePath" value="${ProgramFilesPath}WebSite" />
</configurationVariables>
</global>
<machines>
<machine name="APRISO2021App1" role="App">
<configurationVariables />
<components />
<folders />
<webFolders />
<services />
</machine>
<machine name="APRISO2021Web1" role="Web">
<configurationVariables />
<components />
<folders />
<webFolders />
<services />
</machine>
<machine name="APRISO2021Web2" role="Web">
<configurationVariables />
<components />
<folders />
<webFolders />
<services />
</machine>
</machines>
</FlexNetDeployment>
修改 windows 服务启动模式为手动(两台Web服务器上):
修改 aprisoservices 相关 windows 服务启动模式为 “手动”;
确认"ASP.NET stateService"和 "Apriso Global Process Manager Services" 在自动状态下运行正常;
测试
重启所有3台服务器(Apriso2021 App1、Apriso2021 Web1 /Web2)
修改两台Web服务器"C:Program FilesDassault SystemesDELMIA Apriso 2021WebSiteStartdefalut.html"文件,添加相关"Web1" 、"Web2"用以区分 Nginx 访问到了不同的 web 服务
通过访问 http://webcluter/apriso/start,验证访问是否正确,多次刷新后,是否能够访问到Web1或Web2不同的服务器上。