第7章 Tomcat基础
https://www.processon.com/view/link/6657da380093d90a5165c076?cid=6657d08a3b80da56bfbdcc82
Tomcat介绍
什么是Tomcat
Tomcat 是一款由 Apache 软件基金会开发的开源 Java Web 应用服务器,属于 Jakarta 项目中的一个核心组件。它最初由 Sun Microsystems、Apache 以及其他公司和个人合作开发,旨在提供一个免费、稳定的平台来部署和运行 Java Web 应用程序。以下是 Tomcat 的几个关键特点和功能:
1. **支持Java Web标准**:Tomcat 支持最新的 Servlet 和 JavaServer Pages (JSP) 规范,使得开发者能够基于这些技术构建动态网页和Web服务。例如,它支持Servlet 2.4 和 JSP 2.0 规范(具体版本随Tomcat版本更新而不同)。
2. **轻量级与高性能**:作为一款轻量级应用服务器,Tomcat 在资源消耗和启动速度上表现优秀,特别适合中小规模的应用场景和开发测试环境。
3. **Web 应用管理**:Tomcat 提供了一系列管理工具,允许用户轻松部署、启动、停止、重新加载和卸载 Web 应用程序,这些操作可以通过图形界面或者命令行工具完成。
4. **HTTP/HTTPS 协议支持**:它内置了对 HTTP 协议的支持,可以处理客户端的 HTTP 请求和响应,并且支持 HTTPS 加密连接,保障数据传输的安全性。
5. **可扩展性与模块化**:Tomcat 具有良好的可扩展性,支持多种插件和扩展模块,可以根据需要添加额外功能,如连接池、SSL 加密、日志记录等。
6. **跨平台**:由于 Tomcat 是基于 Java 构建的,因此可以在任何支持 Java 虚拟机(JVM)的操作系统上运行,包括 Windows、Linux、macOS 等。
7. **开源与社区支持**:作为开源软件,Tomcat 拥有活跃的开发者社区和丰富的在线资源,用户可以获取技术支持、插件和解决方案。
8. **易于部署**:部署 Web 应用非常简单,通常只需要将应用的WAR文件或者应用目录放置到Tomcat的webapps目录下即可自动部署。
综上所述,Tomcat 是一个成熟、稳定且广泛使用的 Java Web 应用服务器,特别适合那些寻求高效、低成本解决方案的开发团队和企业。
JVM/JRE/JDK的关系
1. **JVM (Java Virtual Machine)**:
- **作用**: JVM是Java平台的核心组成部分,它是一个抽象化的计算机,能够执行Java字节码。JVM为Java程序提供了一个跨平台运行的环境,通过将字节码转换为特定操作系统下的机器码来实现“一次编写,到处运行”的特性。
- **功能包括**:内存管理、垃圾回收、线程管理以及安全机制等。
2. **JRE (Java Runtime Environment)**:
- **包含内容**: JRE是运行Java程序所必需的环境集合,它包含了JVM以及Java类库、运行时库等,但不包含开发工具(如编译器)。
- **用途**: 如果用户仅需运行Java应用程序,而不需要进行开发工作,安装JRE就足够了。
3. **JDK (Java Development Kit)**:
- **包含内容**: JDK是面向开发者的完整工具包,它不仅包含了JRE(意味着也包含了JVM和运行时库),还包含了开发工具,比如Java编译器(javac)、打包工具(jar)、调试器(jdb)以及各种其他工具和文档。
- **用途**: 开发者使用JDK来编写、编译、调试和执行Java程序。它是进行Java开发的必备环境。
**三者之间的关系总结**:
+ **层次结构**: JDK > JRE > JVM。JDK是最全面的,包含了开发和运行Java程序所需的一切;JRE专注于运行已编译的Java程序;JVM是底层执行引擎,负责解释执行字节码。
+ **依赖关系**: JDK中包含了JRE,JRE中则包含了JVM。开发人员需要JDK来创建Java应用,最终用户只需JRE来运行这些应用。
+ **实际部署**: 在开发阶段,开发者主要与JDK打交道;应用程序发布后,最终用户计算机上只需安装JRE即可运行该程序。
什么是LNMP架构
LNMT 架构是一种流行的网络服务架构,由 Linux, Nginx, MySQL 和 Tomcat 四个主要组件组成。这种架构经常用于部署动态网站和应用程序。下面是这些组件的具体作用和它们如何协同工作:
名词解释:
**Linux**:
+ Linux 是整个架构的操作系统层。它是一个强大的开源操作系统,广泛用于服务器环境,因为它的稳定性、安全性和灵活性。Linux 提供了运行其他三个组件的平台。
**Nginx**:
+ Nginx 是一个高性能的HTTP和反向代理服务器,也可以作为负载均衡器和HTTP缓存。在 LNMT 架构中,Nginx 通常用来处理客户端的HTTP请求,通过其反向代理功能将请求转发到后端的Tomcat服务器。Nginx 以其高效的资源利用和能够处理大量并发连接而闻名。
**MySQL**:
+ MySQL 是一个流行的开源关系数据库管理系统,用于存储网站或应用程序的数据。在 LNMT 架构中,MySQL 负责数据存储和查询处理,为应用程序提供数据持久化的支持。
**Tomcat**:
+ Tomcat 是一个开源的Java Servlet 容器和Web服务器,它能够提供一个运行Java Web应用程序的环境。Tomcat 负责处理应用程序逻辑,执行由客户端(通过Nginx转发)发来的请求,并与 MySQL 数据库交互以获取或存储数据。
如何工作:
**请求处理流程**:
+ 客户端发送HTTP请求到服务器,首先被 Nginx 接收。
+ Nginx 根据配置作为反向代理,将请求转发到 Tomcat 服务器。
+ Tomcat 处理请求,执行必要的业务逻辑,可能会与 MySQL 数据库交互以查询或更新数据。
+ 处理完成后,Tomcat 将响应返回给 Nginx。
+ Nginx 最终将响应结果返回给客户端。
**性能优化**:
+ Nginx 可以配置为缓存静态资源和优化SSL终端,减轻后端Tomcat的负担。
+ Tomcat 可以优化Java虚拟机和连接池设置,提高处理效率。
LNMT 架构以其高性能、可靠性和易于扩展的特点,适用于需要处理高并发请求的大型动态Web应用。这种架构也支持高度自定义和优化,可以根据具体需求进行调整。
OpenJDK安装
版本选择
用的最多 1.8
比较新的 1.17
二进制安装
tar zxf jdk-8u351-linux-x64.tar.gz -C /opt/
ln -s /opt/jdk1.8.0_351 /opt/jdk
cp /etc/profile /etc/profile.bak
cat >> /etc/profile << 'EOF'
export JAVA_HOME=/opt/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$PATH:${JAVA_HOME}/bin
EOF
source /etc/profile
java -version
echo $JAVA_HOME
echo $JRE_HOME
rpm安装
rpm -ivh jdk-8u351-linux-x64.rpm
update-alternatives --config java
cp /etc/profile /etc/profile.bak
cat >> /etc/profile << 'EOF'
export JAVA_HOME=/usr/java/jdk1.8.0_351-amd64
export PATH=$PATH:$JAVA_HOME/bin
EOF
source /etc/profile
java -version
echo $JAVA_HOME
echo $JRE_HOME
yum安装
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
update-alternatives --config java
cp /etc/profile /etc/profile.bak
cat >> /etc/profile << 'EOF'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
EOF
source /etc/profile
java -version
echo $JAVA_HOME
echo $JRE_HOME
Tomcat安装
解压Tomcat
https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.86/bin/apache-tomcat-9.0.86.tar.gz
tar zxf apache-tomcat-9.0.86.tar.gz -C /opt/
mv /opt/apache-tomcat-9.0.86/ /opt/tomcat-9.0.86/
ln -s /opt/tomcat-9.0.86 /opt/tomcat
修改配置文件
关闭自动部署和自动解压
[root@web-7 ~]# cd /opt/tomcat
[root@web-7 /opt/tomcat]# ls
bin conf lib logs README.md RUNNING.txt webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
[root@web-7 /opt/tomcat]# cp conf/server.xml /opt/
[root@web-7 /opt/tomcat]# sed -i 's#unpackWARs="true" autoDeploy="true">#unpackWARs="false" autoDeploy="false">#g' conf/server.xml
[root@web-7 /opt/tomcat]# grep "unpackWARs" conf/server.xml
unpackWARs="false" autoDeploy="false">
创建普通用户
[root@web-7 ~]# groupadd -g 1000 www
[root@web-7 ~]# useradd -u 1000 -g 1000 -M -s /sbin/nologin www
[root@web-7 ~]# id www
uid=1000(www) gid=1000(www) groups=1000(www)
更改目录所属用户及用户组
[root@web-7 ~]# chown -R www:www /opt/tomcat*
[root@web-7 ~]# ll /opt/
total 8
-rw------- 1 root root 7856 May 22 09:50 server.xml
lrwxrwxrwx 1 www www 18 May 22 09:49 tomcat -> /opt/tomcat-9.0.86
drwxr-xr-x 9 www www 220 May 22 09:48 tomcat-9.0.86
编写启动文件
cat > /etc/systemd/system/tomcat.service << 'EOF'
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
Environment=JAVA_HOME=/opt/jdk # 注意替换为实际的jdk路径
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx512M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
User=www
Group=www
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
EOF
重要参数解释
### **CATALINA_OPTS**
这个环境变量提供了特定于Tomcat服务器本身的Java系统属性和JVM参数,它只影响Tomcat的JVM实例。
+ **-Xms512M**: 设置JVM启动时的堆初始大小(Heap Initial Size)为512兆字节。这是JVM开始运行时分配的内存量。
+ **-Xmx512M**: 设置JVM最大堆大小(Maximum Heap Size)为512兆字节。这是JVM能够使用的最大内存量。
+ **-server**: 告诉JVM使用服务器模式的JVM。服务器模式的JVM为长时间运行的进程优化,提高了性能,特别是在执行内存和CPU密集型操作时。
+ **-XX:+UseParallelGC**: 启用并行垃圾回收机制。这意味着垃圾回收将多个垃圾回收线程一起工作,减少停顿时间,提高性能。
### **JAVA_OPTS**
这个环境变量提供了更为广泛的JVM设置,可以影响Tomcat以及它所托管的应用程序和任何依赖的Java组件。
+ **-Djava.awt.headless=true**: 设置系统属性为无头模式。这在服务器环境中非常有用,意味着Java将不会尝试访问图形环境的功能(如显示器、键盘、鼠标),因此在没有图形用户界面的系统上运行GUI应用程序时不会出错。
+ **-Djava.security.egd=file:/dev/./urandom**: 设置Java的“Entropy Gathering Device”(随机数生成设备)。这个设置告诉JVM使用**/dev/urandom**作为随机数生成源,而不是默认的**/dev/random**,因为**/dev/random**可能会在熵不足时阻塞,而**/dev/urandom**不会。这通常用于提高在需要大量随机数时的性能,如TLS/SSL处理。
Tomcat主配置文件Server.xml详解
组件结构
<server>
<service>
<connector />
<engine>
<host>
<context></context>
</host>
<host>
<context></context>
</host>
</engine>
</service>
</server>
配置解释
<?xml version="1.0" encoding="UTF-8"?>
<!-- 版权和许可信息 -->
<!-- 注意:Server元素自身不是Container,因此不能直接定义如Valves之类的子组件 -->
<Server port="8005" shutdown="SHUTDOWN"> <!-- Tomcat服务器监听的shutdown端口为8005,使用"SHUTDOWN"命令可关闭 -->
<!-- 监听器,记录版本信息 -->
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- 安全监听器,用于安全相关的初始化操作,此处被注释掉 -->
<!--
<Listener className="org.apache.catalina.security.SecurityListener" />
-->
<!-- APR库加载器,用于启用Apache Portable Runtime,提升性能 -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!-- 开启SSL支持 -->
<!-- 防止特定Java/Javax API使用导致的内存泄漏 -->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<!-- 全局资源生命周期监听器 -->
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<!-- 防止ThreadLocal变量导致的内存泄漏 -->
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!-- 全局JNDI资源定义 -->
<GlobalNamingResources>
<!-- 用户数据库资源,可用于用户认证 -->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="可更新和保存的用户数据库"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!-- Service定义,包含一个或多个共享相同Container的Connectors -->
<Service name="Catalina">
<!-- 可以定义共享线程池,这里示例被注释 -->
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/>
-->
<!-- 非SSL HTTP/1.1连接器,监听8080端口 -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" <!-- 连接超时时间 -->
redirectPort="8443" <!-- SSL请求重定向端口 -->
maxParameterCount="1000" <!-- 最大参数数量 -->
/>
<!-- 示例使用共享线程池的连接器,注释状态 -->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
/>
-->
<!-- 示例SSL配置,未启用 -->
<!--
<Connector ... SSL相关配置 ...>
<SSLHostConfig>...</SSLHostConfig>
</Connector>
-->
<!-- 示例HTTP/2与SSL配置,同样被注释 -->
<!--
<Connector ... HTTP/2与SSL相关配置 ...>
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>...</SSLHostConfig>
</Connector>
-->
<!-- AJP 1.3连接器示例配置,注释状态 -->
<!--
<Connector protocol="AJP/1.3" address="::1" port="8009" redirectPort="8443" maxParameterCount="1000"/>
-->
<!-- Engine配置,处理所有请求的入口点 -->
<Engine name="Catalina" defaultHost="localhost">
<!-- 集群配置示例,未启用 -->
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
<!-- 使用LockOutRealm防止密码暴力破解 -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- 基于UserDatabaseRealm,使用JNDI资源中的UserDatabase -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!-- 主机配置,定义了名为localhost的虚拟主机 -->
<Host name="localhost" appBase="webapps"
unpackWARs="false" <!-- 是否解压WAR文件 -->
autoDeploy="false"> <!-- 是否自动部署 -->
<!-- 单点登录配置示例,未启用 -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- 访问日志配置 -->
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" /> <!-- 日志格式 -->
</Host>
</Engine>
</Service>
</Server>
MySQL数据库光速入门
什么是数据库
专门用来存放用户数据的软件,主要存放的是文本信息,而不是文件。例如帐号,密码,余额,订单信息等。
一般分为关系型数据库和非关系数据库,其中适用范围最广的关系型数据库就是MySQL。
相关概念
库
表
字段
主机
用户
版本选择
MySQL 5.7
MySQL 8.0
安装部署
yum安装mariadb
yum install mariadb-server -y
systemctl start mariadb
二进制安装MySQL
0.下载软件
[https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz](https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz)
1.解压并创建软链接
tar zxvf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz -C /opt/
cd /opt/
mv mysql-5.7.28-linux-glibc2.12-x86_64 mysql-5.7.28
ln -s mysql-5.7.28 mysql
2.配置环境变量
echo 'export PATH=$PATH:/opt/mysql/bin' >> /etc/profile
source /etc/profile
mysql -V
3.清理历史遗留环境
rpm -qa|grep mariadb
yum remove mariadb-libs -y
rm -rf /etc/my.cnf
4.安装mysql依赖包
yum install -y libaio-devel
5.创建mysql普通用户并授权
groupadd -g 2000 mysql
useradd -u 2000 -g 2000 -s /sbin/nologin -M mysql
mkdir -p /data/mysql_3306/
chown -R mysql.mysql /data/
chown -R mysql.mysql /opt/mysql*
6.初始化数据库(不用记)
mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql --datadir=/data/mysql_3306/
7.编辑mysql配置文件
cat> /etc/my.cnf <<EOF
[mysqld]
port=3306
user=mysql
basedir=/opt/mysql
datadir=/data/mysql_3306
EOF
8.准备启动脚本并启动数据库
cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
systemctl start mysqld
netstat -lntup|grep 3306
9.登录测试
mysql
连接数据库
连接本机
mysql -uroot -p123
连接远程服务器
mysql -uroot -p123 -h 10.0.0.51
用户管理
修改初始root密码
mysqladmin password
创建远程用户
grant all privileges on 库.表 to '用户名'@'10.0.0.%' identified by '密码';
grant all privileges on *.* to 'luffy'@'%' identified by '123';
查看当前用户
select user,host from mysql.user;
数据库和表管理
查看所有数据库
show databases;
创建数据库
create database luffy;
切换数据库
use luffy;
show tables;
查看某个库下的表
use luffy;
show tables;
或者
show tables from luffy;
查看数据内容
use 库名;
select * from 表名;
Tomcat部署网站
Zrlog介绍
准备数据库环境
创建root密码
创建数据库
部署zrlog代码
检查服务是否启动
浏览器访问测试
Tomcat高可用架构
Nginx+Tomcat实现动静分离
http \{
# 其他全局配置...
server \{
listen 80;
server_name example.com;
# 静态资源处理
location ~* \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ \{
root /path/to/your/static/files;
expires 30d; # 设置浏览器缓存30天
access_log off; # 关闭访问日志记录
\}
# 动态请求转发
location / \{
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
\}
\}
\}
Tomcat安全及优化
1. **JVM调优**:
- 分配适当的堆内存,通常设置 **-Xms** 和 **-Xmx** 为相同的值,以避免运行时动态扩展。
- 使用并行垃圾回收器,例如 **-XX:+UseParallelGC**。
2. **连接器优化**:
- 针对 **Connector** 标签的 **maxThreads** 和 **acceptCount** 属性进行调整,以处理并发请求。
- 使用NIO或NIO2连接器,以提高非阻塞操作的效率。
3. **会话管理**:
- 减少会话超时时间,以便更快释放资源。
- 对于不需要会话的应用,关闭会话管理。
4. **静态资源优化**:
- 启用静态资源的压缩,设置 **compression="on"**。
- 使用CDN或其他缓存策略优化内容的分发。
5. **应用部署**:
- 避免在同一Tomcat实例上部署过多应用。
- 使用并行部署特性减少停机时间。
更新: 2024-11-21 17:38:40