1. 概述
  2. 要解决的问题
  3. 环境准备以及问题解决思路
  4. 配置
  5. 测试
  6. 小结

一、概述

  使用Nginx主要是来解决高并发情况下的负载均衡问题。

二、要解决的问题

  1、最主要是负载均衡请求分发。

  2、文件上传功能,只能上传到一个Tomcat上,下载文件或者图片的时候就有可能发生404错误。

  3、多个Tomcat之间Session共享问题,否则会出现不断要求登录的情况。

三、环境准备以及问题解决思路

  1、第一个问题肯定就是使用Nginx来做负载均衡。安装Nginx,请参考:Linux Centos 6.5_x86安装Nginx

  2、第二个问题思路有两个:

    a)在Linux上搭建NFS服务器来实现文件共享,参考:Tomcat 集群 文件上传下载的共享问题 NFS配置

    b)利用Nginx的负载均衡,请求转发功能,将关于图片的上传和下载请求全部转到一台Tomcat上。具体配置参考下边配置一节。本文使用的是这种方式。

  3、上述提到的第三个问题即Session共享问题选择是Tomcat-Redis-Session_manager来解决的,具体请参考:使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享

  3、一台Linux安装多个Tomcat请参考:linux系统下安装两个或多个tomcat

  本文使用的是三台Tomcat,两台处理除文件以外的请求,一台专门处理文件上传和下载的请求。

  分别为:Tomcat1:192.168.1.96:7070

      Tomcat2:192.168.1.96:8081

      Tomcat3:192.168.1.96:9090

四、配置

  

