目录
tomcat有3个端口正常8080,开发漏洞8009,8005停服
[root@ubuntu2004 ~]#apt install memcached (一条命令安装)
实战案例 1 : tomcat和memcached集成在一台主机
实战案例: 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 "%r" %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>