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 ~]#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM