Nginx、tomcat配置集群负载均衡
一、下载
nginx官网:http://nginx.org/
直接到nginx官方下载地址下载即可:http://nginx.org/en/download.html,根据各自的操作系统版本下载。本文选择最新的nginx-1.6.0windows稳定版本。
二、安装
安装很简单,直接解压到指定的文件目录即可。解压后的目录如下:
双击nginx.exe,发现一闪而过的窗口,代表nginx服务已经启动。
也可以使用命令进行启动,使用命令行进入nginx根目录下:
- E:\programs\nginx-1.6.0>start nginx
其他相关命令:
查看任务管理器:
- nginx -s stop 快速退出
- nginx -s quit 优雅退出
- nginx -s reload 更换配置,启动新的工作进程,优雅的关闭以往的工作进程
- nginx -s reopen 重新打开日志文件
可能不止一个服务存在(我的就有5个服务(┬_┬)),下面验证是否已经成功启动,直接访问http://localhost可以看到如下图,代表安装启动成功:
三、配置
nginx文件目录下有一个conf文件夹,其中有好几个文件,其他先不管,我们打开nginx.conf,可以看到一段:
- server {
- listen 80;
- server_name localhost;
- #charset koi8-r;
- #access_log logs/host.access.log main;
- location / {
- root html;
- index index.html index.htm;
- }
这段代码在server里面,相当于一个代理服务器,当然可以配置多个。
下面我们仔细来分析一下:
listen:表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。
server_name:表示监听到之后需要转到哪里去,这时我们直接转到本地,这时是直接到nginx文件夹内。
location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
root:里面配置了root这时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件,这里对我们之后的静态文件伺服很有用。
index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二个,依此类推。
下面的error_page是代表错误的页面,这里我们暂时不用,先不管它。
那我们知道了具体的配置了,怎么让它访问localhost时转到tomcat时。实际上就修改两个地方:
- server_name localhost:8080;
- location / {
- proxy_pass http://localhost:8080;
- }
我们就修改了上面两个地方,我的tomcat在8080端口,可以根据自己的需要修改。这里有一个新元素proxy_pass,它表示代理路径,相当于转发,而不像之前说的root必须指定一个文件夹。
此时我们修改了文件,是不是就意思着必须先关了nginx再重新启动了,其实不必,nginx可以重新加载文件的。
我们直接运行:
- nginx -s reload
如果不想直接加载,而只是想检查配置文件有没有问题,可以直接输入:
- nginx -t
这可以检查配置文件中是否有错。 下面我们所有的修改都假设我们修改完成后运行了nginx -s reload进行重新加载配置文件,请注意。
一切没问题了,然后我们再重新打开http://localhost,我们看到下面的页面:
这时,我们发现它并不是刚才的welcome页面了,而是tomcat的管理页面了,不管我们点击什么链接都是没问题的,相当于直接访问http://localhost:8080一样。
四、配置集群负载均衡
有些人会说,这些都只会找一台服务器,但如果我们想在一台服务器挂了的时候,自动去找另外一台,这怎么办?这实际上nginx都考虑到了。
这时,我们之前用的proxy_pass就有大用途了。
我们把之前的第一个例子,即全部都代理的修改一下:
最后修改如下:
- upstream local_tomcat {
- server localhost:18080;
- }
- server{
- location / {
- proxy_pass http://local_tomcat;
- }
- #......其他省略
- }
我们在server外添加了一个upstream,而直接在proxy_pass里面直接用http://+upstream的名称来使用。
我们还是直接来http://localhost,还是和第一个一样的效果,所有链接都没问题,说明我们配置正确。
upstream中的server元素必须要注意,不能加http://,但proxy_pass中必须加。
我们刚才说可以在一个服务器挂了的情况下连到另外一个,那怎么弄呢?
其实很简单,在upstream中的local_tomcat中配置多一个server。比如我现在弄多一个tomcat,端口在18081,所以我们配置如下:
- upstream local_tomcat {
- server localhost:18080;
- server localhost:18081;
- }
此时,我们关闭tomcat,重新来运行http://localhost看看效果:
我修改了index.jsp页面,增加日志输出信息,便于观察。注意:左上角小猫头上的:tomcat2、tomcat1。说明访问了不同的tomcat。
但有时我们就不想它挂的时候访问另外一个,而只是希望一个服务器访问的机会比另外一个大,这个可以在server最后加上一个weight=数字来指定,数字越大,表明请求到的机会越大。
- upstream local_tomcat {
- server localhost:18080 weight=1;
- server localhost:18081 weight=5;
- }
这时我们给了18081一个更高的权值,让它更有机会访问到,实际上当我们刷新http://localhost访问的时候发现18081访问机率大很多,18080几乎没机会访问,一般情况下,如果我们必须这样用,不要相关太大,以免一个服务器负载太大。
当然,server还有一些其他的元素,比如down表示暂时不用到该服务器等等。这些可以参考nginx的wiki。也许写了一大堆,有人会有问题,那nginx怎么关闭呢?这倒是个问题,其实直接运行nginx -s stop就可以关闭了。
至此window下nginx+tomcat负载均衡配置结束,关于tomcat Session的问题通常是采用memcached,或者采用nginx_upstream_jvm_route ,他是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。如果tomcat过多不建议session同步,server间相互同步session很耗资源,高并发环境容易引起Session风暴。请根据自己应用情况合理采纳session解决方案。