JAVA应用服务器Tomcat管理和负载均衡

目录

在同一个主机上区分多个网页的方案

 在一个tomcat 里做多个网页

          Context 配置

 实站案例: 部署基于JAVA的博客系统 JPress

          实战案例: 部署基于JAR包的博客系统Halo 

          查看tomcat默认管理页面文件 (操作信息上面有)

 tomcat管理页面三个·按钮

         tomcat有3个端口正常8080,开发漏洞8009,8005停服

         显示指定的http服务器版本信息

 会话保持方式

Nginx 实现后端 tomcat 的负载均衡调度

        实战案例: 实现 Tomcat Session 集群

 Memcached

NoSQL介绍

[root@ubuntu2004 ~]#apt install memcached   (一条命令安装)

用法 Memcached

实战案例 1 : tomcat和memcached集成在一台主机 

 用python3 的测试脚本

 非粘制模式    (前两次有热身)

实战案例: redis 实现 non-sticky 模式的msm


[root@ubuntu2004 ROOT]#rm -rf /usr/local/tomcat/work/*   #java下所有缓存文件

tomcat有3个端口正常8080;开发漏洞8009,8005停服 (普通也能)

 在一个tomcat 里做多个网页

指定网站

[root@ubuntu2004 conf]#vim /usr/local/apache-tomcat-9.0.65/conf/server.xml    

在最后面加上两个网页跳转的

  </Host>
      <Host name="www.a.com"  appBase="/data/site_a" unpackWARs="true" autoDeploy="true"/>
   

 <Host name="www.b.com"  appBase="/data/site_p" unpackWARs="true" autoDeploy="true"/>
 </Engine>
  </Service>
</Server>

在最后面加上两个网页跳转的 </Host>开头</Host>结尾, </Host>结尾则文件后面为>

tomcat和nginx 不一样 

nginx是指定文件递归样式一级级的

tomcat是兄弟样式哪怕指定文件路径也是默认访问里面的ROOT(大写)你可以在文件里创建ROOT其里面创建需要访问的index.jsp,或者在指定ROOT所在的文件里傍边创建可以被服务器指定访问的文件

  Context 配置 路径映射

Context作用:

  • 路径映射:将url映射至指定任意指定路径,

用法: 

映射指定路径 
<Context path="/test" docBase="/data/test" reloadable="true" />
#映射站点的根目录
<Context path="/" docBase="/data/website" reloadable="true" />
#还可以添加日志等独立的配置
<Context path="/test" docBase="/data/test" reloadable="true" >
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_test_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Context>

列:如

在谁下面则访问那个地址下的/app-vs2就会跳转,跳转不需跳转到的界面有ROOT

</Host>
      <Host name="www.a.com"  appBase="/data/site_a" unpackWARs="true" autoDeploy="true">  
 <Context path="/app-vs2" docBase="/opt/site_a/app2" reloadable="true"/>
        </Host>
      <Host name="www.b.com"  appBase="/data/site_p" unpackWARs="true" autoDeploy="true">
        </Host>
 </Engine>
  </Service>

  <Host name="www.a.com" appBase="/data/site_a" unpackWARs="true" autoDeploy="true">

 name访问文件名, appBase,目录文件名,unpackWARs="true" 自动解包,autoDeploy="true"自动部署(就是你在互联网上可以直接访问)

 

实站案例: 部署基于JAVA的博客系统 JPress

 mkdir /data/jpress/ROOT -p     #创建

mv jpress-v4.2.0.war ROOT.war  #把文件拉过来该起名,这样解压的时候文件就自动解压成ROOT类型的格式了,后续访问的时候就不需要指定路径了

chown -R tomcat. /data/jpress/   #授权

[root@ubuntu2004 ]#vim /usr/local/apache-tomcat-9.0.65/conf/server.xml   #在其最后加上转换 

 </Host>
      <Host name="jpress.wei.com" appBase="/data/jpress/" unpackWARs="true" autoDeploy="true">
      </Host>

mysql> create user jpress@'127.0.0.1' identified by '123456';   #创建,授权
mysql> grant all on jpress.* to jpress@'127.0.0.1';  #本机授权也要指明ip

mysql>create database jpress;  #数据库

vim /etc/mysql/mysql.conf.d/mysqld.cnf

 [mysqld]
default_authentication_plugin=mysql_native_password      #支持老版本

 访问的的话需要在后面加8080端口,如何不加端口号?  3种方法 

