Web项目
基于传统 Tomcat + Servlet 的查询物联网卡的 Web 项目
封装基类
打包方式1
使用 IDE(IntelliJ IDEA)打包 WAR
- 打开项目 →
File > Project Structure > Artifacts
- 点击
+
→Web Application: Exploded
或Web Application: WAR
- 直接从当前项目打包,不从空项目。
- 选择输出目录
- 点击 Build > Build Artifacts > Build
- 生成 WAR 文件在指定输出目录
部署
部署到 Tomcat
1、复制 WAR 文件到 Tomcat 的 webapps
目录:
cp myapp.war /usr/local/tomcat9/webapps/
2、启动 Tomcat(如果已经启动,Tomcat 会自动解压并部署 WAR):
systemctl start tomcat
3、访问:
http://服务器IP:8080/myapp/
安装Tomcat
配置Java环境
Tomcat 需要 JDK 环境(至少 JDK 8,推荐 JDK 11 或以上)。
# 查看是否已安装 JDK
java -version
# 如果没有安装 JDK 8,可以执行:
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
java -version
下载 Tomcat
比如下载 Tomcat 9:
cd /usr/local/
解压安装
tar -zxvf apache-tomcat-9.0.94.tar.gz
mv apache-tomcat-9.0.94 tomcat9
配置环境变量(可选)
编辑配置文件:
export JAVA_HOME=/usr/local/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export CATALINA_HOME=/usr/local/tomcat9
export PATH=$PATH:$CATALINE_HOME/bin
vim /etc/profile
在文件最后添加:
export CATALINA_HOME=/usr/local/tomcat9
export PATH=$PATH:$CATALINA_HOME/bin
保存退出后:
source /etc/profile
启动 Tomcat
cd /usr/local/tomcat9/bin
./startup.sh
如果启动成功,会看到类似:
Tomcat started.
日志查看:
tail -f /usr/local/tomcat9/logs/catalina.out
防火墙放行
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
访问
部署 Web 项目
将打好的 xxx.war
放到:
/usr/local/tomcat9/webapps/
Tomcat 会自动解压 xxx.war
http://服务器IP:8080/xxx
后台运行
Tomcat 默认是前台运行的,可以用 nohup
或 systemd
创建Tomcat用户
如果你希望用专用用户启动 Tomcat(推荐):
# 创建用户和用户组
groupadd tomcat
useradd -r -g tomcat -d /usr/local/tomcat9 -s /sbin/nologin tomcat
# 给 tomcat 目录赋权
chown -R tomcat:tomcat /usr/local/tomcat9
-r 创建系统用户,-s /sbin/nologin 表示不能登录,只能用于运行服务。
systemctl daemon-reload
systemctl start tomcat
systemctl status tomcat
用 root 启动(不推荐生产环境)
如果你暂时测试,可以去掉 User 和 Group:
nohup 方式:
cd /usr/local/tomcat9/bin
nohup ./startup.sh &
systemd 服务方式:
新建服务文件:
vim /etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat 9
After=network.target
[Service]
Type=simple
# 设置环境变量
Environment="JAVA_HOME=/usr/local/jdk1.8"
Environment="CATALINA_HOME=/usr/local/tomcat9"
Environment="CATALINA_BASE=/usr/local/tomcat9"
Environment="CATALINA_PID=/usr/local/tomcat9/temp/tomcat.pid"
# 使用 catalina.sh run 前台运行
ExecStart=/usr/local/tomcat9/bin/catalina.sh run
ExecStop=/usr/local/tomcat9/bin/catalina.sh stop
# 自动重启
Restart=on-failure
RestartSec=10
# 使用 tomcat 用户
User=tomcat
Group=tomcat
# 设置工作目录
WorkingDirectory=/usr/local/tomcat9
[Install]
WantedBy=multi-user.target
保存后执行
systemctl daemon-reexec
systemctl daemon-reload
systemctl enable tomcat
systemctl restart tomcat
systemctl status tomcat
配置Tomcat
修改端口号
默认是 8080
,如果被占用或者需要修改:
编辑:
vim /usr/local/tomcat9/conf/server.xml
找到:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
把 8080
改为你想要的端口,例如 8081
。
改完重启:
systemctl restart tomcat
配置Tomcat内存
线程数:Tomcat 默认线程可能不足,导致请求排队。可以在 server.xml 中增加
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="200" minSpareThreads="50"
connectionTimeout="20000"
redirectPort="8443" />
配置JVM内存
JVM 内存:如果内存不足,可能频繁 GC。可以在 catalina.sh 或 setenv.sh 设置:
export CATALINA_OPTS="-Xms512m -Xmx2g -XX:+UseG1GC"
-
进入
bin
目录:cd /usr/local/tomcat9/bin
-
新建文件:
vi setenv.sh
-
写入 JVM 参数(例如内存配置):
export CATALINA_OPTS="-Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseG1GC"
-
保存后赋执行权限:
chmod +x setenv.sh
-
重启 Tomcat:
systemctl restart tomcat
或者
./shutdown.sh
./startup.sh
⚠️ 注意:
setenv.sh
必须放在bin
目录下,Tomcat 启动脚本会自动检测并加载。- 如果是 Windows,文件名对应的是
setenv.bat
。
要不要我帮你写一个适合 你服务器内存大小 的 setenv.sh
示例
查看JVM内存
export CATALINA_OPTS="-Xms512m -Xmx2g -XX:+UseG1GC"
-Xms:JVM 初始内存
-Xmx:JVM 最大内存
-Xmn:年轻代内存
-XX:+UseG1GC:垃圾回收策略
可以通过查看启动脚本确认:
ps aux | grep java
使用 jstat 查看运行时内存
假设你的 Tomcat PID 是 12345:
jstat -gc 12345 1000
会输出 Eden、Survivor、Old、Perm/Metaspace 等区的使用情况
1000 表示每 1 秒刷新一次
EC/EU:Eden 区容量/已用
OC/OU:老年代容量/已用
MC/MU:Metaspace 容量/已用
YGC/FGC:年轻代/老年代 GC 次数
GCT:总 GC 时间
使用 jconsole 或 VisualVM
图形化工具,可以直接连接到 JVM:
jconsole:随 JDK 自带,输入 PID 或远程连接地址
VisualVM:监控内存、线程、GC、CPU 使用
📌 优点:直观显示堆、非堆内存、垃圾回收情况
在应用中打印内存使用
在 Java 代码中可以直接打印:
Runtime runtime = Runtime.getRuntime();
System.out.println("最大内存: " + runtime.maxMemory()/1024/1024 + "MB");
System.out.println("已分配内存: " + runtime.totalMemory()/1024/1024 + "MB");
System.out.println("空闲内存: " + runtime.freeMemory()/1024/1024 + "MB");
maxMemory():JVM 最大能用内存
totalMemory():当前已向系统申请的内存
freeMemory():当前可用内存