当前位置 主页 > 服务器问题 > nginx问题汇总 >

Nginx实现Tomcat的集群负载均衡怎么来设置?

栏目:nginx问题汇总 时间:2018-12-05 10:53

一、概述
  使用Nginx主要是来解决高并发情况下的负载均衡问题。
二、要解决的问题
  1、最主要是负载均衡请求分发。
  2、文件上传功能,只能上传到一个Tomcat上,下载文件或者图片的时候就有可能发生404错误。
  3、多个Tomcat之间Session共享问题,否则会出现不断要求登录的情况。
三、环境准备以及问题解决思路
  1、第一个问题肯定就是使用Nginx来做负载均衡。安装Nginx,请参考:Linux Centos 6.5_x86安装Nginx。
  2、第二个问题思路有两个:
  (2)在Linux上搭建NFS服务器来实现文件共享,参考:Tomcat 集群 文件上传下载的共享问题 NFS配置。
  (1)利用Nginx的负载均衡,请求转发功能,将关于图片的上传和下载请求全部转到一台Tomcat上。具体配置参考下边配置一节。本文使用的是这种方式。
  3、上述提到的第三个问题即Session共享问题选择是Tomcat-Redis-Session_manager来解决的,具体请参考:使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享。
  4、一台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这组服务器。具体的路径规则请按照自己项目需求约定。
五、测试
  将三个应用分别部署到不同的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中获取的,也就解决了第二个问题。
缩小 缩小 缩小 缩小
IIS7整站下载工具 IIS7批量查询排名 IIS7远程桌面连接工具 iis7-iis网站批量管理 iis7批量替换工具 IIS7服务器专用下载工具 IIS7日志分析工具 IIS7批量PING,服务器批量添加网卡IP小工具 IIS7远程同步备份工具
IIS7网站监控 站群批量SEO查询 批量获取排名域名 批量关键词排名查询 模拟各种蜘蛛 批量友情链接监测 批量检测死链 搜索引擎大全 批量查询外链
批量查询网站标题 批量查询KeyWords 批量查询描述 批量查询网站IP 批量百度收录查询 批量查询百度日收录 批量查询百度周收录 批量查询百度月收录 批量查询360总收录 批量查询360日收录 批量查询网站年龄 批量查询360PC权重 批量查询爱站移动权重 批量查询站长移动权重 批量查询360移动权重 批量查询神马权重 批量查询谷歌PR 批量查询搜狗PR 批量查询百度反链 批量查询爱站首页反链 批量查询爱站内页反链 批量查询百度快照 批量查询搜狗快照 批量icp备案查询 批量网站ip地址查询 批量查询导出链接 批量查询百度V认证 批量查询百度安全 批量查询站长PC权重 批量查询爱站PC权重 批量查询搜狗总收录 站长资源大全 IIS7-cms大全 IIS7站群大全 IIS7虚拟空间大全 IIS7服务器大全 IIS7-VPS大全