在tomcat的文件夹里把端口号改成80默认,因为普通用户只能访问1023端口以上,可以把tomcat身份改成以root身份运行,但是太危险 (vim /lib/systemd/system/tomcat.servier)     # root 启动 修改tomcat。server.xml

  • 或者内置规则访问80 转到8080    #监听是8080
  • iptables -t nat -A PREROUTING -d 10.0.0.101 -p tcp --dport 80 -j REDIRECT --to-ports 8080    

3.nginx转发

 [root@ubuntu2004 ~]#cat /etc/nginx/sites-enabled/jpress.conf  #在里面做个跳转
server {
    listen 80;
    server_name jpress.wei.org;
    location / {
        proxy_pass http://jpress.wei.org:8080;
  }    
}

[root@ubuntu2004 ~]#cat /etc/hosts        #和在这里面做个地址解析(因为上面的是域名)
127.0.0.1 jpress.wei.org
 

 这样就可以不做hosts解析了

[root@ubuntu2004 ~]#cat /etc/nginx/sites-enabled/jpress.conf 
server {
    listen 80;
    server_name jpress.wei.org;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header host $http_host;   
  }    

实战案例: 部署基于JAR包的博客系统Halo 

https://docs.halo.run/   #官方  最新版仅支持java11的

安装java11 和tomcat 

在网上把Halo拉下来

curl -L https://github.com/halo-dev/halo/releases/download/v1.5.4/halo-1.5.4.jar --output halo.jar

[root@ubuntu2004 ~]#java -jar halo.jar  --server.port=80   #直接把他跑起来,有专有命令默认支持80
完成

因为是前台运行所以最好执行指条命令,就可以转后台运行·不退出 

nohup java -jar halo.jar  --server.port=80  &> /dev/null &

文件在cd .halo/下,也是自带数据库,好迁移

查看tomcat默认管理页面文件 (操作信息上面有)

tomcat管理页面三个·按钮

 [root@ubuntu2004 conf]#vim /usr/local/tomcat/conf/tomcat-users.xml

#在文件的最后加上他,且指定密码

<role rolename="manager-gui"/>
<user username="tomcat" password="123456" roles="manager-gui"/>
</tomcat-users>

[root@ubuntu2004 tomcat]#vim  webapps/manager/META-INF/context.xml 

#文件默认只允许本机访问,在下面|10\.0\.0\.\d+增加这行默认10.0网段的可访问d+(任意数)

 <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />

在linux上打开查看相关数值

 [root@ubuntu2004 tomcat]#curl http://tomcat:123456@10.0.0.100:8080/manager/status

#一个账号三个都可以访问 (前两个一个账号)

  [root@ubuntu2004}#vim /usr/local/tomcat/conf/tomcat-users.xml 

 <role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>
</tomcat-users>

[root@ubuntu2004 tomcat]#vim webapps/host-manager/META-INF/context.xml

#和上面个文件夹不是同一个目录,可以yong<!-- 这样注释

tomcat有3个端口正常8080,开发漏洞8009,8005停服

(8005只有停服用,不能起,普通用户也能)   

httpd 协议有8009 默认关了,因为·有问题开发漏洞 8.5.51之前

[root@ubuntu2004]#vim /usr/local/tomcat/conf/server.xml #在这里面吧8005改成-1 别的不行

<Server port="-1" shutdown="SHUTDOWN">

打包jar

[root@ubuntu2004 ROOT]#jar cvf /root/hello.war *    #将当前所有文件的目录打包到首页叫hello.

把hello 移到webapps下系统会自动解析,访问可以http://10.0.0.101:8080/hello/index.jsp

显示指定的http服务器版本信息

认不显示tomcat的http的Server头信息, 可以指定tomcat的http的Server头信息为相应的值

#conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" Server="SOME STRING"/

范例:

[root@centos8 ~]#curl -I 127.0.0.1:8080
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 17 Jul 2020 08:32:52 GMT

