Web服务器Tomcat解析

发布于:2025-08-14 ⋅ 阅读:(12) ⋅ 点赞:(0)

简介

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

网站公告

今日签到

点亮在社区的每一天
去签到