tomcat 搭建网站
主机名 | 服务 | 外网 | 内网 |
web01 | jdk tomcat | 10.0.0.7 | 172.16.1.7 |
db01 | mariadb | 10.0.0.51 | 172.16.1.51 |
- jdk tomcat版本选择
- jdk版本一般为1.8.0 x 或者1.8.5
- tomcat 9.0 8.5 8.0 7.x
jdk工具:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
工具包下载:https://pan.baidu.com/s/1ZF4K6rPP2CaH8ezKGBWriQ
提取码:nprd
[root@web01 /]# mkdir /server/tools #压缩包存放地址 [root@web01 /]# mkdir /application #安装地址也可以指定默认地址/usr/local [root@web01 /]# rpm -qa | grep java [root@web01 /server/tools]# ln -s /application/jdk1.8.0_60/ /application/jdk #创建软连接
java jdk 环境变量
#具体安装目录配置自定义 cat >>/etc/profile<<'EOF' export JAVA_HOME=/application/jdk export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar export TOMCAT_HOME=/application/tomcat EOF #让配置文件生效 [root@web01 /]# source /etc/profile #jdk环境准备完成 [root@web01 /]# java -version java version "1.8.0_60" Java(TM) SE Runtime Environment (build 1.8.0_60-b27) Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
参考:https://blog.csdn.net/qq_14898543/article/details/53939197
tomcat与nginx比较:
-
不同点:
-
如果客户端请求的是静态页面,则只需要Apache服务器响应请求。 如果客户端请求动态页面,则是Tomcat服务器响应请求。 因为JSP是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销。
wget -P /server/tools https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.55/bin/apache-tomcat-8.5.55.tar.gz
编译安装tomcat
[root@web01 /server/tools]# tar xf apache-tomcat-8.5.55.tar.gz -C /application/ [root@web01 /]# ln -s /application/apache-tomcat-8.5.55/ /application/tomcat [root@web01 /application/tomcat]# ll total 92 drwxr-xr-x 2 root root 4096 Dec 18 14:36 bin drwxr-xr-x 2 root root 182 Sep 28 2015 conf drwxr-xr-x 2 root root 4096 Dec 18 14:36 lib -rw-r--r-- 1 root root 57011 Sep 28 2015 LICENSE drwxr-xr-x 2 root root 6 Sep 28 2015 logs -rw-r--r-- 1 root root 1444 Sep 28 2015 NOTICE -rw-r--r-- 1 root root 6741 Sep 28 2015 RELEASE-NOTES -rw-r--r-- 1 root root 16204 Sep 28 2015 RUNNING.txt drwxr-xr-x 2 root root 30 Dec 18 14:36 temp drwxr-xr-x 7 root root 81 Sep 28 2015 webapps drwxr-xr-x 2 root root 6 Sep 28 2015 work #进行测试,tomcat和jdk是否可以共存 [root@web01 /]# /application/tomcat/bin/version.shUsing CATALINA_BASE: /application/tomcat Using CATALINA_HOME: /application/tomcat Using CATALINA_TMPDIR: /application/tomcat/temp Using JRE_HOME: /usr/java/jdk1.8.0_241-amd64/ Using CLASSPATH: /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-j Server version: Apache Tomcat/8.5.55 Server built: May 5 2020 22:10:54 UTC Server number: 8.5.55.0 OS Name: Linux OS Version: 3.10.0-957.el7.x86_64 Architecture: amd64 JVM Version: 1.8.0_60-b27 <-----jdk环境 JVM Vendor: Oracle Corporation
🍋目录 | 🍓文件 | 🍑作用 | |
tomcat/bin | 命令管理目录 | startup.sh | 开启服务 |
shutdown.sh | 关闭服务 | ||
version.sh | 测试tomcat与jdk连接 | ||
catalina.sh | tomcat核心脚本startup shutdown 都会调用这个脚本 | ||
tomcat/conf | 配置文件 | server.xml | nginx.conf 主配置文件 |
web.xml | 补充 额外功能 | ||
tomcat-user.xml | tomcat管理端配置文件 用户名 和 密码 | ||
tomcat/logs | 日志文件 | catalina.out | tomcat最全日志 查看 error startup 启动的时间 |
catalina.2019-12-16.log | catalina.out的切割日志 | ||
localhost_access_log.2019-12-16.txt | tomcat access.log 访问日志 | ||
webapps | 站点目录 | tomcat.jsp | 首页文件 |
lib | 库文件tomcat插件 |
[root@web01 ~]# /application/tomcat/bin/startup.sh #开启tomcat [root@web01 ~]# /application/tomcat/bin/shutdown.sh #关闭tomcat [root@web01 /application]# ss -lntup | grep java #查看端口,默认有8009,8080,8005 tcp LISTEN 0 100 :::8009 :::* users:(("java",pid=9250,fd=51)) tcp LISTEN 0 100 :::8080 :::* users:(("java",pid=9250,fd=46)) tcp LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=9250,fd=66))
[root@web01 /application/tomcat/conf]# cat tomcat-users.xml <?xml version='1.0' encoding='utf-8'?> <tomcat-users xmlns="http://tomcat.apache.org/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd" version="1.0"> <role rolename="admin-gui"/> <role rolename="manager-gui"/> <role rolename="host-gui"/> <user username="tomcat" password="tomcat" roles="admin-gui,manager-gui,host-gui"/> </tomcat-users> #最后一行user双引号内容更改,登录使用 user:tomcat password:tomcat [root@web01 /]# /application/tomcat/bin/shutdown.sh #重启一下 [root@web01 /]# /application/tomcat/bin/startup.sh
点击server status 输入用户名和密码
#java有时会出现端口没了,进程还在的尴尬现象
进行压力测试,web浏览器会显示数值
[root@web01 /]# yum -y install httpd-tools [root@web01 /]# ab -c 10 -n 99999 10.0.0.7:8080/ #斜杠一定要加上 This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 10.0.0.7 (be patient) Completed 9999 requests Completed 19998 requests Completed 29997 requests Completed 39996 requests Completed 49995 requests Completed 59994 requests Completed 69993 requests Completed 79992 requests Completed 89991 requests Completed 99990 requests Finished 99999 requests Server Software: Apache-Coyote/1.1 Server Hostname: 10.0.0.7 Server Port: 8080 Document Path: / Document Length: 11230 bytes Concurrency Level: 10 Time taken for tests: 20.088 seconds Complete requests: 99999 Failed requests: 0 Write errors: 0 Total transferred: 1137088629 bytes HTML transferred: 1122988770 bytes Requests per second: 4977.96 [#/sec] (mean) Time per request: 2.009 [ms] (mean) Time per request: 0.201 [ms] (mean, across all concurrent requests) Transfer rate: 55277.69 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 6 Processing: 0 2 2.3 1 56 Waiting: 0 2 2.2 1 56 Total: 1 2 2.3 1 56 Percentage of the requests served within a certain time (ms) 50% 1 66% 2 75% 2 80% 2 90% 3 95% 5 98% 13 99% 13 100% 56 (longest request)
#server.xml <Server port="8005" shutdown="SHUTDOWN"> ###tomcat shutdown端口 连接到8005这个端口 输入暗号SHUTDOWN tomcat关闭 因为比较危险所以只能127.0.0.1连接 <GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> #用户客户端 认证模式 用户名模式 <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> #用户管理配置文件 </GlobalNamingResources> #tomcat web端口 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> #tomcat与apache 连接使用的端口 如果不使用apache 则可以注释 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> #配置 tomcat 虚拟主机的内容 nginx tomcat Server_name Host name 域名 root appBase 站点目录 #自动解压,把压缩吧放在目录里就可以部署网站了 unpackWARs="true" #自动部署 autoDeploy="true" <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> #访问日志的格式 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" #prefix日志的前缀 #日志的后缀 pattern="%h %l %u %t "%r" %s %b" /> </Host>
环境准备 | 作用 |
web01 | tomcat |
db01 | 数据库 |
#将软件剪切到webapps下 ##没有解压是因为没有启动tomcat [root@web01 ~]# mv jpress.war /application/tomcat/webapps/ [root@web01 /]# ll /application/tomcat/webapps/ total 20320 drwxr-xr-x 14 root root 4096 Dec 18 20:27 docs drwxr-xr-x 6 root root 83 Dec 18 20:27 examples drwxr-xr-x 5 root root 87 Dec 18 20:27 host-manager drwxr-xr-x 7 root root 102 Dec 19 19:56 jpress -rw-r--r-- 1 root root 20797013 Mar 3 2017 jpress.war drwxr-xr-x 5 root root 103 Dec 18 20:27 manager drwxr-xr-x 3 root root 4096 Dec 18 20:27 ROOT
db01 安装数据库
[root@db01 ~]# yum install mariadb mariadb-server -y # mariadb-server 安装的mysql命令 [root@db01 ~]# systemctl start mariadb ; systemctl enable mariadb
创建tomcat数据库
#进入数据库 mysql MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec) #创建数据库 jpress MariaDB [(none)]> create database jpress charset utf8; Query OK, 1 row affected (0.00 sec) #字符编码设置为utf8 默认为拉丁文latin */ MariaDB [(none)]> show create database jpress; +----------+-----------------------------------------------------------------+ | Database | Create Database | +----------+-----------------------------------------------------------------+ | jpress | CREATE DATABASE `jpress` /*!40100 DEFAULT CHARACTER SET utf8 */ | +----------+-----------------------------------------------------------------+ 1 row in set (0.00 sec) ##grant 授权 添加用户 #指定主机连接 MariaDB [(none)]> grant all on jpress.*to 'jpress'@'172.16.1.7' identified by '123456'; Query OK, 0 rows affected (0.00 sec) #指定网段连接 MariaDB [(none)]> grant all on jpress.*to 'jpress'@'172.16.1.%' identified by '123456'; Query OK, 0 rows affected (0.00 sec) #本地连接 MariaDB [(none)]> grant all on jpress.*to 'jpress'@'localhost' identified by '123456'; Query OK, 0 rows affected (0.00 sec) #更新权限信息,在删除用户,修改用户信息使用 MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec) #所有权限在jpress数据库,中所有表 172.16.1.7 #精确172.16.1.% 172.16.1.% #局域网访问localhost localhost #本地访问 % #所有
web01连接测试
[root@web01 /]# yum install mariadb-server -y [root@web01 /]# mysql -ujpress -p123456 -h 172.16.1.51 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 8 Server version: 5.5.64-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
sql 语句
查看:
- show databases;
- show tables from db;
- select user,host from mysql.user;
添加:
- 建库: create database jpress charset utf8;
- 添加用户: grant all on jpress.*to 'jpress'@'172.16.1.%' identified by '123456';
删除:
- drop database db;
- drop user jpress@localhost;
备份:
- mysqldump
#密码登录名自定义
#服务重启,否则网站无法显示 [root@web01 /]# /application/tomcat/bin/shutdown.sh [root@web01 /]# /application/tomcat/bin/startup.sh
jpress 连接数据库存放的文件
[root@web01 /]# cat /application/tomcat/webapps/jpress/WEB-INF/classes/db.properties #Auto create by JPress #Thu Dec 19 20:47:33 CST 2019 db_name=jpress db_host_port=3306 db_tablePrefix=jpress_ db_host=172.16.1.51 db_password=123456 db_user=jpress
用户上传目录及数据库内容查看
#存放目录默认在/webapps/jpress/attachment/下 attachment存储数据时自动创建 [root@web01 /]# ll /application/tomcat/webapps/jpress/attachment/20191220 total 448 -rw-r----- 1 root root 26864 Dec 20 10:13 79b321d14e8c48f982f7a8c854bd02f0_780x240.jpg -rw-r----- 1 root root 92400 Dec 20 10:13 79b321d14e8c48f982f7a8c854bd02f0.jpg -rw-r----- 1 root root 10791 Dec 20 10:12 a8dbbf8eb07c40708a5d041af7ed48c2_240x140.jpg -rw-r----- 1 root root 27133 Dec 20 10:12 a8dbbf8eb07c40708a5d041af7ed48c2_300x300.jpg -rw-r----- 1 root root 51171 Dec 20 10:12 a8dbbf8eb07c40708a5d041af7ed48c2_600x300.jpg -rw-r----- 1 root root 51089 Dec 20 10:12 a8dbbf8eb07c40708a5d041af7ed48c2_780x240.jpg -rw-r----- 1 root root 187540 Dec 20 10:12 a8dbbf8eb07c40708a5d041af7ed48c2.jpg
nio(new I/O)
# nio2模式 protocol="org.apache.coyote.http11.Http11Nio2Protocol 69 <Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" connectionTimeout="20000" redirectPort="8443" /> #重启tomcat [root@web01 /]# /application/tomcat/bin/shutdown.sh #关闭时最好查看一下后台进行是否关闭,有时服务关闭进程还在。 [root@web01 /]# ps -ef | grep java [root@web01 /]# ss -lntup | grep java [root@web01 /]# /application/tomcat/bin/startup.sh
查看修改结果-tomcat管理端
#安装apr环境 yum -y install apr apr-devel tomcat-native #修改8080&8009端口对应的server.xml protocol="org.apache.coyote.http11.Http11Nio2Protocol" 把Nio2 修改为Apr protocol="org.apache.coyote.http11.Http11AprProtocol" #重启tomcat [root@web01 /]# /application/tomcat/bin/shutdown.sh #关闭时最好查看一下后台进行是否关闭,有时服务关闭进程还在。 [root@web01 /]# ps -ef | grep java [root@web01 /]# ss -lntup | grep java [root@web01 /]# /application/tomcat/bin/startup.sh
tomcat-native 安装方式二: 编译安装
1.安装需要的软件 [root@web01 /]# yum install -y gcc apr-devel apr apr-util gcc-4.8.5-39.el7.x86_64 apr-devel-1.4.8-5.el7.x86_64 apr-1.4.8-5.el7.x86_64 apr-util-1.5.2-6.el7.x86_64 2.安装tomcat-native-1.2.23 源码下载地址: https://archive.apache.org/dist/tomcat/tomcat-connectors/native/1.2.8/source/ 将下载下来的源码包tomcat-native-1.2.23-src.tar.gz放在/server/tools目录下面,然后解压 到/application/ 在线下载: wget https://archive.apache.org/dist/tomcat/tomcat-connectors/native/1.2.8/source/tomcat-native-1.2.8-src.tar.gz [root@web01 /server/tools]# tar -zxvf tomcat-native-1.2.8-src.tar.gz -C /application/ [root@web01 /application/tomcat-native-1.2.8-src/native]# ./configure --with-apr=/usr/bin/apr-1-config --prefix=$CATALINA_HOME && make && make install #修改环境变量:vim /application/apache-tomcat-8.0.27/bin/catalina.sh,添加如下配置: LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib export LD_LIBRARY_PATH #配置Tomcat Connector,使用apr模式 [root@web01 /]# vim /application/tomcat/conf/server.xml 69 <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" 70 connectionTimeout="20000" 71 redirectPort="8443" /> #重启ttomcat服务
[root@web01 /]# cd /server/tools/ [root@web01 /server/tools]# tar -zxvf apache-tomcat-8.0.27.tar.gz [root@web01 /server/tools]# cp -r apache-tomcat-8.0.27 /application/tomcat8081 [root@web01 /server/tools]# cp -r apache-tomcat-8.0.27 /application/tomcat8082 #修改tomcat8081端口号 [root@web01 /application]# sed -i 's#8080#8081#g' tomcat8081/conf/server.xml [root@web01 /application]# sed -i 's#8005#8006#g' tomcat8081/conf/server.xml [root@web01 /application]# sed -i 's#8009#8010#g' tomcat8081/conf/server.xml #修改tomcat8082端口 [root@web01 /application]# sed -i 's#8080#8082#g' tomcat8082/conf/server.xml [root@web01 /application]# sed -i 's#8005#8007#g' tomcat8082/conf/server.xml [root@web01 /application]# sed -i 's#8009#8011#g' tomcat8082/conf/server.xml #查看端口,确定好端口是否替换正确,否则会少端口 ##java进程有时服务关闭,后台进程还在请查看好: 查看进程:ps -ef | grep java 杀死全部进程:pkill java [root@web01 /]# ss -lntup | grep java tcp LISTEN 0 1 ::ffff:127.0.0.1:8007 :::* users:(("java",pid=7924,fd=52)) tcp LISTEN 0 100 :::8009 :::* users:(("java",pid=7382,fd=47)) tcp LISTEN 0 100 :::8010 :::* users:(("java",pid=7691,fd=47)) tcp LISTEN 0 100 :::8011 :::* users:(("java",pid=7860,fd=47)) tcp LISTEN 0 100 :::8080 :::* users:(("java",pid=7382,fd=46)) tcp LISTEN 0 100 :::8081 :::* users:(("java",pid=7691,fd=46)) tcp LISTEN 0 100 :::8082 :::* users:(("java",pid=7860,fd=46)) tcp LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=7382,fd=65)) tcp LISTEN 0 1 ::ffff:127.0.0.1:8006 :::* users:(("java",pid=7691,fd=64))
#创建首页文件进行测试 [root@web01 /]# echo "welcome to tomcat_8081" >/application/tomcat8081/webapps/ROOT/index.jsp [root@web01 /]# echo "welcome to tomcat_8082" >/application/tomcat8082/webapps/ROOT/index.jsp #测试文件 [root@web01 /]# curl 10.0.0.7:8081 welcome to tomcat_8081 [root@web01 /]# curl 10.0.0.7:8082 welcome to tomcat_8082
[root@web01 /]# jps -lvm 8355 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat8082/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8082/endorsed -Dcatalina.base=/application/tomcat8082 -Dcatalina.home=/application/tomcat8082 -Djava.io.tmpdir=/application/tomcat8082/temp 7382 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat/endorsed -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp 7691 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat8081/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8081/endorsed -Dcatalina.base=/application/tomcat8081 -Dcatalina.home=/application/tomcat8081 -Djava.io.tmpdir=/application/tomcat8081/temp 8429 sun.tools.jps.Jps -lvm -Denv.class.path=.:/application/jdk/lib:/application/jdk/jre/lib:/application/jdk/lib/tools.jar -Dapplication.home=/application/jdk1.8.0_60 -Xms8m
提取码:7hut
##根据java线程繁忙排序 线程是指进程内的一个执行单元, #进程 进程拥有自已独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 #线程 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度 #协程和线程 协程避免了无意义的调度,由此可以提高性能:但同时协程也失去了线程使用多CPU的能力 进程与线程的区别 (1)地址空间:线程是进程内的一个执行单位,进程内至少有一个线程,他们共享进程的地 址空间,而进程有白己独立 的地址空间 (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内线程共享进程的资源 (3)线程是处理器调度的基本单位,但进程不是 (4)二者均可并发执行 (5)每个独立的线程有一个程序运行的入口 安装命令:yum install psmisc -y [root@web01 /]# pstree -p ├─java(7382)─┬─{java}(7383) │ ├─{java}(7384) │ ├─{java}(7385) │ ├─{java}(7386) │ ├─{java}(7387)
[root@web01 /server/scripts]# sh show-busy-java-threads.sh [1] Busy(0.4%) thread(8545/0x2161)#16进制 stack of java process(7382) under user(root): "http-apr-8080-exec-1" #23 daemon prio=5 os_prio=0 tid=0x00007fa5a839e000 nid=0x2161 waiting on condition [0x00007fa5848cd000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000f67f8320> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
修改 tomcat/bin/catalina.sh CATALINA_OPTS java内置变量 修改java启动参数(tomcat) CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote #jmx remote开启tomcat远程监控功能 -Dcom.sun.management.jmxremote.port=12345 #指定端口 12345 还有2个随机端口 -Dcom.sun.management.jmxremote.authenticate=false #auth 认证 -Dcom.sun.management.jmxremote.ssl=false #https -Djava.rmi.server.hostname=10.0.0.7" #tomcat监听的ip地址 本地ip 10.0.0.7 172.16.1.7 写内网ip CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=10.0.0.7" [root@web01 ~]# cd /application/tomcat/bin/ [root@web01 bin]# vim catalina.sh 写在第2行或者97行 #重启tomcat ##检查进程和端口 [root@web01 /application]# ps -ef | grep java root 9046 1 13 05:56 pts/0 00:00:01 /application/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=10.0.0.7 -Djava.endorsed.dirs=/application/tomcat/endorsed -classpath /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp org.apache.catalina.startup.Bootstrap start root 9072 7332 0 05:56 pts/0 00:00:00 grep --color=auto java [root@web01 /application]# ss -lntup | grep java tcp LISTEN 0 100 :::8009 :::* users:(("java",pid=9046,fd=51)) tcp LISTEN 0 100 :::8080 :::* users:(("java",pid=9046,fd=50)) tcp LISTEN 0 50 :::40661 #随机端口 :::* users:(("java",pid=9046,fd=19)) tcp LISTEN 0 50 :::12345 #指定端口 :::* users:(("java",pid=9046,fd=20)) tcp LISTEN 0 50 :::38368 #随机端口 :::* users:(("java",pid=9046,fd=21)) tcp LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=9046,fd=68))
- 通过Windows 就console 连接(模拟zabbix连接) Linux tomcat
- 路径:C:\Program Files\Java\jdk1.8.0_31\bin\jconsole.exe
#压力测试 [root@web01 ~]# ab -c 5 -n 9999999 10.0.0.7:8080/ #详细说明 ab详细参数博客地址:https://www.cnblogs.com/myvic/p/7703973.html -n: 在测试会话中所执行的请求个数。默认时,仅执行一个请求。请求的总数量 -c: 一次产生的请求个数。默认是一次一个。请求的用户量 -t: 测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。 -V: 显示版本号并退出。
#测压结果:
[root@web01 /etc/nginx/conf.d]# cat tomcat.conf server { listen 80; server_name wei.com; client_max_body_size 10m; root /application/tomcat/webapps; location / { index index.jsp index.html index.htm; } location ~ \.jsp$ { proxy_pass http://127.0.0.1:8080; } } #nginx反向代理 + tomcat upstream tomcat { server 10.0.0.7:8080; server 10.0.0.7:8081; server 10.0.0.8:8080; } server { listen 80; server_name tomcat.com; location / { proxy_pass http://tomcat ; } }
[root@web01 /]# cat /etc/sysctl.conf vm.swappiness =0 net.ipv4.ip_forward=1 [root@web01 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@web01 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all #相关解释 vm.swappiness =0 #控制系统是否优先使用物理内存 数越小 越优先使用物理内存 net.ipv4.ip_forward=1 #开启内核转发.nat的时候 需要配置 net.ipv4.icmp_echo_ignore_all=0 #关闭ICMP回应功能
tomcat负载高
排查流程
- vmstat /top/ps aux 找出哪个进程的问题
[root@web01 /]# vmstat 1 10 #r 这个数字如果大,意味着系统的cpu使用率较高 #b 数字较大 意味着 磁盘读写io较高 #内存 #swap分区 #磁盘 #系统 #cpu procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 253724 116 502652 0 0 10 6 79 218 0 0 99 0 0 0 0 0 253700 116 502652 0 0 0 0 75 133 0 0 100 0 0
- 通过top -Hp java进程id 找出是哪个java线程的问题
- 找出线程的id 2358 (10进制)转换为16进制
[root@web01 /]# ps -ef | grep java root 9046 1 0 10:49 ? [root@web01 /]# top -Hp 9046 #精确到找到某个线程 top - 19:11:56 up 9:54, 1 user, load average: 0.00, 0.01, 0.05 Threads: 34 total, 0 running, 34 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 6.2 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 995896 total, 253056 free, 239748 used, 503092 buff/cache KiB Swap: 819196 total, 819196 free, 0 used. 575224 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9046 root 20 0 2337496 143356 14900 S 0.0 14.4 0:00.00 java 9047 root 20 0 2337496 143356 14900 S 0.0 14.4 0:00.47 java 9048 root 20 0 2337496 143356 14900 S 0.0 14.4 0:04.78 java 9049 root 20 0 2337496 143356 14900 S 0.0 14.4 0:00.01 java [root@web01 /]# yum install bc -y [root@web01 /]# echo 'obase=16;9048' | bc 2358
- jstack pid (java进程)然后过滤 线程16进制的pid
[root@web01 /]# jstack 9046 | grep -i -C 5 '2358' at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485) "VM Thread" os_prio=0 tid=0x00007f829406d800 nid=0x2358 runnable "VM Periodic Task Thread" os_prio=0 tid=0x00007f829418e000 nid=0x2363 waiting on condition JNI global references: 262
- jmap (显示java jvm内容/信息) jmap -heap java进行id 显示jvm的内存使用情况
[root@web01 /]# jmap -heap 9046 Attaching to process ID 9046, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.60-b23 using thread-local object allocation. Mark Sweep Compact GC Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 255852544 (244.0MB) NewSize = 5570560 (5.3125MB) MaxNewSize = 85262336 (81.3125MB) OldSize = 11206656 (10.6875MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB) Heap Usage: New Generation (Eden + 1 Survivor Space): capacity = 19464192 (18.5625MB) used = 15386216 (14.673439025878906MB) free = 4077976 (3.8890609741210938MB) 79.04882976904462% used Eden Space: capacity = 17367040 (16.5625MB) used = 15024488 (14.328468322753906MB) free = 2342552 (2.2340316772460938MB) 86.5115068543632% used From Space: capacity = 2097152 (2.0MB) used = 361728 (0.344970703125MB) free = 1735424 (1.655029296875MB) 17.24853515625% used To Space: capacity = 2097152 (2.0MB) used = 0 (0.0MB) free = 2097152 (2.0MB) 0.0% used tenured generation: capacity = 43020288 (41.02734375MB) used = 30485784 (29.073509216308594MB) free = 12534504 (11.953834533691406MB) 70.86373759283062% used 14035 interned Strings occupying 1907800 bytes.
[root@web01 /]# jmap -dump:format=b,file=/tmp/tomcat.bin 9046 Dumping heap to /tmp/tomcat.bin ... Heap dump file created [root@web01 /]# file /tmp/tomcat.bin /tmp/tomcat.bin: data #文件格式为data
#安全优化 ##1.telnet管理端口保护(强制) tomcat shutdown端口 <Server port="8527" shutdown="dangerous"> ##2.ajp连接端口保护(推荐) 如果使用的apache+tomcat 修改端口 如果没有使用apache 则把这一行注释 <!-- 开始 注释结束 --> ##3.禁用管理端(强制) ###1. 删除默认的{Tomcat安装目录}/conf/tomcat-users.xml文件,重启tomcat 后将会自动生成新的文件; ###2. 删除{Tomcat安装目录}/webapps下默认的所有目录和文件; ###3. 将tomcat 应用根目录配置为tomcat安装目录以外的目录;
##4. 降权启动(模式)(监牢模式 keep in jail) 降权启动/监牢模式 让服务通过普通用户运行 普通用户管理 [root@web01 /]# useradd tomcat [root@web01 /]# id tomcat uid=1006(tomcat) gid=1006(tomcat) groups=1006(tomcat) [root@web01 /]# chown -R tomcat.tomcat /application/tomcat/ #递归将目录权限修改为普通用户 [root@web01 /]# pkill java #关闭java进程 [root@web01 /]# ps -ef | grep java #查看进程是否还在 root 10440 9635 0 20:09 pts/0 00:00:00 grep --color=auto java #切换用户启动进程 # Linux 1-1024端口 特权端口 只能root使用. [root@web01 /]# su - tomcat [tomcat@web01 ~]$ /application/tomcat/bin/startup.sh Using CATALINA_BASE: /application/tomcat Using CATALINA_HOME: /application/tomcat Using CATALINA_TMPDIR: /application/tomcat/temp Using JRE_HOME: /application/jdk Using CLASSPATH: /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar Tomcat started.
链接:https://pan.baidu.com/s/1pNscsGtXg59ou_SJ7-S41w
提取码:8u0a
maxThreads="500" #最大的线程数量 200-400之间 minSpareThreads="10" #空闲时候最小的线程数量 #进行测试 基准测试 什么都没有配置的时候的结果 #修改 优化 进行测试 与基准测试进行对比
图片一:
图片二:
图片五:
图片六:
apr 注释掉8009 ajp
[root@docker01 ~]#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!