当网站或应用的持续的运行带来访问不断增加,服务器承受的压力也不断增加,进而引发出服务器内存消耗越来越大,运行和响应越来越慢... 甚至出现卡顿或严重时出现宕机现象,屌丝般的个人或初创公司又不想花钱,怎么办呢?搭建集群服务器来应付不断增大的访问量是不错的选择,而且大大降低成本,目前来看是非常不错的选择,最近在网上看一篇牛人写文章(见后面连接),不知能真否建立如文所说的,于是今天下午就尝试搭建核实一下,利用 Nginx+Tomcat 搭建高性能负载均衡服务器集群,果然结果成功了,很不错,以下就记录一下实现的整个过程,跟大家分享一下;
一,环境和工具准备;
1,window系统环境;
2,Nginx下载,到官网 http://nginx.org/en/download.html 下载Stable version(稳定版),俺用 1.14.0 版本;
3,Tomcat下载,到官网 http://tomcat.apache.org 下载合适相应版本,俺下载 Tomcat8,尽量下那种可以脚本启动的绿色版 ;
二,目标;
对不同client端的请求,经过 Nginx 服务器,根据一定的配置把各个请求按不同的权重设置转发给集群中的不同服务器,实现高性能负载均衡 Tomcat web服务器群集;
三,搭建步骤;
1,下载 tomcat8,解压到某个地方,如Tomcat8_Group_Server01,复制一份改文件夹名称Tomcat8_Group_Server02,如图
2,修改这两个Tomcat的启动端口,分别为18080和28080,下面以修改第一台Tomcat 01为例,打开Tomcat的conf目录下的server.xml,如下图:
用记事本或notepad文本编辑工具打开,修改相关端口,共三处,见红色下划线,
同样方式,修改Tomcat8_Group_Server02的修改如下,
同时为了区别看到启动的是不同的 Tomcat 服务器,分别对两个tomcat下的 webapps\ROOT\index.jsp 稍作修改,用记事本或notepad文本编辑工具打开,见如下红框增加内容,
3,修改完两个tomcat配置后,然后分别启动,以 Tomcat 01 为例,进入bin目录下,DOS运行或双击 startup.bat 文件启动,如下;
启动 Tomcat 01 后如下图,
同样方式,启动 Tomcat 02 后如下图,
到此,两个完全独立的 Tomcat 服务器 01 和 02 已经建立并运行起来了;
4,下一步开始配置Nginx来实现负载均衡了,配置是关键,其实也很简单,就是配置好Nginx的配置文件即可,相关配置语法可搜索网上或看Nginx官网在线文档说明,这里列出一些链接供参考:
官网:http://nginx.org/en/docs
网友站点:https://blog.csdn.net/ok449a6x1i6qq0g660fV/article/details/80276506
http://seanlook.com/2015/05/17/nginx-install-and-config
http://seanlook.com/2015/05/17/nginx-location-rewrite
用记事本或notepad文本编辑工具打开 Nginx 应用下的文件 conf\nginx.conf 配置文件,如下图,
修改配置为如下,配置很关键注意细节:
#user nobody;
worker_processes 1; #工作进程的个数,一般与计算机的cpu核数一致
#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;
# 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,
# 如果用来进行下载等应用磁盘 IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,
# 降低系统的负载。注意:如果图片显示不正常把这个改成off。
#tcp_nopush on;
keepalive_timeout 65;
#长连接超时时间,单位是秒
gzip on;
#启用Gizp压缩
#服务器的集群定义,关键
upstream myGroupServer.com { #服务器集群名字
#ip_hash; #此处不启用是为了看到不同的群集服务器
#当不启用ip_hash可以看到访问按设定的权重随机转发到不同的群集服务器,
#出现的问题是如果访问在某服务器已经登录,当每次刷新后重新访问(路由改变)有可能被转发到另一群集服务器上,这导致在该新服务器上出现未登录的情况;
#当启用ip_hash可以解决登录session丢失假象的问题(确保访问过程中路由不改变),因同一IP来源访问经ip_hash算法后都会转发到相同的某个集服务器上,
#出现的问题同一IP都会访问相同的某个群集服务器,对用户来说可能出现仅有一个服务器的假象,并且如果正好该群集服务器司机,请求则重转发到另一服务器;
server 127.0.0.1:18080 weight=1;
server 127.0.0.1:28080 weight=2;
#server 127.0.0.1:38080 weight=2;
#集群服务器列表,每个服务器配置weight是权重的意思,权重越大,分配的概率越大。
#假设虚拟配置一个不存在的群集服务器(如上端口38080),出现的问题是nginx同样会把请求按指定的权重随机转发到该不存在的服务器上,
#并尝试连接,直到连接达到keepalive_timeout设定时间,如果还没有连接上则按新一轮把请求重新转发,如果连上某个群集服务器则响应请求,
#如果都没连上超时了则返回5xx错误;
}
#当前的Nginx的配置
server {
listen 80;
#监听默认的web 80 端口,可以改成其他端口
server_name localhost;
# 当前服务的域名
#charset koi8-r;
#access_log logs/host.access.log main;
#如下location配置请求转发控制,关键
location / {
proxy_set_header Host $host;
#反向代理服务器把请求头的host改为跟来源处一样,如果不设置则就跟proxy_pass指令值一样,会引起URL错误或丢失等问题, 关键
proxy_set_header X-Forwarded-For $remote_addr;
#如果存在多级反向代理需要设置该指令,这个值是经过代理之后的前一个代理 $remote_addr值(一般即IP),如第三级代理保存第二级代理IP,关键
proxy_pass http://myGroupServer.com;
#对本服务器请求 localhost:80 将转发到名为 myGroupServer.com 的群集处理,关键
proxy_redirect default;
#指令作用是对发送给客户端的URL进行修改,
#使用 default 参数,将根据location和proxy_pass参数的设置来决定
}
# 静态页面资源处理,
location /www/ {
root data;
#相对路径,相对nginx安装目录下的data为根目录,work ok
#root E:/J2EEServer01/nginx-1.14.0/data;
#也可指定绝对路径,如window系统下,注意是/分隔符,work ok
index index.htm index.html;
#指定默认页面,如果匹配路径没有指定页面名称,则会从index的配置中查找名称,再找不到则报错
}
# 静态页面资源处理,对www开头的URL会映射到本服务器的 /data 目录下,例如:
# http://localhost:80/www/pages/page01.html 会映射到本服务器的 /data/www/pages/page01.html
# 即 root 配置的路径加上URL中匹配部分起的直到结尾,即为服务器的真实路径
# 静态图片资源处理,
location /images {
#root data;
#相对路径,相对nginx安装目录下的data为根目录,work ok
root E:/J2EEServer01/nginx-1.14.0/data;
#也可指定绝对路径,如window系统下,注意是/分隔符,work ok
index index.jpg index.gif index.png;
#指定默认图片名称,如果匹配路径没有指定图片名称,则会从index的配置中查找名称,再找不到则报错
}
# 静态图片资源处理,对images开头的URL会映射到本服务器的 /data 目录下,例如:
# http://localhost:80/images/news/newspic.jpg 会映射到本服务器的 /data/images/news/newspic.jpg
# 即 root 配置的路径加上URL中匹配部分起的直到结尾,即为服务器的真实路径
#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;
index 50x.html 50x.htm; #默认页面列表
}
}
}
location 配置规则
1、“ =”前缀的指令严格匹配这个查询。如果找到,停止搜索。
2、所有剩下的常规字符串,匹配最精确的(一般最长的那个)。如果这个匹配使用^〜前缀,搜索停止。
3、正则表达式,在配置文件中是从上往下匹配的
4、如果第3条规则产生匹配的话,结果被使用。否则,如同从第2条规则被使用
特殊情况:
两种情况下,不需要继续匹配正则 location :
( 1 ) 当普通 location 前面指定了“ ^~ ”,特别告诉 Nginx 本条普 通 location 一旦匹配上,则不需要继续正则匹配。
( 2 ) 当普通location 恰好严格匹配上 ,不是最大前缀匹配,则不再继续匹配正则
可以测试nginx配置语法是否正确,DOS下检测命令:nginx -t (默认验证:conf\nginx.conf),也可以指定配置文件路径。
关键配置和其中请求转发到群集中的服务器时涉及的登录 session 问题,虚设不存在的服务器(等同服务器死机)出现的问题,参见配置中的注释,更多问题请参考相关文档和在实践中自己摸索和总结... 到此,关键的 Nginx 负载均衡配置已经完成;
5,启动 Nginx 服务器,注意确保 80 端口别被其它应用占用了,如下图所示,
若果想停止nginx,dos环境运行命令:nginx -s stop 即可,如果不停止重载nginx,命令为:nginx -s reload,注意 Nginx 除了可以做请求转发服务器,还可以作为静态资源服务器,适当合理配置即可,这不在本文范围内,仅提一下;
6,看效果,按 localhost:80 方式访问,即按 Nginx 配置的方式访问 Nginx 服务器(注意不是直接访问 Tomcat 01 或 02 服务器),如下图,
相同的地址,再刷新一或几次,如下图,
也即当我按相同的 localhost:80 地址访问 Nginx 服务器时,我们发现有时看到的是群集中的 Tomcat 01 服务器,再刷新访问地址,有时看到的是群集中的 Tomcat 02 服务器,不断的刷新,我们发现 Tomcat02 服务器出现概率是 Tomcat 01 服务器的约两倍,也即群集服务器的权重设置,到此,我们发现通过 Nginx 服务器,请求确实按 Nginx 的配置根据不同的权重值随机转发给群集中不同的Tomcat服务器了,达到预期配置目标了;
四,总结;
怎么样?实现一个高性能的负载均衡集群就这么完成了。Nginx的功能如此强大,配置却如此简单,我们还有什么理由拒绝它呢?这比我们动不动就十多万至几十万人民币的F5 BIG-IP、NetScaler等硬件负载均衡交换机廉价了不知多少。此外,大家别忘了Nginx不仅仅是一个反向代理服务器,它本身也可以托管网站,作为Web服务器,静态资源服务器,进行Http服务处理;
本文参考牛人博文,同时也部分整理,牛人博客见: https://blog.csdn.net/wang379275614/article/details/47778201