Nginx+Tomcat搭建集群环境

ZeroOne01关注0人评论33534人阅读2018-05-05 14:15:39

集群概述与架构介绍

Tomcat集群能带来什么:

  • 提高服务的性能,例如计算处理能力、并发能力等,以及实现服务的高可用性
  • 提供项目架构的横向扩展能力,增加集群中的机器就能提高集群的性能

Tomcat集群实现方式:

  • Tomcat集群的实现方式有多种,最简单的就是通过Nginx负载进行请求转发来实现

Tomcat单机架构图:

可能看了上面的Tomcat单机的架构图后,会 ”想当然“ 的觉得Tomcat集群架构是这样子的:

这种 ”想当然“ 的Tomcat集群会带来什么问题:

  • Session登录信息存储及读取的问题
  • 服务器定时任务并发的问题
  • ......

所以架构的演进并不是 ”想当然“ 的那么简单,当我们的架构随着业务的需求进行演进时,就可能会发生代码上的改动,以及其他各方面配置及机器的改动,并不是单纯的增加Tomcat机器就行了。因为架构的演进都不是一蹴而就的,编程是一个遇见问题解决问题的过程,所以我们不可能一下子就设计出一个完美的架构,而且也不存在完美的架构,只有合适的架构。

常见的Tomcat集群解决方案:

  • 采用 nginx 中的 ip hash policy 来保持某个ip始终连接在某一个机器上

    • 优点:可以不改变现有的技术架构,直接实现横向扩展,省事。但是缺陷也很明显,在实际的生产环境中,极少使用这种方式
    • 缺点:1.单止服务器请求(负载)不均衡,这是完全依赖 ip hash 的结果。2.客户机ip动态变化频繁的情况下,无法进行服务,因为可能每次的ip hash都不一样,就无法始终保持只连接在同一台机器上。
  • 采用redis或memchche等nosql数据库,实现一个缓存session的服务器,当请求过来的时候,所有的Tomcat Server都统一往这个服务器里读取session信息。这是企业中比较常用的一种解决方案,所以大致的Tomcat集群的架构图如下:


单机部署多个Tomcat实例(Linux)

由于考虑到在学习时,可能没有足够的机器资源去用多台机器部署多个Tomcat实例,所以本节将简单介绍一下如何在Linux系统环境下,单机部署多个Tomcat实例。多机就不介绍了,因为多机就是一台机器安装一个Tomcat就行了,不需要做额外的更改。

1.到Tomcat官网中,复制Tomcat的下载链接进行下载并解压到相应的目录下:

[root@study-01 /usr/local/src]# wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-9/v9.0.7/bin/apache-tomcat-9.0.7.tar.gz
[root@study-01 /usr/local/src]# tar -zxvf apache-tomcat-9.0.7.tar.gz -C /usr/local/

2.安装好Tomcat后,将Tomcat目录拷贝多份出来。并更改一下目录名称:

[root@study-01 /usr/local]# cp -r apache-tomcat-9.0.7 ./tomcat9-02
[root@study-01 /usr/local]# mv apache-tomcat-9.0.7 ./tomcat9-01

3.配置环境变量:

[root@study-01 ~]# vim /etc/profile  # 在文件末尾增加如下内容
export CATALINA_BASE=/usr/local/tomcat9-01
export CATALINA_HOME=/usr/local/tomcat9-01 export TOMCAT_HOME=/usr/local/tomcat9-01 export CATALINA_2_BASE=/usr/local/tomcat9-02 export CATALINA_2_HOME=/usr/local/tomcat9-02 export TOMCAT_2_HOME=/usr/local/tomcat9-02 [root@study-01 ~]# source /etc/profile # 使配置文件生效

4.第一个Tomcat不需要动,只需要修改第二个Tomcat的相关配置,首先编辑第二个Tomcat安装目录中bin目录下的catalina.sh文件:

[root@study-01 ~]# cd /usr/local/tomcat9-02/bin/
[root@study-01 /usr/local/tomcat9-02/bin]# vim catalina.sh  # 找到如下那行注释,在该注释下,增加两行配置
# OS specific support.  $var _must_ be set to either true or false.
export CATALINA_BASE=$CATALINA_2_BASE export CATALINA_HOME=$CATALINA_2_HOME [root@study-01 /usr/local/tomcat9-02/bin]# 

5.然后编辑第二个Tomcat安装目录中conf目录下的server.xml文件,在该文件中需要修改三个端口:

