Tomcat虚拟主机

​ 一个应用程序在某一个端口启动运行产生了一系列的进程就是一个实例,让tomcat启动两个不同的相互独立的进程,产生两个不同的套接字,分别运行在不同的端口,让不同的端口响应不同的请求,就是多实例.

作用

  1. # 1.多个实例运行相同的应用,实现负载均衡,支持高并发处理,解决session问题.
  2. # 2.多个实例运行不同的应用(类似虚拟主机)

多实例Example

配置三个Tomcat实例,分别运行/webapps/ROOT下的同一网站,达到负载均衡的作用

实例目录 工作端口 实例端口
tomcat_instance1: /usr/local/tomcat/instance1/{conf,logs,temp,work} 8081 8091
tomcat_instance2: /usr/local/tomcat/instance1/{conf,logs,temp,work} 8082 8092
tomcat_instance3: /usr/local/tomcat/instance1/{conf,logs,temp,work} 8083 8093
先部署一个单节点Tomcat

1.安装JDK环境

  1. # CentOS7安装Java,有tar包和rpm包两种
  2. 1>. rpm -ivh jdk-8u121-linux-x64.rpm
  3. 2>. tar xvf jdk-8u151-linux-x64.tar.gz -C /usr/local/
  4. cd /usr/local/
  5. mv jdk1.8.0_151/ jdk
  6. tail -2 /etc/profile
  7. JAVA_HOME=/usr/local/jdk
  8. export PATH=$PATH:$JAVA_HOME/bin
  9. source /etc/profile

2.安装Tomcat

  1. wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.47/bin/apache-tomcat-8.5.47.tar.gz
  2. tar xvf apache-tomcat-8.5.47.tar.gz -C /usr/local/
  3. ln -s /usr/local/apache-tomcat-8.5.47/ /usr/local/tomcat
  4. tail -1 /etc/profile
  5. export CATALINA_HOME=/usr/local/tomcat
  6. source /etc/profile
  7. env |grep -i home
  8. CATALINA_HOME=/usr/local/tomcat
  9. HOME=/root
  10. # 查看熵池的大小:
  11. cat /proc/sys/kernel/random/entropy_avail 180
  12. 增加熵池大小,解决TomcatCentOS 7巨慢的问题
  13. # 安装rng服务,增大熵池
  14. yum -y install rng-tools
  15. systemctl start rngd && systemctl enable rngd
  16. # 启动服务访问Tomcat页面快一百倍..

3.启动Tomcat

  1. /usr/local/tomcat/bin/catalina.sh start
  2. # ss -antp |grep java
  3. # LISTEN 0 100 *:8009 *:* users:(("java",pid=857,fd=58))
  4. # LISTEN 0 100 *:8080 *:* users:(("java",pid=857,fd=53))
  5. # LISTEN 0 1 127.0.0.1:8005 *:* users:(("java",pid=857,fd=73))
  6. /usr/local/tomcat/bin/shutdown.sh

配置多实例目录

  1. mkdir /webapps/ROOT -p
  2. echo "welcome to tomcat mulit instance" > /webapps/ROOT/index.jsp
  3. echo "hello everyone" > /webapps/ROOT/a.jsp
  4. mkdir -p /usr/local/tomcat/instance{1,2,3}/{conf,logs,temp,work}
