学习tomcat(三)
一、tomcat安装
1、部署java环境
# yum install java-1.8.0 # java -version
2、部署tomcat
# mkdir /data/soft -p # cd /data/soft/ # wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.53/bin/apache-tomcat-8.5.53.tar.gz # tar zxf apache-tomcat-8.5.53.tar.gz -C /opt/ # cd /opt # ln -s apache-tomcat-8.5.53 tomcat # echo 'export TOMCAT_HOME=/opt/tomcat'>>/etc/profile # /opt/tomcat/bin/startup.sh # netstat -lntup | grep 8080 # ps -ef | grep tomcat # tail -1 /opt/tomcat/logs/catalina.out # curl -I 127.0.0.1:8080
3、tomcat目录介绍
1、总目录 # tree -L 1 /opt/tomcat/ ├── bin #脚本目录(启动,关闭Tomcat,.bat,.sh) ├── conf #配置文件目录(配置Tomcat的XML及DTD文件) ├── lib #存放web应用访问的JAR包 ├── logs #日志目录(Catalina,其他日志文件) ├── temp #临时文件 ├── webapps #Web应用程序根目录 └── work #产生JSP编译出的Servlet的.java和.class文件
2、webapps目录 # ll webapps/ docs #tomcat帮助文档 examples #web应用 host-manager #管理 manager #管理 ROOT #默认网站根目录
3、bin目录 # ll bin/ startup.sh #启动脚本 shutdown.sh #关闭脚本 catalina.shtomcat #核心管理脚本(jvm优化参数及配置,tomcat启动参数)
4、启动和关闭tomcat
方法1 # /opt/tomcat/bin/startup.sh # /opt/tomcat/bin/shutdown.sh
方法2 # /opt/tomcat/bin/catalina.sh start # /opt/tomcat/bin/catalina.sh stop
方法3 # vim /usr/lib/systemd/system/tomcat.service [Unit] Description=Apache Tomcat Web Application Container After=syslog.target network.target [Service] Type=forking ExecStart=/opt/tomcat/bin/catalina.sh start ExecReload=/opt/tomcat/bin/catalina.sh restart ExecStop=/opt/tomcat/bin/catalina.sh stop User=tomcat [Install] WantedBy=multi-user.target EOF # systemctl daemon-reload # systemctl start tomcat # systemctl stop tomcat
5、检查和测试
# ps -ef|grep tomcat # ss -lntup|grep java # tail -f /opt/tomcat/logs/catalina.out 访问http:192.168.1.11:8080
二、tomcat配置文件
1、tomcat配置文件介绍
server.xml #主配置文件
tomcat-users.xml #管理用户配置文件
2、tomcat管理(生产不要用)
# vim /opt/tomcat/conf/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="host-gui"/> <role rolename="manager-gui"/> <user username="tomcat" password="tomcat" roles="admin-gui,host-gui,manager-gui"/> </tomcat-users> # vim /opt/tomcat/webapps/manager/META-INF/context.xml allow="10\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> #允许ip地址范围 # /opt/tomcat/bin/shutdown.sh # /opt/tomcat/bin/startup.sh
3、Server.xml的组成
1、格式 <server> #顶级组件 <service> #容器类组件 <connector /> #连接器组件 <connector /> <engine> #容器类组件 <host> #容器类组件 <context></context> </host> </engine> </service> </server>
2、组成 ① 顶级组件: 位于整个配置的顶层,如server ② 容器类组件: 包含其它组件的组件,如server,engine,host,context ③ 连接器组件: 连接请求,如connector ④ 被嵌套类组件: 位于一个容器内,不能包含其它组件,如Valve,logger
3、组件详情 server: 在最顶层,整个tomcat容器,监听端口 service: 服务名,将connector关联到engine,一个service内只能有一个引擎engine,可有多个connector connector: 接收用户请求,客户端和service之间的连接 engine: 核心容器组件,catalina引擎,负责接受并处理connector请求,将请求转到对应的虚拟主机host host: 虚拟主机,支持基于FQDN的虚拟主机 context: 一个web应用程序,warapp文件路径,web应用程序url的前缀,webapp部署方式 Valve: 阀门,拦截请求并将其转到对应的webapp前过滤,如记录日志,IP访问控制,用于任何容器中 logger: 日志记录器,记录组件内部的状态信息,用于除context外的任何容器中 realm: 存放用户名,密码及role的数据库,用于任意容器的组件中 UserDatabaseRealm: 用JNDI自定义的用户认证库 MemoryRealm: 认证信息定义在tomcat-users.xml中 JDBCRealm: 认证信息定义在数据库中,并通过JDBC连接至数据库查找认证用户
4、Server.xml配置文件解析
# vim server.xml <?xml version='1.0' encoding='utf-8'?> <!-- <Server> #实例的顶层元素,包含一个<Service>元素 port #关闭端口 shutdown #关闭命令字符串 --> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <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> <!-- service name #服务名 --> <Service name="Catalina"> <!-- connector: #处理客户端请求 port: #服务监听端口 address: #服务监听地址,默认0.0.0.0 protocol: #连接器使用的协议,支持HTTP和AJP minProcessors: #最小处理请求的线程数 maxProcessors: #最大处理请求的线程数 enableLookups: #是否开启DNS查询,true:返回主机名,false:返回ip地址 redirectPort: #https端口 acceptCount: #等待请求队列的最大长度 connectionTimeout: #客户端发送请求的超时时间(单位毫秒) --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <!-- engine #分析协议的引擎 defaultHost #处理请求的默认虚拟主机 --> <Engine name="Catalina" defaultHost="localhost"> <!-- Realm #存放用户,密码及role的数据库 --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <!-- host #一个虚拟主机 name #主机名 appBase #应用程序的目录,webapp应用路径 unpackWARs #是否自动WAR包,true:不解压,false:解压 autoDeploy #是否自动部署WAR包 xmlValidation #是否启动xml的校验功能 xmlNamespaceAware #检测名称空间,一般是false --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- Context #一个web应用程序,通常为WAR文件 docBase #webapp的war包目录,相对路径或绝对路径 path #webapp的url的前缀,127.0.0.1:8080/path/webapp reloadable #自动重载新的应用,目录:/WEB-INF/class和/WEB-INF/lib --> <Context path="" docBase="" debug=""/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
5、Server.xml参数解析
元素名 | 属性 | 解释 |
server | address |
监听地址 |
port |
监听关闭端口 |
|
shutdown | 关闭命令字符串 | |
service | name | service的名字 |
Connector | address | 监听地址,默认0.0.0.0 |
port | 监听端口 | |
maxThreads | 最大并发连接数,默认为200 | |
maxConnections | 允许建立的最大连接数 | |
protocol | 连接器使用的协议,支持HTTP和AJP | |
minProcessors | 最小处理请求的线程数 | |
maxProcessors | 最大处理请求的线程数 | |
enableLookups | 是否开启DNS查询,true:返回主机名,false:返回ip地址 | |
redirectPort | https端口 | |
acceptCount | 等待请求队列的最大长度 | |
connectionTimeout | 客户端发送请求的超时时间(单位毫秒) | |
keepAliveTimeout | 长连接状态的超时时间 | |
compression | 是否压缩数据,off: 默认,on: 只压缩text,force: 压缩所有内容 | |
Engine | name | 引擎名称 |
defaultHost | 处理请求的默认虚拟主机 | |
Context | docBase | webapp的war包目录,相对路径或绝对路径 |
path | webapp的url的前缀,127.0.0.1:8080/path/webapp | |
reloadable | 自动重载新的应用,目录:/WEB-INF/class和/WEB-INF/lib | |
cookies | 是否启用cookie来标识session,默认为true | |
xmlNamespaceAware | 和web.xml的解析方式有关,默认为true,设置为false可提升性能 | |
xmlValidation | 和web.xml的解析方式有关,默认为true,设置为false可提升性能 | |
host | name | 主机名 |
appBase | 应用程序的目录,webapp应用路径 | |
unpackWARs | 是否自动WAR包,true:不解压,false:解压 | |
autoDeploy | 是否自动部署WAR包 | |
xmlValidation | 是否启动xml的校验功能 | |
xmlNamespaceAware | 检测名称空间,一般是false | |
xmlBase | 虚拟主机的context xml目录 | |
startStopThreads | 启动context容器时的并行线程数 | |
workDir | 虚拟主机的工作目录 | |
Realm | className | JAASRealm(基于Java Authintication and Authorization Service实现用户认证) |
JDBCRealm(通过JDBC访问,关系型数据库表,实现用户认证) | ||
JNDIRealm(基于JNDI,使用目录服务实现认证) | ||
MemoryRealm(查找tomcat-user.xml文件,实现用户认证) | ||
UserDatabaseRealm(基于UserDatabase文件(tomcat-user.xml)实现用户认证,兼容MemoryRealm,实现可更新和持久的MemoryRealm,通过JNDI实现) | ||
Valve | AccessLogValve | 访问日志 |
ExtendedAccessValve | 扩展功能的访问日志 | |
JDBCAccessLogValve | 通过JDBC将访问日志信息发送到数据库中 | |
RequestDumperValve | 请求转储 | |
RemoteAddrValve | 基于远程地址的访问控制 | |
RemoteHostValve | 基于远程主机名称的访问控制 | |
SemaphoreValve | 用于控制Tomcat主机上任何容器上的并发访问数量 | |
ReplicationValve | 用于Tomcat集群中,在请求session信息发生更改时,触发session数据,在各节点间进行复制 | |
SingleSignOn | 两个或多个webapp需要用户认证,webapp统一认证用户,即一次认证,就可访问所有webapp的连接 |
三、WEB站点部署
1、Tomcat端口
8080: http监听端口 8443: https监听端口 8005: 监听的关闭端口 8009: 反向代理tomcat的时用的端口,基于ajp协议
2、站点部署
1、上传软件包 # cd /opt/tomcat/webapps # rz -y memtest.war
2、访问测试 访问: http://192.168.1.11/memtest/meminfo.jsp
3、自定义默认网站目录
1、修改默认站点目录 # vim /opt/tomcat/conf/server.xml <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="/opt/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/> 2、访问测试 访问: http://192.168.1.11/meminfo.jsp
四、搭建jpress部署实践
1、安装配置mariadb数据库
# yum install mariadb mariadb-server # systemctl start mariadb.service # mysqladmin password 123456 # mysql -uroot -p123456 mysql> create database jpress DEFAULT CHARACTER SET utf8; mysql> grant all on jpress.* to jpress@'192.168.1.%' identified by '123456'; mysql> flush privileges;
2、上传jpress代码
# cd /opt/tomcat/webapps # rz -y jpress-web-newest.war # mv jpress-web-newest.war jpress.war
3、web页面配置jpress
浏览器访问: http://192.168.1.11:8080/jpress/
4、重启tomcat
# /opt/tomcat/bin/shutdown.sh # /opt/tomcat/bin/startup.sh
5、测试
1、写一篇文章并上传附件
2、上传文件的路径 # ll /opt/tomcat/webapps/jpress/attachment/20200810/
3、文章内容在数据库的位置 mysql> select * from jpress.jpress_content\G id: 1 title: 测试页面 text: <p>测试第一个</p><p><img src="/jpress/attachment/20200810/55f65d452e9b4fdb99a09f0c68532f6a.jpeg" \ alt="" width="256" height="256"></p>
五、zabbix监控tomcat
1、安装zabbix-agent服务
# https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/ # yum install zabbix-agent -y # cat /etc/zabbix/zabbix_agentd.conf PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 Server=192.168.1.20 #zabbix-server地址 ServerActive=192.168.1.20 #zabbix-server地址 Hostname=Zabbix server #zabbix-server主机名 Include=/etc/zabbix/zabbix_agentd.d/*.conf # systemctl restart zabbix-agent.service
2、开启远程监控
# vim /opt/tomcat/bin/catalina.sh #!/bin/sh #添加到最前面 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=192.168.1.11" #tomcat地址 # /opt/tomcat/bin/shutdown.sh # /opt/tomcat/bin/startup.sh
3、修改hosts解析
# tail -1 /etc/hosts 192.168.1.11 tomcat01
4、检查进程和端口号
# ps -ef | grep java # ss -lntup | grep 12345
5、配置zabbix-server
1、安装java # yum install java-1.8.0 -y # java -version
2、安装zabbix-java-gateway服务 # yum install zabbix-java-gateway.x86_64 -y # systemctl start zabbix-java-gateway.service
3、修改zabbix_server.conf配置文件 # vim "Java" /etc/zabbix/zabbix_server.conf JavaGateway=127.0.0.1 JavaGatewayPort=10052 StartJavaPollers=5
4、重启zabbix服务 # systemctl restart httpd # systemctl restart zabbix-server.service # systemctl restart zabbix-java-gateway.service
5、zabbix网页操作
六、tomcat多实例
1、复制目录
# cd /opt/ # cp -a apache-tomcat-8.5.43 tomcat_01 # cp -a apache-tomcat-8.5.43 tomcat_02
2、修改配置文件
1、修改端口号(实例一) # sed -i 's#8005#8006#g' tomcat_01/conf/server.xml # sed -i 's#8009#8010#g' tomcat_01/conf/server.xml # sed -i 's#8080#8081#g' tomcat_01/conf/server.xml # sed -i 's#12345#12346#g' tomcat_01/bin/catalina.sh 2、修改端口号(实例二) # sed -i 's#8005#8007#g' tomcat_02/conf/server.xml # sed -i 's#8009#8011#g' tomcat_02/conf/server.xml # sed -i 's#8080#8082#g' tomcat_02/conf/server.xml # sed -i 's#12345#12346#g' tomcat_02/bin/catalina.sh 3、修改或删除自定义的配置路径 # vim server.xml <Context path="" docBase="/opt/tomcat" debug="0" reloadable="false" crossContext="true"/>
3、启动多实例
# /opt/tomcat_01/bin/startup.sh # /opt/tomcat_02/bin/startup.sh
4、查看服务
# ss -lntup|grep java
5、浏览器访问
实例一: http://192.168.1.11:8081/jpress/ 实例二: http://192.168.1.11:8082/jpress/
七、tomcat集群配置
1、安装nginx
# yum install nginx -y
2、创建配置文件
# vim /etc/nginx/conf.d/proxy.conf upstream java { server 192.168.1.11:8081; server 192.168.1.11:8082; } server { listen 80; server_name www.test.com; root html; index index.html index.htm; location / { proxy_pass http://java; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
3、启动nginx
# nginx -t
# systemctl start nginx
八、tomcat安全优化
1、降权启动(普通用户启动)
# cp -a apache-tomcat-8.0.27 /home/test/tomcat # chown -R test.test /home/test/tomcat # su - test $ ./tomcat/bin/startup.sh
2、telnet管理端口保护
# vim server.xml(更改端口) <Server port="8055" shutdown="pass">
3、ajp连接端口保护(更改端口,或禁用)
# vim server.xml <Connector port="8099" protocol="AJP/1.3" redirectPort="8443" />
4、禁用管理端(删除webapp所有默认目录和文件)
# cd /opt/tomcat/webapps/ # mv docs examples host-manager manager /tmp # mv ROOT/* /tmp
5、屏蔽dns查询(只记录IP,不记录主机名)
# vim /application/tomcat/conf/server.xml <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="6000" enableLookups="false" acceptCount="800" redirectPort="8443" />
6、加速Tomcat启动
# vim /usr/java/jdk1.8.0_181-amd64/jre/lib/security/java.security securerandom.source=file:/dev/urandom
九、jvm调优
# vim catalina.sh JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m" -server #JVM的server模式 -Xms #堆内存初始值(推荐:物理内存的一半) -Xmx #堆内存最大值(xms和xmx的配置相同的值) -XX:NewSize #堆区,新生代初始值 -XX:MaxNewSize #堆区,新生代最大值 -XX:PermSize #非堆区,持久代(方法区)初始值 -XX:MaxPermSize #非堆区,持久代(方法区)最大值 -Xmn #同时配置新生代初始值和最大值(JDK1.4之后支持) -Xss #每个线程的堆栈大小(最佳:128K,默认:512k) +XX:AggressiveHeap #java堆最佳化设置,会忽略Xmx参数 -verbose:gc #输出JVM gc日志 -Xloggc:gc.log #指定gc日志目录 -XX:+UseParNewGC #并行多线程收集,对年轻代进行GC -XX:+UseConcMarkSweepGC #用CMS收集器,对年老代进行GC
十、其他
1、打包和解包
1、解包 # /opt/jdk1.8/bin/jar -xvf jpress-web-newest.war 2、打包 # /opt/jdk1.8/bin/jar -cvfM0 jpress.war ./ #添加文件夹 # /opt/jdk1.8/jar -cvfM0 jpress.war ./add.class #添加文件 3、jar 命令参数 -M: 不创建文件的清单文件(Manifest.mf),该参数会忽略掉-m参数 -0: 不压缩,仅存储
2、ansible启动tomcat
1、直接用ansible的shell模块,启动不了,要chdir切换工作目录,并结合nohub放在后台启动 # vim tomcat.yml - hosts: tomcat tasks: - name: 01-start-tomcat shell: chdir=/opt/tomcat/bin nohup ./startup.sh start & - name: 02-copy-jpress copy: src: /root/tomcat/jpress.war dest: /opt/tomcat/webapps 2、用system管理 1) 创建用户 # groupadd tomcat -g 1111 # useradd tomcat -u 1111 -g 1111 -M -s /sbin/nologin # id tomcat 2) 编辑服务启动脚本 # vim >/usr/lib/systemd/system/tomcat.service [Unit] Description=Apache Tomcat Web Application Container After=syslog.target network.target [Service] Type=forking ExecStart=/opt/tomcat/bin/catalina.sh start ExecReload=/opt/tomcat/bin/catalina.sh restart ExecStop=/opt/tomcat/bin/catalina.sh stop User=tomcat [Install] WantedBy=multi-user.target 3) 测试启动服务 # systemctl daemon-reload # systemctl start tomcat # systemctl stop tomcat
QQ:328864113 微信:wuhg2008