[root@study-01 /usr/local/tomcat9-02/bin]# cd ../conf/
[root@study-01 /usr/local/tomcat9-02/conf]# vim server.xml
# 第一个端口,Server port节点端口 <Server port="9005" shutdown="SHUTDOWN"> # 第二个端口,Connector port节点端口,也即是Tomcat访问端口 <Connector port="9080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" /> # 第三个端口,Connector port节点端口 <Connector port="9009" protocol="AJP/1.3" redirectPort="8443" /> [root@study-01 /usr/local/tomcat9-02/conf]# 

6.修改完成后,分别进入两个Tomcat的bin目录,执行脚本启动Tomcat:

# 启动Tomcat02
[root@study-01 /usr/local/tomcat9-02/conf]# cd ../bin/
[root@study-01 /usr/local/tomcat9-02/bin]# ./startup.sh Using CATALINA_BASE: /usr/local/tomcat9-02 Using CATALINA_HOME: /usr/local/tomcat9-02 Using CATALINA_TMPDIR: /usr/local/tomcat9-02/temp Using JRE_HOME: /usr/local/jdk1.8 Using CLASSPATH: /usr/local/tomcat9-02/bin/bootstrap.jar:/usr/local/tomcat9-02/bin/tomcat-juli.jar Tomcat started. # 启动Tomcat01 [root@study-01 /usr/local/tomcat9-02/bin]# cd ../../tomcat9-01/bin/ [root@study-01 /usr/local/tomcat9-01/bin]# ./startup.sh Using CATALINA_BASE: /usr/local/tomcat9-01 Using CATALINA_HOME: /usr/local/tomcat9-01 Using CATALINA_TMPDIR: /usr/local/tomcat9-01/temp Using JRE_HOME: /usr/local/jdk1.8 Using CLASSPATH: /usr/local/tomcat9-01/bin/bootstrap.jar:/usr/local/tomcat9-01/bin/tomcat-juli.jar Tomcat started. [root@study-01 /usr/local/tomcat9-01/bin]# 

启动完成后,检查监听的端口号及进程:

[root@study-01 ~]# netstat -lntp |grep java
tcp6       0      0 :::8009                 :::*                    LISTEN      2846/java
tcp6       0      0 127.0.0.1:9005          :::*                    LISTEN      2784/java
tcp6       0      0 :::8080                 :::*                    LISTEN      2846/java
tcp6       0      0 :::9009                 :::*                    LISTEN      2784/java
tcp6       0      0 :::9080                 :::*                    LISTEN      2784/java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      2846/java
[root@study-01 ~]# ps aux |grep java
root       2784  5.6  1.5 7105356 123956 pts/0  Sl   06:24   0:06 /usr/local/jdk1.8/bin/java -Djava.util.logging.config.file=/usr/local/tomcat9-02/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat9-02/bin/bootstrap.jar:/usr/local/tomcat9-02/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat9-02 -Dcatalina.home=/usr/local/tomcat9-02 -Djava.io.tmpdir=/usr/local/tomcat9-02/temp org.apache.catalina.startup.Bootstrap start root 2846 6.5 1.4 7105356 119712 pts/0 Sl 06:24 0:05 /usr/local/jdk1.8/bin/java -Djava.util.logging.config.file=/usr/local/tomcat9-01/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat9-01/bin/bootstrap.jar:/usr/local/tomcat9-01/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat9-01 -Dcatalina.home=/usr/local/tomcat9-01 -Djava.io.tmpdir=/usr/local/tomcat9-01/temp org.apache.catalina.startup.Bootstrap start root 2904 0.0 0.0 112680 976 pts/0 S+ 06:25 0:00 grep --color=auto java [root@study-01 ~]# 

最后在浏览器上访问两个不同的端口,看看是否能访问到Tomcat默认的首页。如下:

至此,我们的单机部署多个Tomcat实例就完成了,如果想继续部署,依照此法继续即可。

注:不同的Tomcat实例使用的端口号在系统中必须不能重复,必须是系统没有使用的端口才行,不然会产生端口冲突。


Nginx负载均衡配置,常用策略,场景及特点简介

