tomcat 搭建网站

基本概念

  • JDK(Java Development Kit)是Sun Microsystems针对Java开发人员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。JDK是学好Java的第一步。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。
  • JRE:java Runtime Enviroment是指 Java 的运行环境,是面向 Java 程序的使用者,而不是开发者,运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。Java Runtime Environment(包括Java Plug-in)是Sun的产品,包括两部分:Java Runtime Environment和Java Plug-in。JRE是可以在其上运行、测试和传输应用程序的Java平台。它包括Java虚拟机(jvm)、Java核心类库和支持文件。它不包含开发工具(JDK)--编译器、调试器和其它工具。JRE需要辅助软件--Java Plug-in--以便在浏览器中运行applet。

环境准备与部署

主机名 服务 外网 内网
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

jdk 环境部署

web01主机 解压jdk

[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)

tomcat部署

官方网站:http://tomcat.apache.org/

 

参考:https://blog.csdn.net/qq_14898543/article/details/53939197

tomcat与nginx比较:

  1. Apache与Tomcat的比较 相同点: 两者都是Apache组织开发的两者都有HTTP服务的功能两者都是免费的

    不同点: Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等),而Tomcat是Apache组织在符合Java EE的JSP、Servlet标准下开发的一个JSP服务器.

  2. Apache是一个Web服务器环境程序,启用他可以作为Web服务器使用,不过只支持静态网页如(ASP,PHP,CGI,JSP)等动态网页的就不行。如果要在Apache环境下运行JSP的话就需要一个解释器来执行JSP网页,而这个JSP解释器就是Tomcat。 Apache:侧重于HTTPServer ,Tomcat:侧重于Servlet引擎,如果以Standalone方式运行,功能上与Apache等效,支持JSP,但对静态网页不太理想; Apache是Web服务器,Tomcat是应用(Java)服务器,它只是一个Servlet(JSP也翻译成Servlet)容器,可以认为是Apache的扩展,但是可以独立于Apache运行。 实际使用中Apache与Tomcat常常是整合使用:

    如果客户端请求的是静态页面,则只需要Apache服务器响应请求。 如果客户端请求动态页面,则是Tomcat服务器响应请求。 因为JSP是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销。 可以理解Tomcat为Apache的一种扩展。

  3. 如果客户端请求的是静态页面,则只需要Apache服务器响应请求。如果客户端请求动态页面,则是Tomcat服务器响应请求.因为JSP是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销。 可以理解Tomcat为Apache的一种扩展。

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管理

🍋目录   🍓文件 🍑作用
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,80808005
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))

网页测试:http://10.0.0.7:8080/

tomcat管理端

  • 测试时开启管理端 进行调试 开启管理端
  • 生产环境中 关闭管理端
  • 版本 tomcat 8.0
  • conf/tomcat-user.xml

[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)

tomcat配置文件

#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 &quot;%r&quot; %s %b" />

      </Host>

tomcat 网站部署应用及方式

  • 如果开发给你的是war包 则把war包放入tomcat webapps 自动解压 自动部署
  • 如果开发给你的是jar包 java -jar xxx.jar

软件地址:https://pan.baidu.com/s/1pjSj2HBsk85QhKDnR2WE0w

#java wordpress jpress java版的wordpress

环境准备 作用
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

网页输入:http://10.0.0.7:8080/jpress

#网站目录的名字是什么,网站就输入什么。

press下载地址:https://gitee.com/fuhai/jpress/blob/alpha/wars/jpress-web-newest.war

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

登录后台:http://10.0.0.7:8080/jpress/admin/

tomcat的三种工作方式

bio(blocking I/O)

即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。一个线程处理一个请 求,缺点:并发量高时,线程数较多,浪费资源。

使用方式:现在通常不使用,tomcat 7及之前

nio(new I/O)

Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。利用 Java 的异步请求 IO 处理,可以通过少量的线程处理大量的请求。

使用方式:tomcat默认模式 ,tomcat 8 以后的工作模式 nio1(默认) nio2(升级版)

apr(Apache Portable Runtime/Apache可移植运行时)#单独安装

Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能,高并发 。Tomcat apr也是在Tomcat上运行高并发应用的首选模式。

使用方式:在server.xml中更改使用的协议

nio模式

模式修改文件

# 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模式

#安装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 安装方式二: 编译安装

下载native插件,插件地址 http://archive.apache.org/dist/tomcat/tomcat-connectors/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服务

tomcat多实例

  • 一台服务器运行多个tomcat
  • 默认端口8080 ,多实例端口不同,路径不同

多服务部署

[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))

网站登录访问

  • 创建首页文件格式为jsp,默认放在/webapps/ROOT下 或者在webapps下创建一个目录
#创建首页文件进行测试
[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

tomcat监控功能

  • 通过监控软件,可以监控tomcat状态(lvm状态)
  • JVM:java virtual machineJVM 就是我们常说的 java 虚拟机。java代码放在Java虚拟机上运行,只要能运行虚拟机,就可以运行java代码。
  • 监控方法:
  1. 通过命令/脚本查看
  2. 开启tomcat监控功能,再让zabbix监控

命令监控

[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

脚本查看进程

脚本地址:https://pan.baidu.com/s/1rOBBWxa_0-82q6EtQppPgQ

 提取码: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监控功能

修改 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: 显示版本号并退出。

#测压结果:

tomcat 与 nginx

lnmp原理:

  • N:nginx 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器
  • M:mysql(关系型数据库管理系统)或 mariadb (mysql分支)
  • p:php 处理动态请求

lnmt原理:

  • Tomcat 能处理动态和静态
  • Tomcat 处理静态的能力较弱
  • 静态资源 nginx 处理
  • 动态资源 nginx ---> tomcat 处理
[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 ;
}
}

tomcat相关故障及排错

  • tomcat(java) 服务器 运行占用大量swap 物理内存占用较少
  • vm.swappiness 控制系统是否优先使用物理内存 数越小 越优先使用物理内存
[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.
  • jmap (导出jvm内存的内容) jmp -dump:fomat=b,file=/root/tomcat/bin pid
[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

tomcat的优化

#安全优化
##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. 

tomcat性能优化

java压力测试工具: jmeter (需要java环境(jdk/jre)

链接:https://pan.baidu.com/s/1pNscsGtXg59ou_SJ7-S41w

提取码:8u0a

文件路径:/apache-jmeter-5.2.1\bin\jmeter.bat

maxThreads="500"    #最大的线程数量    200-400之间
minSpareThreads="10"    #空闲时候最小的线程数量

#进行测试  基准测试    什么都没有配置的时候的结果

#修改  优化    进行测试    与基准测试进行对比

图片一:

图片二:

图片三:

图片四:

 

图片五:

图片六:

apr 注释掉8009 ajp

[root@docker01 ~]#

posted @ 2019-12-23 10:04  kerwin-  阅读(3877)  评论(0编辑  收藏  举报