简介
Tomcat是免费的开源的轻量级Web应用服务器,在中小型系统或并发访问不多场景下被普遍使用
Tomcat始于Sun公司的Servlet参考实现项目Java Web Server
,由开发者James Duncan Davidson
主导
1999年项目被贡献给Apache软件基金会,与ASF现有项目JServ 合并,成为Apache顶级开源项目
企业主流版本为8.x 和 7.x
官网:https://tomcat.apache.org/
官网文档:https://tomcat.apache.org/tomcat-8.5-doc/
环境
主机名 | IP | 运行服务 |
---|---|---|
nginx | 172.25.254.100 | nginx |
tomcat1 | 172.25.254.11 | tomcat |
tomcat2 | 172.25.254.22 | tomcat |
配置
安装
# Java
[root@tomcat1 ~]#yum install java-1.8.0-openjdk.x86_64 -y
# 安装
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.107/src/apache-tomcat-9.0.107-src.tar.gz
# 解压
tar zxf apache-tomcat-9.0.107-src.tar.gz -C /usr/local/
# 重命名
mv apache-tomcat-9.0.107 tomcat
# 运行用户
useradd -s /sbin/nologin -M tomcat
# 文件权限
chown -R tomcat.tomcat /usr/local/tomcat/
# 运行Java
vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre_openjdk
# 启停脚本
vim /usr/bin/tomcat
#!/bin/bash
case $1 in
start)
/usr/local/tomcat/bin/startup.sh
;;
stop)
/usr/local/tomcat/bin/shutdown.sh
esac
chmod +x /usr/bin/tomcat
# systemd服务管理
vim /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/bin/tomcat start
ExecStop=/usr/bin/tomcat stop
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
# 启动
systemctl daemon-reload
systemctl enable --now tomcat
进行Tomcat服务启停时,不要脚本启停和systemd启停混用,有几率导致Tomcat启停失败(进程冲突)
ps -ef | grep tomcat :查找tomcat进程
kill -9 <PID> :杀死tomcat进程,使用其中一种方式启动
# 确认无误后,将文件传给tomcat2
scp -rp /usr/local/tomcat/ root@172.25.254.22:/usr/local/
scp -p /usr/bin/tomcat root@172.25.254.33:/usr/bin/
scp -p /lib/systemd/system/tomcat.service root@172.25.254.22:/lib/systemd/system/
---
[root@tomcat2 ~]# yum install java-1.8.0-openjdk.x86_64 -y
useradd -s /sbin/nologin -M tomcat
chown -R tomcat.tomcat /usr/local/tomcat/
systemctl daemon-reload
systemctl enable --now tomcat
应用
反向代理
# 测试页面,上传test.jsp文件
[root@tomcat1/2 ~]# mv test.jsp /usr/local/tomcat/webapps/ROOT/
[root@nginx ~]# yum install nginx -y
vim /etc/hosts
172.25.254.100 nginx-server.org
172.25.254.11 tomcat1.org
172.25.254.22 tomcat2.org
[root@nginx ~]# vim /etc/nginx/conf.d/vhosts.conf
server {
listen *:80;
server_name www.ooovooo.org;
root /data/web/html;
index index.html;
location ~ \.jsp$ {
proxy_pass http://172.25.254.11:8080;
}
}
systemctl enable --now nginx.service
# 浏览器访问nginx-server.org(windows需要有解析)
负载均衡
[root@nginx ~]# vim /etc/nginx/conf.d/vhosts.conf
upstream tomcat {
server 172.25.254.11:8080;
server 172.25.254.22:8080;
}
server {
listen *:80;
server_name www.ooovooo.org;
root /web/html/;
index index.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}
nginx -s reload
存在问题:刷新后会话断开,提交的数据消失
解决方法:使用hash $cookie_JSESSIONID算法
[root@Nginx ~]# vim /etc/nginx/conf.d/vhosts.conf
upstream tomcat {
server 172.25.254.11:8080;
server 172.25.254.22:8080;
hash $cookie_JSESSIONID;
}
server {
listen *:80;
server_name www.ooovooo.org;
root /web/html/;
index index.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}
nginx -s reload
存在问题:现在刷新不会导致数据丢失,但IP和会话不一致
解决方法:通过ip_hash算法
[root@Nginx ~]# vim /etc/nginx/conf.d/vhosts.conf
upstream tomcat {
server 172.25.254.22:8080;
server 172.25.254.33:8080;
ip_hash;
# hash $cookie_JSESSIONID;
}
server {
listen *:80;
server_name www.ooovooo.org;
root /web/html/;
index index.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}
nginx -s reload
以上问题只能解决掉一个,无法解决两个问题(同一配置无法使用不同算法)
session会话共享
msm项目地址:https://github.com/magro/memcached-session-manager
安装Memcached
# 安装Memcached
[root@tomcat1/2 ~]# yum install memcached -y
[root@tomcat1/2 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
[root@tomcat1/2 ~]# systemctl enable --now memcached
[root@tomcat1/2 ~]# netstat -antlupe | grep memcached
session
# 上传所有*.jar文件到tomcat服务器的/usr/local/tomcat/lib/中
# 配置会话共享
[root@tomcat1 ~]# vim /usr/local/tomcat/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.11:11211,n2:172.25.254.22:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
[root@Tomcat1 ~]# systemctl restart tomcat
[root@tomcat2 ~]# vim /usr/local/tomcat/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.11:11211,n2:172.25.254.22:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
[root@Tomcat2 ~]# systemctl restart tomcat
[root@nginx ~]# vim /etc/nginx/conf.d/vhosts.conf
upstream tomcat {
server 172.25.254.11:8080;
server 172.25.254.22:8080;
hash $cookie_JSESSIONID;
}
server {
listen *:80;
server_name www.ooovooo.org;
root /web/html/;
index index.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}
nginx -s reload
测试
浏览器访问:www.ooovooo.org
先提交上一些数据
场景模拟:突然停止正在访问的tomcat服务器,观察数据是否消失,会话是否一致
systemctl stop tomcat.service