Tomcat部署与Nginx整合实战

一、Tomcat安装部署

实验说明

本实验旨在掌握 Tomcat 的安装、启动、停止以及将其配置为系统服务的过程。

  • Tomcat:一个开源的 Java Servlet 容器,用于运行 Java Web 应用。
  • systemd:Linux 系统初始化系统,用于管理服务。
  • JRE:Java 运行时环境,Tomcat 运行必需。

1.下载安装包

bash 复制代码
[root@RS1 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.115.tar.gz

2.解压并移动到/usr/local

部署tomcat

bash 复制代码
[root@RS1 ~]# tar zxf apache-tomcat-9.0.115.tar.gz  -C /usr/local
[root@RS1 ~]# cd /usr/local/
[root@RS1 local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src  tomcat-9.0-doc

3.安装 Java 环境

bash 复制代码
[root@RS1 local]# yum install java-1.8.0-openjdk.x86_64 -y

4.启动tomcat

bash 复制代码
[root@RS1 local]# mv apache-tomcat-9.0.115/ tomcat
[root@RS1 local]# cd tomcat/
[root@RS1 tomcat]# ls
bin           conf             lib      logs    README.md      RUNNING.txt  webapps
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  RELEASE-NOTES  temp         work


[root@RS1 tomcat]# cd bin/
[root@RS1 bin]# ./startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@RS1 bin]# netstat -antlupe | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      0          139291     10372/java

5. 制作systemd服务脚本

bash 复制代码
[root@RS1 bin]# vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre
[root@RS1 bin]# vim /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target

[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

[root@RS1 bin]# useradd -s /sbin/nologin -M tomcat
[root@RS1 bin]# chown tomcat.tomcat /usr/local/tomcat/ -R
[root@RS1 bin]# systemctl daemon-reload
[root@RS1 bin]# systemctl enable --now tomcat.service
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /usr/lib/syst                             emd/system/tomcat.service.
[root@RS1 bin]# systemctl enable --now tomcat.service
[root@RS1 bin]# netstat -lntupae | grep java
tcp6       0      0 :::8080                 :::*                    LISTEN      1000                                    36621      4299/java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1000                                    35704      4299/java

测试

二、Nginx与tomcat的整合

实现 Nginx 作为反向代理,将 JSP 请求转发给 Tomcat 处理。

  • 反向代理:Nginx 接收客户端请求,转发给后端 Tomcat。
  • 负载均衡:将请求分发到多个 Tomcat 实例。

1.单体架构

bash 复制代码
[root@Nginx conf.d]# cd /usr/local/nginx/conf/conf.d/
[root@Nginx conf.d]# vim vhosts.conf
server {
    listen 80;
    server_name app.timinglee.org;
    location ~* \.jsp$ {
        proxy_pass http://172.25.254.10:8080;
    }
}

[root@RS1 ~]# cp test.jsp  /usr/local/tomcat/webapps/ROOT/
[root@RS1 ~]# scp test.jsp  root@172.25.254.20:/usr/local/tomcat/webapps/ROOT/

[root@Nginx conf.d]# nginx  -s reload


#在windows中设定app.timinglee.org的解析
#在浏览器中访问 app.timinglee.org/test.jsp

2.tomcat负载均衡

bash 复制代码
[root@Nginx conf.d]# vim vhosts.conf
upstream tomcat {
    hash $cookie_JSESSIONID;
    server 172.25.254.10:8080;
    server 172.25.254.20:8080;
}
server {
    listen  80;
    server_name app.timinglee.org;
    location ~* \.jsp$ {
        proxy_pass http://tomcat;
    }
}
[root@Nginx conf.d]# nginx  -s reload

#在windows浏览器中访问 app.timinglee.org/test.jsp
#在windows的另外一个浏览器中访问 app.timinglee.org/test.jsp

tomcat+memcache实现session会话零丢失

通过 Memcached 实现多个 Tomcat 实例间的 Session 共享,避免单点故障导致会话丢失。

  • Session 共享:多个应用服务器共享用户会话信息。

  • Memcached:高性能分布式内存对象缓存系统。

  • MSM(Memcached Session Manager):用于 Tomcat 的 Session 共享模块。

1.tomcat加载模块

bash 复制代码
[root@RS1 ~]# unzip jar.zip
[root@RS1 ~]# cd jar/
[root@RS1 jar]# cp * /usr/local/tomcat/lib/
[root@RS1 jar]# scp * root@172.25.254.20:/usr/local/tomcat/lib/

2.安装memcache

bash 复制代码
[root@RS1 ~]# dnf install memcached
[root@RS2 ~]# dnf install memcached -y

[root@RS1 ~]# vim /etc/sysconfig/memcached
[root@RS2 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"

[root@RS1 ~]# systemctl restart memcached.service
[root@RS2 ~]# systemctl restart memcached.service

[root@RS1 ~]# netstat -antluple | grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      988        142615     35756/memcached
tcp6       0      0 ::1:11211               :::*                    LISTEN      988        142616     35756/memcached
[root@RS2 ~]# netstat -antluple | grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      988        142615     35756/memcached
tcp6       0      0 ::1:11211               :::*                    LISTEN      988        142616     35756/memcached

3.配置tomcat

bash 复制代码
[root@RS1 ]#  vim /usr/local/tomcat/conf/context.xml

<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
    failoverNodes="n1"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />

</Context>

[root@RS2 ]#  vim /usr/local/tomcat/conf/context.xml

<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
    failoverNodes="n2"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />

</Context>
[root@RS1 ~]#  systemctl restart tomcat.service
[root@RS2 ~]#  systemctl restart tomcat.service

在浏览器测试,输入信息

bash 复制代码
#关闭10上的tomcat
[root@RS1 lib]# systemctl stop tomcat.service

刷新浏览器,此时切到了20上,可以读取到之前的会话信息

相关推荐
wdfk_prog37 分钟前
Wi-Fi Direct 教程 05:control socket 与 eloop——P2P_FIND 怎样进入 wpa_supplicant 命令解析器
运维·服务器·后端·网络协议·ubuntu·p2p·wifi-direct
Golden_Chen37 分钟前
在 Ubuntu 上搭建 FTP 服务器
linux·运维·服务器
谢亮_vipxieliang38 分钟前
一套 Compose 搭起完整开发环境:MySQL + Redis + Nginx
redis·mysql·nginx·docker
xbzb1 小时前
Nginx 反向代理总 404?Location 匹配与 proxy_pass 尾斜杠避坑手册
linux·运维·nginx·虚拟主机
Elastic 中国社区官方博客1 小时前
14 个 alerts,1 个 incident:使用 Elasticsearch 中的 ES|QL 衡量 alerting rule 噪声
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索
Lsetea1 小时前
OpenSSL报permitted subtree violation:证书SAN与CA名称约束排查
运维·https·ssl证书·openssl·证书链
ShayneLee81 小时前
Nginx只开一个端口!能做什么?(一)
运维·nginx
万联WANFLOW1 小时前
Docker Hub 镜像拉取慢、timeout 的排查方法
运维·docker·云原生·容器·eureka
天衍四九-1 小时前
Docker Compose企业实战系列(一):LNMP环境一键部署(Nginx\+MySQL\+PHP)
mysql·nginx·docker
Julien20041 小时前
CGroups 资源控制组
linux·运维·服务器·ssh·学习方法