#修改配置,指定想显示的tomcat版本
[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
......
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" Server="WangServer"/>
 


[root@centos8 ~]#systemctl restart tomcat
[root@centos8 ~]#curl 127.0.0.1:8080 -I
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 17 Jul 2020 08:34:17 GMT
Server: WangServer 

 会话保持方式

Session sticky 会话黏性

1 Session绑定
nginx:source ip, cookie
HAProxy:source ip, cookie
优点:简单易配置
缺点:如果目标服务器故障后,如果没有做sessoin持久化,就会丢失session,此方式生产很少使用

2 Session 复制集群
Tomcat自己的提供的多播集群,通过多播将任何一台的session同步到其它节点。
缺点
Tomcat的同步节点不宜过多,互相即时通信同步session需要太多带宽
每一台都拥有全部session,内存损耗太多

3 Session Server  加服务器
session 共享服务器,使用memcached、redis做共享的Session服务器,此为推荐方式

Nginx 实现后端 tomcat 的负载均衡调度实现 会话绑定

#ip_hash;                 # 先禁用看看轮询,之后开启开黏性,取客户端的ip的前24未做Hash
#haremote_abbr;     #  取客户端的ip的前32未做Hash

#hash $cookie_jserssionid consistent;         #先禁用看看轮回,之后开启开粘性

https 加密挑转

实战案例: 实现 Tomcat Session 集群

1

[root@ubuntu2004 ROOT]#tcpdump -i eth0 -nn host 228.0.0.4     #两个都要 

vim /usr/local/tomcat/conf/server.xml     #在域名解析文件下面加上下面一大段,

里面IP号 广播号改一下       jdk11有问题,最好别用

  </Host>
      <Host name="www.wei.org" appBase="/data/website/" unpackWARs="true" autoDeploy="true">
     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="10.0.0.101"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

官方文档:  按版本来加(在官方文档里)

https://tomcat.apache.org/tomcat-10.0-doc/cluster-howto.html
https://tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html
https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html
http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.htm       #(7里面有错少\最后)

2 [root@ubuntu2004 ROOT]#  cp /usr/local/tomcat/webapps/ROOT/WEB-INF/ . -r     

3 #将这个文件考到 /data/website/所创建文件的最里面

 </description>
<distributable/>          #在最里面把这行加上   两个都要

</web-app>

4  scp -r WEB-INF/ 10.0.0.101:/data/website/ROOT/     拷到另一台机器上相同的位置

5  chown -R tomcat. /data/website/       #两个给其属性

 

 

 Memcached 是什么

Memcached 是一个开源的,高性能的内存绶存软件,从名称上看Mem 就是内存的意思, 而Cache 就是缓存的意思。Memcached 的作用: 通过在事先规划好的内存空间中临时绶存数据库中的各类数据,以达到减少业务对数据库的直接高并发访问, 从而达到提升数据库的访问性能,加速网站集群动态应用服务的能力。

Memcached 和 Redis 比较

建议最少占用内存的4/1以上,最好占用2/1以上

NoSQL介绍

NoSQL是对 Not Only SQL、非传统关系型数据库的统称。
NoSQL 分类
Key-value Store k/v数据库

  • 性能好 O(1) , 如: redis、memcached

Document Store 文档数据库

  • mongodb、CouchDB

Column Store 列存数据库,Column-Oriented DB

  • HBase、Cassandra,大数据领域应用广泛

Graph DB 图数据库

  • Neo4j

Time Series 时序数据库

  • InfluxDB、Prometheu

Memcahed 单机性能强·一台比Redis6个 小 

 

 固定空间存放,一个格就一个东西,可定时清理,懒惰是清理,LRU(内存喜新厌旧算法)

 不指就是默认空间大小,倍数增长

 [root@centos8 ~]#memcached -u memcached -f 2 -vv   
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 192 perslab 5461
slab class 3: chunk size 384 perslab 2730
slab class 4: chunk size 768 perslab 1365
slab class 5: chunk size 1536 perslab 682
slab class 6: chunk size 3072 perslab 341
slab class 7: chunk size 6144 perslab 170
slab class 8: chunk size 12288 perslab 85
slab class 9: chunk size 24576 perslab 42
slab class 10: chunk size 49152 perslab 21
slab class 11: chunk size 98304 perslab 10
slab class 12: chunk size 196608 perslab 5
slab class 13: chunk size 524288 perslab 2
<27 server listening (auto-negotiate)
<28 server listening (auto-negotiate

[root@ubuntu2004 ~]#apt install memcached   (一条命令安装)

用法 Memcached

[root@ubuntu2004 ~]#vim /etc/memcached.conf   可以在配置文件里把内存,默认端口改了

[root@ubuntu2004 ~]#telnet 10.0.0.103 11211     #mencahed 没有客户端工具,访问联

#加
add mykey 1 60 4   #4是字节  0是永久有效
test
STORED

#查
get mykey
VALUE mykey 1 4
test
END


set mykey 1 60 5
test1
STORED
get mykey
VALUE mykey 1 5
test1
END

#删除
delete mykey
DELETED
get mykey
END

#清空
flush_all
OK
get mykey
END
quit 

实战案例 1 : tomcat和memcached集成在一台主机 

粘智模式 a的备份在d。。d的备份在a

[root@ubuntu2004 conf]#cd /usr/local/tomcat/lib/  #现在这里面导入一堆包 官方有,在01.02上

#安装配置Memcache
[root@ubuntu2004 ~]#apt -y install memcached 
[root@ubuntu2004 ~]#vim /etc/memcached.conf 
-m 1024
-l 0.0.0.0
[root@ubuntu2004 ~]#systemctl restart memcached.service 
[root@ubuntu2004 ~]#ss -ntlp
State          Recv-Q         Send-Q                   Local Address:Port                    Peer Address:Port         Process                                            
LISTEN         0              1024                           0.0.0.0:11211                        0.0.0.0:*             users:(("memcached",pid=5347,fd=26))              
LISTEN         0              4096                     127.0.0.53%lo:53                           0.0.0.0:*             users:(("systemd-resolve",pid=740,fd=13))         
LISTEN         0              128                            0.0.0.0:22                           0.0.0.0:*             users:(("sshd",pid=773,fd=3))                     
LISTEN         0              128                               [::]:22                              [::]:*             users:(("sshd",pid=773,fd=4))

#配置Tomcat服务器101          #在最后的文件里加上进去,  ipfailoverNodes=代表谁为备
[root@ubuntu2004 ~]#vim /usr/local/tomcat/conf/context.xml 
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:10.0.0.101:11211,n2:10.0.0.102:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

#配置Tomcat服务器102      #就把 failoverNodes=n2  这里不一样
[root@ubuntu2004 ~]#vim /usr/local/tomcat/conf/context.xml 
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
             memcachedNodes="n1:10.0.0.204:11211,n2:10.0.0.205:11211"
             failoverNodes="n2"
             requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"         transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

 重启后查看日志是否正常

 [root@ubuntu2004 tomcat]#tail  /usr/local/tomcat/logs/catalina.2022-09-25.log 
- sticky: true
- operation timeout: 1000
- node ids: [n2]
- failover node ids: [n1]
- storage key prefix: null
- locking mode: null (expiration: 5s)

 用python3 的测试脚本


#!/usr/bin/python3
import memcache # pip install python-memcached
mc = memcache.Client(['10.0.0.101:11211','10.0.0.102:11211'], debug=True)
#print('-' * 30)
# 查看全部key
for x in mc.get_stats('items'):  # stats items 返回 items:5:number 1
    print(x)
print('-' * 30)

for x in mc.get_stats('cachedump 5 0'):
    print(x)

 非粘制模式    (前两次有热身)

[root@ubuntu2004]#vim /usr/local/apache-tomcat-9.0.65/conf/context.xml   #1和2都改最后里

 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
             memcachedNodes="n1:10.0.0.101:11211,n2:10.0.0.102:11211"
             sticky="false"
             sessionBackupAsync="false"
             lockingMode="uriPattern:/path1|/path2"
             requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
             transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

[root@ubuntu2004 conf]#systemctl restart memcached.service  重启

实战案例: redis 实现 non-sticky 模式的msm

[root@ubuntu2004 ~]#apt install redis

[root@ubuntu2004 ~]#vim /etc//redis/redis.conf 

 #在里面把默认端口改成0.0.0.0 !注释掉没用 ,显示0.0.0.0 该跳还是跳
[root@ubuntu2004 ~]#systemctl restart redis
[root@ubuntu2004]#vim /usr/local/apache-tomcat-9.0.65/conf/context.xml   #1和2都改最后里


      <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
             memcachedNodes="redis://10.0.0.104"
             sticky="false"
             sessionBackupAsync="false"
             lockingMode="uriPattern:/path1|/path2"
             requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
             transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

 [root@ubuntu2004 lib]#systemctl restart memcached.service

检验

[root@ubuntu2004 ~]# redis-cli 
127.0.0.1:6379> KEYS *
1) "CA8455D179A6BFBC8E84662958694645"
2) "validity:CA8455D179A6BFBC8E84662958694645"
127.0.0.1:6379> get "CA8455D179A6BFBC8E84662958694645"
"\x00\x02\x00T\x00\x00\x01\x83p\xda\xea\xe6\x00\x00\x01\x83p\xda\xea\xe6\x00\x00\a\b11\x00\x00\x01\x83p\xda\xea\xe6\x00\x00\x01\x83p\xda\xea\xe7\x00 CA8455D179A6BFBC8E84662958694645\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00"
127.0.0.1:6379> 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值