配置实例server.xml
  1. \cp /usr/local/tomcat/conf/* /usr/local/tomcat/instance1/conf/
  2. \cp /usr/local/tomcat/conf/* /usr/local/tomcat/instance2/conf/
  3. \cp /usr/local/tomcat/conf/* /usr/local/tomcat/instance3/conf/
  4. # Context配置
  5. # Context作用
  6. # 路径映射
  7. # 应用独立配置,例如单独配置应用日志,单独配置应用访问控制
  8. vim /usr/local/tomcat/instance1/conf/server.xml
  9. <Server port="8091" shutdown="SHUTDOWN"> # 管理实例端口
  10. <Connector port="8081" protocol="HTTP/1.1" # 提供web服务端口
  11. connectionTimeout="20000"
  12. redirectPort="8443" />
  13. <Host name="localhost" appBase="/webapps"
  14. # 如果两个实例对应两个不同的页面,那么直接修改appBase后端的路径就可以了
  15. unpackWARs="true" autoDeploy="true">
  16. vim /usr/local/tomcat/instance2/conf/server.xml
  17. <Server port="8092" shutdown="SHUTDOWN">
  18. <Connector port="8082" protocol="HTTP/1.1"
  19. connectionTimeout="20000"
  20. redirectPort="8443" />
  21. <Host name="localhost" appBase="/webapps"
  22. unpackWARs="true" autoDeploy="true">
  23. vim /usr/local/tomcat/instance3/conf/server.xml
  24. <Server port="8093" shutdown="SHUTDOWN">
  25. <Connector port="8083" protocol="HTTP/1.1"
  26. connectionTimeout="20000"
  27. redirectPort="8443" />
  28. <Host name="localhost" appBase="/webapps"
  29. unpackWARs="true" autoDeploy="true">
创建一个脚本方便启动
  1. chmod +x /usr/local/tomcat/instance1/ins1.sh
  2. #每个tomcat下的instance都要创建一个ins1.sh,并且修改里面的instance
  3. #!/bin/bash
  4. #instace1 script
  5. export JAVA_OPTS='-Xms64m -Xmx128m'
  6. #tomcat实例启动时最小分配的内存为64M,最大为128M
  7. export CATALINA_HOME=/usr/local/tomcat
  8. #tomcat的安装目录
  9. export CATALINA_BASE=/usr/local/tomcat/instance1
  10. #实例1的目录
  11. case $1 in
  12. start)
  13. $CATALINA_HOME/bin/startup.sh
  14. ;;
  15. stop)
  16. $CATALINA_HOME/bin/shutdown.sh
  17. ;;
  18. restart)
  19. $CATALINA_HOME/bin/shutdown.sh
  20. sleep 3
  21. $CATALINA_HOME/bin/startup.sh
  22. ;;
  23. esac
  24. chmod +x /usr/local/tomcat/instance1/ins1.sh
  25. cp instance1/ins1.sh instance2/
  26. cp instance1/ins1.sh instance3/
  27. vim instance3/ins1.sh
  28. vim instance2/ins1.sh # 修改tomcat安装目录instanace分别对应什么目录即可
  29. /usr/local/tomcat/instance1/ins1.sh start
  30. /usr/local/tomcat/instance2/ins1.sh start
  31. /usr/local/tomcat/instance3/ins1.sh start
  32. elinks --dump 39.108.140.0:8081
  33. # welcome to tomcat mulit instance
  34. elinks --dump 39.108.140.0:8082
  35. # welcome to tomcat mulit instance
  36. elinks --dump 39.108.140.0:8083
  37. # welcome to tomcat mulit instance

Nginx+Tomcat负载均衡

用户在访问时,需要手动输入端口号,所以需要一个代理服务器,使用nginx做代理,用户访问nginx,然后由nginx访问后端的tomcat。代理方案有两种.

客户端所有请求全部代理到后端Tomcat服务器

修改配置文件,重启服务
  1. # 为了测试看效果使用不同的页面
  2. mkdir /webapp{1..3}
  3. mkdir /webapps1/ROOT
  4. mkdir /webapps2/ROOT
  5. mkdir /webapps3/ROOT
  6. echo webapp1 > /webapps1/ROOT/index.jsp
  7. echo webapp2 > /webapps2/ROOT/index.jsp
  8. echo webapp3 > /webapps3/ROOT/index.jsp
  9. vim /usr/local/tomcat/instance1/conf/server.xml # 分别修改三个配置文件的appBase
  10. vim /usr/local/tomcat/instance2/conf/server.xml
  11. vim /usr/local/tomcat/instance3/conf/server.xml
  12. # 除了修改配置文件appBase,为保证后端Tomcat服务器的日志可以记录客户端真实IP
  13. vim /usr/local/tomcat/instance1/conf/server.xml
  14. prefix="localhost_access_log" suffix=".txt"
  15. pattern="**%{x-real-ip}i** %l %u %t &quot;%r&quot; %s %b" />
  16. /usr/local/tomcat/instance3/ins1.sh start
  17. /usr/local/tomcat/instance2/ins1.sh start
  18. /usr/local/tomcat/instance1/ins1.sh start
配置Nginx
  1. vim /etc/nginx/nginx.conf
  2. http {
  3. upstream tomcatsrv {
  4. server 39.108.140.0:8081 weight=1 max_fails=2 fail_timeout=2;
  5. server 39.108.140.0:8082 weight=1 max_fails=2 fail_timeout=2;
  6. server 39.108.140.0:8083 weight=1 max_fails=2 fail_timeout=2;
  7. }
  8. vim /etc/nginx/conf.d/default.conf
  9. server {
  10. listen 80;
  11. server_name localhost;
  12. location / {
  13. proxy_pass http://tomcatsrv;
  14. proxy_set_header x-real-ip $remote_addr;
  15. root /usr/share/nginx/html;
  16. index index.html index.htm;
  17. }
  18. nginx -s reload
  19. elinks --dump 39.108.140.0
  20. webapp1
  21. elinks --dump 39.108.140.0
  22. webapp2
  23. elinks --dump 39.108.140.0
  24. webapp3
  25. # 我们去看下tomcat日志是否记录了真实日志
  26. tail -2 /usr/local/tomcat/instance1/logs/localhost_access_log.2019-11-05.txt
  27. 39.108.140.0 - - [05/Nov/2019:12:28:17 +0800] "GET / HTTP/1.0" 200 8
  28. 47.92.24.137 - - [05/Nov/2019:12:35:13 +0800] "GET / HTTP/1.0" 200 8

客户端访问静态页面由Nginx解析,客户端如访问jsp页面访问请求代理到后端Tomcat服务器

只需要准备一台能解析静态页面的nginx,或者httpd,修改下配置文件即可

  1. vim /etc/nginx/nginx.conf
  2. http {
  3. upstream nginxsrv {
  4. server 49.233.69.195:80 weight=1 max_fails=2 fail_timeout=2;
  5. }
  6. upstream tomcatsrv {
  7. server 39.108.140.0:8081 weight=1 max_fails=2 fail_timeout=2;
  8. server 39.108.140.0:8082 weight=1 max_fails=2 fail_timeout=2;
  9. server 39.108.140.0:8083 weight=1 max_fails=2 fail_timeout=2;
  10. }
  11. vim /etc/nginx/conf.d/default.conf
  12. location ~* \.html$ {
  13. root /usr/share/nginx/html;
  14. index index.html index.htm;
  15. proxy_pass http://nginxsrv;
  16. proxy_set_header x-real-ip $remote_addr;
  17. }
  18. location ~* \.jsp$ {
  19. proxy_pass http://tomcatsrv;
  20. proxy_set_header x-real-ip $remote_addr;
  21. }
  22. nginx -s reload
  23. elinks --dump 39.108.140.0/index.html
  24. welcome to nginx
  25. elinks --dump 39.108.140.0/index.jsp
  26. webapp1
  27. elinks --dump 39.108.140.0/index.jsp
  28. webapp2

如果tomcat上面搭建的是一个实际的网站,点击登录去登录,却发现登录不成功,可能是session会话不一致的问题

session(会话) 暂时没有使用共享方式,目前采用的会话保持,软件方面可以通过会话同步到数据库是实现session会话共享。

或者前方代理比如Nginx使用ip_hash之类的算法,一个用户固定访问后端的一个web服务器

即将同一个client的访问始终调度到同一后端实例.

02 . Tomcat多实例并用Nginx反代的更多相关文章

  1. Nginx反代Mogilefs分布式储存示例

    一.分布式存储系统简介 随着信息技术不断的发展,给我们带来便利的同时,不断增加的数据量级.信息之间的连接关联越来越复杂.数据访问的并发量日益增加对I/O的要求越来越高.数据类型越来越复杂等难题也成为信 ...

  2. [日常] nginx反代websocket

    去年的事 , 随便记记 ============================================================= 2017年11月6日 记录: 获取包的选择状态: d ...

  3. Nginx反代服务器进阶学习最佳配置实践指南

    转载自:https://www.bilibili.com/read/cv16150010?spm_id_from=333.999.0.0 0x00 编译实践 描述:在企业线上生产环境中推荐进行Ngin ...

  4. Nginx反代服务器基础配置实践案例

    转载自:https://www.bilibili.com/read/cv16149433?spm_id_from=333.999.0.0 方式1: 轮询 RR(默认轮询)每个请求按时间顺序逐一分配到不 ...

  5. Django Nginx反代 获取真实ip

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Andale Mono"; color: #28fe14; backgr ...

  6. Nginx反代,后端一个IP绑定多个SSL证书,导致连接失败之解决方法:HTTPS和SNI扩展

    默认:SSL协议进行握手协商进行连接的时候,默认是不会发送主机名的,也就是是以IP的形式来进行https连接握手协商的,这就导致一个问题,当一台服务器上有多个虚拟主机使用同一个IP的时候, Nginx ...

  7. nginx反代及后端web配置

    一.反代配置,proxy_pass指向的upstream需要在反代的nginx.conf中配置 server {access_log /home/nginx/front_access.log;erro ...

  8. Nginx反代MogileFS集群

    上一篇博文我们主要聊了下分布式文件系统MogileFS的组件以及部署使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13677279.html:今天我们主要 ...

  9. Nginx反代至Tomcat基于memcached的session保持

    实现功能:基于前面tomcat基础简介与示例文章 (1) tomcat cluster将会话保存至memcached中:实现模型: 这里写图片描述 配置B,C主机安装openjdk与tomcat[本次 ...

随机推荐

  1. tomcat日志清理

    删除指定IP的日志后,删除自身 import os import time import sys ip="127.0.0.1" logpath="/var/lib/tom ...

  2. 为什么要学习微信小程序直播开发?最新的小程序直播介绍和优势分析!

    小程序直播的介绍 “小程序直播”是微信提供给开发者的实时视频直播工具,包括直播管理端.主播端和观众端等模块,支持提供常用的用户互动和营销促销工具. 开发者只需在小程序中引入相关代码并在管理后台完成配置 ...

  3. Spring Cloud 学习 之 Spring Cloud Eureka(源码分析)

    Spring Cloud 学习 之 Spring Cloud Eureka(源码分析) Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 ...

  4. Day_09【常用API】扩展案例7_验证QQ号是否正确

    需求说明 请用户输入一个"QQ号码",我们来判断这个QQ号码是否正确 要求:使用方法来完成判断功能 验证规则: 1)必须是5-12位数字: 2)首位不能是0: package co ...

  5. (1)从通信中的MCS含义开始讲起

    通信中的MCS:Modulation and Coding Scheme,意思为调制编码方案/调制编码策略,其内涵可分为两个部分:Modulation  和  Coding. 在基带的信号处理流程中, ...

  6. Java 将鼠标改为图片的两种方法

    一 图片跟着鼠标移动,鼠标隐藏 int x,y; addMouseMotionListener(this);//设置鼠标监听 public void paint(Graphics g) {  g.dr ...

  7. JDBC02 加载JDBC驱动 建立连接

    JDBC(Java Database Connection)为Java开发者使用数据库提供了统一的编程接口 sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库,因此su ...

  8. 关于tez-ui的"All DAGs"和"Hive Queries"页面信息为空的问题解决过程

    近段时间发现公司的HDP大数据平台的tez-ui页面不能用了,页面显示为空,导致通过hive提交的sql不能方便地查找到Yarn上对应的applicationId,只能通过beeline的屏幕输出信息 ...

  9. c3p0 连接池配置数据源

    <!-- 配置数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledD ...

  10. spring中<context:property-placeholder/>一个坑

    <context:property-placeholder location="classpath:db.properties" ></context:prope ...