# 使用的用户和组
user root root;
# 指定工作衍生进程数(一般等于CPU的总核数或总核数的两倍,例如两个四核CPU,则综合数为8.通过命令ps -ef|grep nginx可以看出来设置的是几个)
worker_processes 8;
#指定错误日志存放的路径,错误日志记录级别可选项为:[debug|info|notice|warn|error|crit],默认是crit,记录的日志数量从crit到debug,由少到多。
error_log /usr/local/nginx/logs/nginx_error.log crit; #指定pid存放的路径
pid /usr/local/nginx/nginx.pid; # 指定文件描述符数量??
worker_rlimit_nofile 51200; #events settings
events {
# 使用的网络I/O模型,Linux系统推荐采用epoll模型,FreeeBSD系统推荐采用kqueue模型
use epoll;
# 允许的连接数
worker_connections 51200;
} #遵循http协议的服务器全局设置
http {
include mime.types;
default_type application/octet-stream;
#设置使用的字符集,如果一个网站有多种字符集,请不要随便设置,应让程序员在HTML代码中通过Meta标签设置
#charset utf-8; server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k; # 设置客户端能够上传的文件大小,注意要与应用程序中的文件大小限制兼容。
client_max_body_size 300m; sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k; #log_format 自定义日志记录格式设置,main为名字,在access_log命令中引用
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 访问日志文件设置
#关闭日志记录
#access_log off;
#指定日志存放路径,如果想使用默认的combined格式记录日志,可以使用access_log logs/access.log combined; 以下是使用log_format自定义的格式记录日志的。
access_log logs/access.log main; # 开启gzip压缩设置(只能在http模块中设置)
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types application/x-javascript text/css application/xml;
gzip_vary on; # 用于设置如果出现指定的HTTP错误状态码,则返回指定的url页面
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

#upstream设置,设置代理服务器(负载均衡池),默认的负载均衡方式是轮询,另外一种是ip_hash
upstream tomcat_server {
#ip_hash;
server 192.168.1.96:7070 weight=1;
server 192.168.1.96:8081 weight=1;
} #处理上传和下载的图片文件服务器,设置代理服务器(负载均衡池),默认的负载均衡方式是轮训,另外一种是ip_hash
upstream image_server{
server 192.168.1.96:9090 weight=1;
} #server虚拟主机设置,可以设置多个:基于IP的虚拟主机,基于域名的虚拟主机
# 第一个虚拟主机(基于域名的虚拟主机),反向代理tomcat_server和image_server这两组服务器
server {
# 监听的端口
listen 8000;
# 主机名称
server_name localhost;
# 设置Nginx的默认首页文件
index index.html index.htm index.jsp index.do;
#root /home/oracle/dev_tools/server/apache-tomcat-6.0.44/webapps/examples; # 配置该虚拟机的字符设置,如果不配置继承自http中的charset设置
#charset koi8-r; #access_log 访问日志文件设置,如果server虚拟机中不设置,则继承http模块中的access_log的设置
#access_log logs/access.log main; #rewrite settings
if (-d $request_filename)
{
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
} # location模块说明
# 使用环境:server模块 # iamge 服务器location
location ~*/NginxTest/image/ {
proxy_pass http://image_server
;
} location ~*/NginxTest/ {
# root /home/oracle/dev_tools/server/apache-tomcat-6.0.44/webapps/; # HTTP代理模块 proxy,主要是用来转发请求到其他服务器
# 如果后端服务器返回502,504,执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现failover。
proxy_next_upstream http_502 http_504 error timeout invalid_header;
# 变量$host等于客户端请求头中的Host值。
proxy_set_header Host $host;
#后端的web服务器可以通过X-Forwarded-For获取真实的IP地址,$remote_addr客户端的ip地址
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://tomcat_server;
}

#image expires settings
# expires 属于http Header模块,主要用来Nginx返回给用户网页添加附件的header信息,可以在http,server,location中使用
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
} #css&js expires settings
# expires 属于http Header模块,主要用来Nginx返回给用户网页添加附件的header信息,可以在http,server,location中使用
location ~ .*\.(js|css|html)?$
{
expires 2h;
} # 如果http模块设置了,则继承。此处设置了则覆盖。
#error_page 404 /404.html;
#error_page 500 502 503 504 /50x.html; } }

   以下代码配置了两组负载均衡服务器。

  #upstream设置,设置代理服务器(负载均衡池),默认的负载均衡方式是轮询,另外一种是ip_hash
upstream tomcat_server {
#ip_hash;
server 192.168.1.96:7070 weight=1;
server 192.168.1.96:8081 weight=1;
} #处理上传和下载的图片文件服务器,设置代理服务器(负载均衡池),默认的负载均衡方式是轮询,另外一种是ip_hash
upstream image_server{
server 192.168.1.96:9090 weight=1;
}

  第一组就tomcat_server是用来处理普通请求的。第二组image_server主要是用来处理图片文件的上传和下载的,可以理解为一个文件服务器,所有文件相关的上传和下载都通过这组服务器。那怎么配置才能让Nginx实现这种目的呢?看以下配置:

    # iamge 服务器location
location ~*/NginxTest/image/ {
proxy_pass http://image_server;
} location ~*/NginxTest/ {
# root /home/oracle/dev_tools/server/apache-tomcat-6.0.44/webapps/; # HTTP代理模块 proxy,主要是用来转发请求到其他服务器
# 如果后端服务器返回502,504,执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现failover。
proxy_next_upstream http_502 http_504 error timeout invalid_header;
# 变量$host等于客户端请求头中的Host值。
proxy_set_header Host $host;
#后端的web服务器可以通过X-Forwarded-For获取真实的IP地址,$remote_addr客户端的ip地址
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://tomcat_server;
}

  其中location ~*/NginxTest/image/ 符合这种url路径(这种路径是根据自己的应用需求约定的)的请求转发到 proxy_pass属性指定的 image_server服务器,其他请求转发到tomcat_server这组服务器。具体的路径规则请按照自己项目需求约定。Nginx配置参数请参考书籍:《实战Nginx:取代Apache的高性能Web服务器》。

五、测试

  将三个应用分别部署到不同的Tomcat中,应用代码下载:NginxTest.rar

  说明:

  解压后有三个文件:NginxTest.war,NginxTest2.war,NginxImageTest.war,

  其中NginxTestImage必须放到Tomcat3中,三个应用程序名字在放入Tomcat之后必须都改为NginxTest。

  只用NginxTestImage应用有图片文件,NginxTest和NginxTest2中无图片文件。

  访问:http://ip:port/NginxTest/whichTomcat,如下图:

  

   不断刷新该页面,SessionId如果是不变化的说明,Session是从Redis中取到的,解决了Session共享问题。

   不断刷新页面,这是“Tomcat服务器1“文字应该和“Tomcat服务器2”不断变化,说明请求访问的不是相同的Tomcat。因为只有Tomcat3中的应用有图片文件,所以图片的获取是从Tomat3中获取的,也就解决了第二个问题。

六、小结

  1、此时Nginx只有一台,如果这台Nginx访问不了了,整个集群就无法提供服务,所以为了实现Nginx的高可用,需要实现Nginx的failover,实现方式参考:Nginx+Keepalived实现站点高可用

  2、Redis的问题同上,参考:keepalived+redis 高可用redis主从解决方案

  

使用Nginx实现Tomcat集群负载均衡的更多相关文章

  1. Ubuntu下基于Nginx实现Tomcat集群负载均衡

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   Nginx是一款HTTP和反向代理服务器,有关它的介绍可以到网上搜一下,很多很多,不再累述.这里,我们记录一下Nginx ...

  2. Apache + Tomcat集群 + 负载均衡

    Part I: 取经处: http://www.ramkitech.com/2012/10/tomcat-clustering-series-simple-load.html  http://blog ...

  3. ngnix apache tomcat集群负载均衡配置

    http://w.gdu.me/wiki/Java/tomcat_cluster.html 参考: Tomcat与Apache或Nginx的集群负载均衡设置: http://huangrs.blog. ...

  4. nginx+tomcat集群负载均衡(实现session复制)

    转自:http://talangniao.iteye.com/blog/341512 架构描述 前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面( ...

  5. 【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享

    今天想着将项目优化一下,就想的实现集群分布,在本机测试:利用nginx+tomcat实现 通过上一篇博客(http://www.cnblogs.com/qlqwjy/p/8535235.html),N ...

  6. 图文解说:Nginx+tomcat配置集群负载均衡

    图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用  作者:niumd Blog:http://ari.iteye ...

  7. 转】Nginx+tomcat配置集群负载均衡

    原博文出自于:http://blog.csdn.net/bruce_6/article/details/38228299         感谢! 相信很多人都听过nginx,这个小巧的东西慢慢地在吞食 ...

  8. Apache+Tomcat +mod_proxy集群负载均衡及session

      序言: 在玩Apache+Tomcat +mod_jk集群负载均衡及session的时候发现,还有一种方式可以实现,就是网上各位大牛们说的mod_proxy反向代理. 实在弄的我的知识细胞洋洋.实 ...

  9. .net core 跨平台开发 微服务架构 基于Nginx反向代理 服务集群负载均衡

    1.概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客 ...

随机推荐

  1. (转)python中的*args和**kw到底是个啥。看下面的例子就会懂了

    先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '----------- ...

  2. sticky footer布局,定位底部footer

    其作用就是当内容区域比较少时,让footer也能正常定位到底部,以前我们使用js来达到这种效果,其实用css也是完全可以的 <!DOCTYPE html> <html lang=&q ...

  3. 更换gitlab公网IP,引发的故障。

    gitlab更换公网IP地址,导致gitlab非常的很卡,并且ssh方式添加的远程仓库是无法git pull 或者git push,只有是添加http方式的可以正常git pull和git push ...

  4. Luogu2723丑数Humble Numbers【归并排序】

    Luogu2723丑数Humble Numbers 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包 ...

  5. [C#] 使用 StackExchange.Redis 封装属于自己的 Helper

    使用 StackExchange.Redis 封装属于自己的 Helper 目录 核心类 ConnectionMultiplexer 字符串(String) 哈希(Hash) 列表(List) 有序集 ...

  6. 【G】开源的分布式部署解决方案文档 - Web Deploy

    G.系列导航 [G]开源的分布式部署解决方案 - 导航 微软官方部署方式 右键项目->发布 这个大家应该再熟悉不过,在部署前有个预览界面可以看本次更新到底更新哪些文件. 既然它可以预览部署结果, ...

  7. start with connect by prior 递归查询用法,很实用

    当开发过程需要查询上下级机构类似的树形机构,还有就是查询当前等级下的所有所属节点 这个子句主要是用于B树结构类型的数据递归查询,给出B树结构类型中的任意一个结点,遍历其最终父结点或者子结点. 先看原始 ...

  8. 【one day one linux】好用的数据处理工具awk

    awk:好用的数据处理工具 取自<鸟哥私房菜>awk一节 应用:awk是以一行为一次的处理单位,将一行分成数个“字段”进行处理. #awk的命令格式 awk '条件类型1{动作1} 条件类 ...

  9. VS2015下OpenGL库的配置

    写在前面: 最近要用到OpenGL,光是在VS2015下配置就费了很大的劲,现在将我的成果直接贡献给大家,希望能为需要在VS2015下配置OpenGL的读者省去一些麻烦. 正文: 资源地址1:http ...

  10. android 4.4.3 css hack 写法

    最近发现android在4.4.3上面出现很多怪异的现象,现在虽然没有找到原因和解决方案,但是突然间找到一个css hack写法: button{ display:none; width:$rem*4 ...