Nginx负载均衡配置及策略:

  • 轮询(默认)

    • 优点:实现简单
    • 缺点:不考虑每台服务器的处理能力
    • 配置示例如下:
      upstream www.xxx.com {
      # 需要负载的server列表
      server www.xxx.com:8080;
      server www.xxx.com:9080; }
  • 权重,使用的较多的策略
    • 优点:考虑了每台服务器处理能力的不同,哪台机器性能高就给哪台机器的权重高一些
    • 配置示例如下:
      upstream www.xxx.com {
      # 需要负载的server列表,weight表示权重,weight默认为1,如果多个配置权重的节点,比较相对值
      server www.xxx.com:8080 weight=15; server www.xxx.com:9080 weight=10; }
  • ip hash
    • 优点:能实现同一个用户始终访问同一个服务器
    • 缺点:根据 ip hash 不一定平均
    • 配置示例如下:
      upstream www.xxx.com {
      ip_hash;
      # 需要负载的server列表
      server www.xxx.com:8080;
      server www.xxx.com:9080;
      }
  • url hash (第三方插件)
    • 优点:能实现同一个服务访问同一个服务器,也就是根据url进行负载
    • 缺点:和ip hash一样,根据 url hash 分配请求不一定平均,请求频繁的url会请求到同一台服务器上
    • 配置示例如下(需要事先安装插件)
      upstream www.xxx.com {
      # 需要负载的server列表
      server www.xxx.com:8080;
      server www.xxx.com:9080; hash $request_uri; }
  • fair (第三方插件)
    • 特点:按后端服务器的响应时间来分配请求,响应时间短的优先分配
    • 配置示例如下(需要事先安装插件)
      upstream www.xxx.com {
      # 需要负载的server列表
      server www.xxx.com:8080;
      server www.xxx.com:9080;
      fair;
      }

一些负载均衡参数简介:

upstream www.xxx.com {ip_hash;# 需要负载的server列表server www.xxx.com:8080 down;  # down表示当前的server暂时不参与负载server www.xxx.com:9080 weight=2;  # weight默认值为1,weight的值越大,负载的权重就越大  server www.xxx.com:7080 backup;  # 其他所有的非backup机器,在down掉或者很忙的时候,才请求backup机器,也就是一个备用机器server www.xxx.com:6080;
}

Nginx+Tomcat搭建集群

在上文中我们已经介绍了如何在单机上部署多个Tomcat实例,本节将介绍如何安装Nginx,并且使用Nginx+Tomcat搭建集群。

1.到nginx官网上获取下载链接,然后到Linux上下载并解压编译nginx:

[root@study-01 ~]# cd /usr/local/src/
[root@study-01 /usr/local/src]# wget http://nginx.org/download/nginx-1.14.0.tar.gz
[root@study-01 /usr/local/src]# tar -zxvf nginx-1.14.0.tar.gz [root@study-01 /usr/local/src]# cd nginx-1.14.0 [root@study-01 /usr/local/src/nginx-1.14.0]# ./configure --prefix=/usr/local/nginx [root@study-01 /usr/local/src/nginx-1.14.0]# echo $? 0 [root@study-01 /usr/local/src/nginx-1.14.0]# make && make install [root@study-01 /usr/local/src/nginx-1.14.0]# echo $? 0 [root@study-01 /usr/local/src/nginx-1.14.0]# cd ../../nginx/ [root@study-01 /usr/local/nginx]# ls # 安装完成 conf html logs sbin [root@study-01 /usr/local/nginx]#

2.创建nginx的主配置文件,因为我们不使用nginx自带的配置文件:

[root@study-01 /usr/local/nginx/conf]# mv nginx.conf nginx.conf.bak
[root@study-01 /usr/local/nginx/conf]# vim nginx.conf  # 内容如下
user nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; worker_rlimit_nofile 51200; events { use epoll; worker_connections 6000; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 3526; server_names_hash_max_size 4096; log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]' ' $host "$request_uri" $status' ' "$http_referer" "$http_user_agent"'; sendfile on; tcp_nopush on; keepalive_timeout 30; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; connection_pool_size 256; client_header_buffer_size 1k; large_client_header_buffers 8 4k; request_pool_size 4k; output_buffers 4 32k; postpone_output 1460; client_max_body_size 10m; client_body_buffer_size 256k; client_body_temp_path /usr/local/nginx/client_body_temp; proxy_temp_path /usr/local/nginx/proxy_temp; fastcgi_temp_path /usr/local/nginx/fastcgi_temp; fastcgi_intercept_errors on; tcp_nodelay on; gzip on; gzip_min_length 1k; gzip_buffers 4 8k; gzip_comp_level 5; gzip_http_version 1.1; gzip_types text/plain application/x-javascript text/css text/htm application/xml; add_header Access-Control-Allow-Origin *; include vhost/*.conf; } [root@study-01 /usr/local/nginx/conf]# mkdir ./vhost # 创建虚拟主机配置文件的存放目录 [root@study-01 /usr/local/nginx/conf]# cd vhost/ [root@study-01 /usr/local/nginx/conf/vhost]# vim www.xxx.com.conf # 创建虚拟主机配置文件,内容如下: upstream 192.168.190.129 { # 需要负载的server列表,可以直接使用ip server 192.168.190.129:8080 weight=1; server 192.168.190.129:9080 weight=3; # server www.xxx.com:8080 weight=1; # server www.xxx.com:9080 weight=3; } server{ listen 80; autoindex on; server_name 192.168.190; access_log /usr/local/nginx/logs/access.log combined; index index.html index.htm index.jsp; location / { proxy_pass http://192.168.190.129; add_header Access-Control-Allow-Origin *; } } [root@study-01 /usr/local/nginx/conf/vhost]# 

3.检查nginx配置文件,显示没问题则启动nginx服务:

[root@study-01 /usr/local/nginx/conf/vhost]# cd ../../sbin/
[root@study-01 /usr/local/nginx/sbin]# ./nginx -t  # 检查nginx配置文件
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@study-01 /usr/local/nginx/sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf # 启动nginx服务 [root@study-01 /usr/local/nginx/sbin]# netstat -lntp | grep nginx # 检查端口是否已监听 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5676/nginx: master [root@study-01 /usr/local/nginx/sbin]# ps aux |grep nginx # 检查nginx进程是否正常 root 5676 0.0 0.0 20492 624 ? Ss 19:57 0:00 nginx: master process ./nginx -c /usr/local/nginx/conf/nginx.conf nobody 5677 0.0 0.0 22936 3220 ? S 19:57 0:00 nginx: worker process nobody 5678 0.0 0.0 22936 3220 ? S 19:57 0:00 nginx: worker process root 5683 0.0 0.0 112680 976 pts/0 S+ 19:58 0:00 grep --color=auto nginx [root@study-01 /usr/local/nginx/sbin]# 

4.启动两个Tomcat实例:

[root@study-01 ~]# cd /usr/local/tomcat9-01/bin/
[root@study-01 /usr/local/tomcat9-01/bin]# ./startup.sh
Using CATALINA_BASE:   /usr/local/tomcat9-01
Using CATALINA_HOME:   /usr/local/tomcat9-01 Using CATALINA_TMPDIR: /usr/local/tomcat9-01/temp Using JRE_HOME: /usr/local/jdk1.8 Using CLASSPATH: /usr/local/tomcat9-01/bin/bootstrap.jar:/usr/local/tomcat9-01/bin/tomcat-juli.jar Tomcat started. [root@study-01 /usr/local/tomcat9-01/bin]# cd /usr/local/tomcat9-02/bin/ [root@study-01 /usr/local/tomcat9-02/bin]# ./startup.sh Using CATALINA_BASE: /usr/local/tomcat9-02 Using CATALINA_HOME: /usr/local/tomcat9-02 Using CATALINA_TMPDIR: /usr/local/tomcat9-02/temp Using JRE_HOME: /usr/local/jdk1.8 Using CLASSPATH: /usr/local/tomcat9-02/bin/bootstrap.jar:/usr/local/tomcat9-02/bin/tomcat-juli.jar Tomcat started. [root@study-01 /usr/local/tomcat9-02/bin]# 

5.修改第二个Tomcat实例index.jsp文件内容,以作为两个Tomcat实例的区别,方便一会验证负载均衡是否已成功生效:

[root@study-01 ~]# vim /usr/local/tomcat9-02/webapps/ROOT/index.jsp
<div id="congrats" class="curved container"><h2>I'm Tomcat 2</h2>
</div>
[root@study-01 ~]# 

6.设置防火墙规则,开放80端口:

[root@study-01 ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
[root@study-01 ~]# firewall-cmd --reload
success
[root@study-01 ~]# 

7.使用浏览器进行访问,验证nginx的负载均衡是否已成功生效:

如上,验证成功,我们配置的nginx的负载均衡成功。到此为止,我们的Tomcat集群环境就搭建完成了。

转载于:https://www.cnblogs.com/buffercache/p/11577989.html

Nginx+Tomcat搭建集群环境相关推荐

  1. Tomcat集群快速入门:Nginx+Tomcat搭建集群

    参数的一些扩展点,那刚刚讲的一些负载均衡策略,都是实际企业当中常用的,负载均衡策略,领着大家分析了优缺点,希望大家好好体会,百分之一百的吸收,那我们现在把这些参数和扩展的点呢,放到一个配置里,一起来给 ...

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

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

  3. Nginx+Tomcat+Memcached集群 【测试成功】

    Nginx+Tomcat+Memcached集群 Tomcat集群session同步方案有以下几种方式: 使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配 ...

  4. 架构系列三:使用Keepalived+Nginx+tomcat实现集群部署

    架构系列三:使用Keepalived+Nginx+tomcat实现集群部署 介绍了通过Nginx配置Tomct集群,当其中一个Tomcat服务停止后,Nginx可自动识别并选择另一个服务器响应用户请求 ...

  5. 架构系列二:使用Nginx+tomcat实现集群部署

    架构系列二:使用Nginx+tomcat实现集群部署 一.环境介绍  VM1:Ubuntu-S100 IP:192.168.130.128 部署Tomcat应用及Nginx  VM2:Ubuntu-S ...

  6. Hadoop从安装Linux到搭建集群环境

    简介与环境准备 hadoop的核心是分布式文件系统HDFS以及批处理计算MapReduce.近年,随着大数据.云计算.物联网的兴起,也极大的吸引了我的兴趣,看了网上很多文章,感觉还是云里雾里,很多不必 ...

  7. Hadoop化繁为简(一)-从安装Linux到搭建集群环境

    Hadoop化繁为简(一)-从安装Linux到搭建集群环境 简介与环境准备 hadoop的核心是分布式文件系统HDFS以及批处理计算MapReduce.近年,随着大数据.云计算.物联网的兴起,也极大的 ...

  8. Hadoop化繁为简-从安装Linux到搭建集群环境

    Hadoop化繁为简-从安装Linux到搭建集群环境 摘要: 简介与环境准备hadoop的核心是分布式文件系统HDFS以及批处理计算MapReduce.近年,随着大数据.云计算.物联网的兴起,也极大的 ...

  9. Elasticsearch集群:搭建集群环境

    Elasticsearch集群:搭建集群环境 1. 创建相应目录 在/root/es-cluster目录下创建以下目录 mkdir -p es01/data mkdir -p es01/logsmkd ...

最新文章

  1. 关于表单的java的程序_JAVA BOT程序模拟人类用户填写表单 并 发送
  2. Linux基础之grep攻坚
  3. 【Android 系统开发】 Android 系统启动流程简介
  4. P2601 [ZJOI2009]对称的正方形(二维哈希)(二分)
  5. iMeta宏基因组生物信息期刊-创刊背景和简介
  6. [导入]RSS商业应用和电子商务的结合
  7. 详解淘宝直播背后的技术!
  8. C++前景如何,C++好学吗?
  9. 乐安全 支持x86_android-x86-4.4-r2运行程序总是停止运行怎么处理
  10. 离散数学 习题篇——生成主范式
  11. Spring boot 整合WebSocket
  12. 非极大值抑制(Non-Maximum-Suppression)
  13. 电脑自动同步服务器时间bat,关于电脑时间自动同步校准方法
  14. 知识图谱论文梳理【 HyTE:基于超平面的时序知识图谱】
  15. webpack5从零搭建一个项目
  16. 7年弹指一挥间:iOS演进史
  17. 一文了解边缘计算和边缘AI
  18. gm 1 n 模型matlab,灰色预测模型GM1,n模型的matlab源...
  19. 汉高2019年上半年实现销售额101亿欧元
  20. OPPO Find7 system分区教程

热门文章

  1. AI项目商务合作,寻广州附近计算机视觉算法团队!
  2. 机器学习中数据清洗预处理入门完整指南
  3. 【python教程入门学习】五、Python中的列表(list)
  4. 大道至简:算法工程师须知的十个炼丹trick
  5. 收藏 | 一文读懂机器学习中的正则化
  6. 卷王李富贵算法每日一题--分治算法(三)--逃亡
  7. 深度学习(六十五)移动端网络MobileNets
  8. mysql my includedir_MySQL:读取my.cnf的顺序问题
  9. mysql使用条件限制乐观锁_使用Mysql乐观锁解决并发问题
  10. 人脸识别撞脸名画_艺术与时尚结合的极致——当服装设计遇到名画