nginx+tomcat负载均衡集群(二)
一、安装nginx
大同小异,主要有几步
1.下载安装包(http://nginx.org/en/download.html) nginx-1.8.0.tar.gz
2.解压 tar - zxvf nginx-1.8.0.tar.gz
3.cd 到 解压目录下 nginx-1.8.0
4.配置安装目录及附带信息 ./configure --prefix=/usr/local/nginx --with-pcre=/usr/local/pcre-8.32(这里附带了一个pcre 可以下载一个,少东西了编译的时候回报错,缺什么补什么就可以了,直接下载包、或用yum命令都可以)
5.编译 make
6.加载、运行 make install
安装完之后,通用命令可以查看一下版本 rpm -qa|grep nginx
启动nginx: cd到cd /usr/local/nginx/sbin目录 nginx 就启动了(若提示无命令,按提示安装或 yum install nginx) 默认端口为80,访问http://address (address为你的ip,本机即为localhost) 出现 nginx 信息 即成功。
二、部署tomcat
简单的部署一个web项目,加入一个test.jsp页面即可。里面的内容就加入后台的输出、前台页面显示,如:
粗略解释:如图、客户端发送请求,先由nginx监听,转发给后端的tomcat,减轻单个tomcat压力,亦可保证单个tomcat挂了之后,用户请求会由其它的tomcat处理。
3.1打开nginx的配置文件nginx.conf
一般在安装目录下,不确定哪个的话使用命令 nginx -t。如:
该命令是检测加载的配置文件是否有错误,其中就有配置文件的路劲。
之后修改配置文件之后,重新加载命令 nginx -s reload
打开之后找到
server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; ………… }
listen:表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。
server_name:表示监听到之后需要转到哪里去,这时我们直接转到本地,这时是直接到nginx文件夹内。
location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
root:里面配置了root这时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件,这里对我们之后的静态文件伺服很有用。
index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二个,依此类推。
修改为:
server { listen 80; server_name 192.168.1.60; location / { proxy_pass http://192.168.1.60:8080; } ……… }
表示 访问80端口后通过nginx转发到http://192.168.1.60:8080下;即第二步中部署的tomcat中。成功如下:
tomcat访问的是8080 此时通过nginx监听80端口转发到tomcat下得到响应。
3.2负载均衡实现多个tomcat分担请求
3.2.1 再次部署两个tomcat 通过cp命令即可。修改各自端口和tomcat下test.jsp的输出值,部署好之后,与第二步中一致。
比如修改为:
tomcat1 startup端口 8080 shutdown端口 8085 test.jsp输出为===tomcat111111===
tomcat2 startup端口 8081 shutdown端口 28085 test.jsp输出为===tomcat222222===
tomcat3 startup端口 8082 shutdown端口 38085 test.jsp输出为===tomcat333333===
3.2.2修改nginx的配置文件
#负载均衡配置
#轮询
upstream local_tomcat { server 192.168.1.60:8080 weight=1; server 192.168.1.60:8081 weight=1; server 192.168.1.60:8082 backup; } server { listen 80; server_name 192.168.1.60; location / { proxy_pass http://local_tomcat; } ………… }
upstream+名字:分别对应部署的三个tomcat,weight越大表示请求的几率就越大,backup表示备用,其它的tomcat挂掉了,访问它。
此时通过nginx转发到两个tomcat上,同一个地址两个tomcat交替给出响应,当停掉tomcat1,tomcat2,我们继续访问,此时会访问备用的tomcat3,如下
3.3 ip_hash的方式实现负载均衡
3.3.1 修改nginx的配置文件
#负载均衡配置
#ip_hash
upstream local_tomcat { ip_hash; server 192.168.1.60:8080 weight=1 max_fails=2 fail_timeout=2; server 192.168.1.60:8081 weight=1 max_fails=2 fail_timeout=2; } server { listen 80; server_name 192.168.1.60; location / { proxy_pass http://local_tomcat; } ………… }
采用ip_hash方式可绑定请求访问ip以解决session问题,其中无backup机器,max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。 fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
测试如下:
断掉tomcat1,再访问,即会发现,全部请求都转到了tomcat2,ip_hash负载均衡就可以了。
总结:轮询方式根据比重来分配,但是不能解决session,ip_hash可以解决,但很多项目里都采用memcached来保存session,已此来保存,后续单独再弄。
四、分文件过滤,静态文件伺服
主要目的:nginx直接缓存一些静态文件、图片、css、html……,客户端发起请求,通过nginx直接返回回来,不通过tomcat处理
4.1修改nginx的配置文件
server { listen 80; server_name 192.168.1.60; #charset koi8-r; #access_log logs/host.access.log main; #jsp页面跳转 location ~ \.jsp$ { proxy_pass http://local_tomcat; } #静态文件缓存 location ~ \.(html|js|css|png|gif)$ { root /usr/local/nginx/html; } #错误页面跳转 error_page 404 /404.html; error_page 500 502 503 504 /50x.html; ………… }
修改了之前的loction /{……} 改变的判断动态的.jsp后缀交给tomcat处理,其余的一些html等等直接找/usr/local/nginx/html 该文件夹下对应的,定义了404页面。如下:
/usr/local/nginx/html文件下有如下文件:
此时访问最后一个html如下:
访问一个不存在的路径,如下:
注:如果后缀为.jsp,nginx配置文件直接转到了tomcat处理,不会经过此处的拦截,可以在nginx进行判断,也可以在项目里做处理。
到此为止,基本可以达到要求。
参考: