TOMCAT---WEB服务器之TOMCAT

一、tomcat介绍

1.1 引入tomcat

 

  Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。 
  tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

1.2 常用的java-web服务

开源软件 
tomcat resin jboss 
商业软件 
weblogic websphere

二、java概念解释

  • JDK 
    简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等
  • JRE 
    JRE(Java Runtime Environment,Java运行环境),也就是Java平台。所有的Java程序都要在JRE下才能运行。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。
  • SDK 
    SDK(Software Develop Kit,软件开发工具包),用于帮助开发人员的提高工作效率。各种不同类型的软件开发,都可以有自己的SDK。Windows有Windows SDK,DirectX 有 DirectX 9 SDK,.NET开发也有Microsoft .NET Framework SDK。JAVA开发也不含糊,也有自己的Java SDK。
  • JVM 
    JVM(Java Virtual Machine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台

三、tomcat环境准备

  1. [root@linux-node1 ~]# uname -r
  2. 3.10.0-229.el7.x86_64
  3. [root@linux-node1 ~]# uname -m
  4. x86_64
  5. [root@linux-node1 ~]# uname -n
  6. linux-node1
  7. [root@linux-node1 ~]# cat /etc/redhat-release
  8. CentOS Linux release 7.1.1503 (Core)

四、源码安装启动tomcat

创建tomcat用户

  1. [root@linux-node1 ~]# useradd -u 601 tomcat
  2. #统一线上web服务用户的uid
  3. [root@linux-node1 ~]# password tomcat
  4. [root@linux-node1 ~]# id tomcat
  5. uid=601(tomcat) gid=1000(tomcat) groups=1000(tomcat)

下载jdk和tomcat

  1. [root@linux-node1 ~]#cd /usr/local/src
  2. [root@linux-node1 ~]# wget http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.tar.gz
  3. [root@linux-node1 ~]#wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v8.0.32/bin/apache-tomcat-8.0.32.tar.gz

安装Jdk和tomcat

  1. [root@linux-node1 src]# tar zxf jdk-8u73-linux-x64.tar.gz
  2. [root@linux-node1 src]# mv jdk1.8.0_73/ /usr/local/
  3. [root@linux-node4 src]# ln -s /usr/local/jdk1.8.0_73/ /usr/local/jdk
  4. [root@linux-node1 src]# tar zxf apache-tomcat-8.0.32.tar.gz
  5. [root@linux-node1 src]# mv apache-tomcat-8.0.32 /usr/local/
  6. [root@linux-node1 src]# ln -s /usr/local/apache-tomcat-8.0.32/ /usr/local/tomcat

设置环境变量

  1. [root@linux-node1 src]# echo "
  2. export JAVA_HOME=/usr/local/jdk
  3. export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
  4. export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
  5. export TOMCAT_HOME=/usr/local/tomcat" >> /etc/profile
  6. [root@linux-node1 local]# source /etc/profile

测试java生效

  1. [root@linux-node1 local]# java -version
  2. java version "1.8.0_74"
  3. Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
  4. Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)

使用tomcat用户启动tomcat

  1. [tomcat@linux-node1 local]# chown -R tomcat.tomcat ./tomcat/
  2. [tomcat@linux-node1 local]# cd /usr/local/tomcat/bin/
  3. [tomcat@linux-node1 bin]# ./startup.sh

查看8080端口

  1. [tomcat@linux-node1 bin]$ netstat -lnutp|grep 8080
  2. (Not all processes could be identified, non-owned process info
  3. will not be shown, you would have to be root to see it all.)
  4. tcp6 0 0 :::8080 :::* LISTEN 3279/java

浏览器访问查看

根据启动脚本编写重启脚本如下

  1. [tomcat@linux-node1 bin]$ pwd
  2. /usr/local/tomcat/bin
  3. [tomcat@linux-node1 bin]$ cat tomcat-start-stop.sh
  4. #!/bin/bash
  5. usage(){
  6. echo "Usage: $0 [start|stop|status]"
  7. }
  8. status_tomcat(){
  9. ps aux | grep java | grep tomcat | grep -v 'grep'
  10. }
  11. start_tomcat(){
  12. /usr/local/tomcat/bin/startup.sh
  13. }
  14. stop_tomcat(){
  15. TPID=$(ps aux | grep java | grep tomcat | grep -v 'grep' | awk '{print $2}')
  16. kill -9 $TPID
  17. sleep 5;
  18. TSTAT=$(ps aux | grep java | grep tomcat | grep -v 'grep' | awk '{print $2}')
  19. if [ -z $TSTAT ];then
  20. echo "tomcat stop"
  21. else
  22. kill -9 $TSTAT
  23. fi
  24. }
  25. main(){
  26. case $1 in
  27. start)
  28. start_tomcat;;
  29. stop)
  30. stop_tomcat;;
  31. status)
  32. status_tomcat;;
  33. *)
  34. usage;
  35. esac
  36. }
  37. main $1

五、学习tomcat配置文件

5.1 学习server.xml

  1. <Connector port="8080" protocol="HTTP/1.1" #http监听8080端口
  2. connectionTimeout="20000"
  3. redirectPort="8443" /> #https 8443端口
  4. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> #AJP通信方式8009端口
  5. <Server port="8005" shutdown="SHUTDOWN">
  6. <Listener # telent端口 className="org.apache.catalina.startup.VersionLoggerListener" />
  7. ```
  8. ##5.2 学习 tomcat-users.xml
  9. ```bash
  10. [tomcat@linux-node1 webapps]$ pwd
  11. /usr/local/tomcat/webapps #tomcat 默认的根路径
  12. [tomcat@linux-node1 webapps]$ ll
  13. total 8
  14. drwxr-xr-x 14 tomcat tomcat 4096 Mar 19 21:57 docs
  15. drwxr-xr-x 6 tomcat tomcat 78 Mar 19 21:57 examples
  16. drwxr-xr-x 5 tomcat tomcat 82 Mar 19 21:57 host-manager #用户管理,登录使用
  17. drwxr-xr-x 5 tomcat tomcat 97 Mar 19 21:57 manager
  18. drwxr-xr-x 3 tomcat tomcat 4096 Mar 19 21:57 ROOT #默认的访问路径

修改tomcat-users.xml,配置一个登录用户tomcat

  1. [tomcat@linux-node1 conf]$ tail -4 tomcat-users.xml
  2. <role rolename="manager-gui"/> #默认的role
  3. <role rolename="admin-gui"/> #自己设置的role
  4. <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> #用户密码以及role
  5. </tomcat-users>
  6. [tomcat@linux-node1 bin]$ ./tomcat-start-stop.sh stop
  7. tomcat stop
  8. [tomcat@linux-node1 bin]$ ./tomcat-start-stop.sh start
  9. Using CATALINA_BASE: /usr/local/tomcat
  10. Using CATALINA_HOME: /usr/local/tomcat
  11. Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  12. Using JRE_HOME: /usr/local/jdk
  13. Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
  14. Tomcat started.

浏览器登录主机管理界面,生产场景管理界面可以通过nginx代理设置一个登录界面,对于运维来说管理界面还是很有用的

 

 从下图看出,主机管理可以用来添加主机,每个server的详情,,实际生产建议关闭!

 

从下图可以看出,JVM使用详情,8009和8080端口的使用详情,生产场景JVM状态使用建议打开

 

 从下图可以看出,管理app界面可直接上传war包部署,配置xml,极其危险,生产环境建议关闭

 

 

生产环境关闭app管理和主机管理的方法,具体文件再进行具体调整

  1. [tomcat@linux-node1 webapps]$ mv host-manager/ examples/ /tmp/
  2. 111

启动tomcat的注意事项,每次启动都会生成temp和work目录,实际生产环境建议每次tomcat启动都将此两个目录情况情况,否则会因为缓存问题产生异常

  1. [tomcat@linux-node1 tomcat]$ ll
  2. total 100
  3. drwxr-xr-x 2 tomcat tomcat 4096 Mar 19 22:38 bin
  4. drwxr-xr-x 3 tomcat tomcat 4096 Mar 19 22:36 conf
  5. drwxr-xr-x 2 tomcat tomcat 4096 Mar 19 21:57 lib
  6. -rw-r--r-- 1 tomcat tomcat 57011 Feb 3 03:39 LICENSE
  7. drwxr-xr-x 2 tomcat tomcat 4096 Mar 19 22:05 logs
  8. -rw-r--r-- 1 tomcat tomcat 1444 Feb 3 03:39 NOTICE
  9. -rw-r--r-- 1 tomcat tomcat 6741 Feb 3 03:39 RELEASE-NOTES
  10. -rw-r--r-- 1 tomcat tomcat 16195 Feb 3 03:39 RUNNING.txt
  11. drwxr-xr-x 2 tomcat tomcat 29 Mar 19 21:57 temp
  12. drwxr-xr-x 7 tomcat tomcat 76 Feb 3 03:38 webapps
  13. drwxr-xr-x 3 tomcat tomcat 21 Mar 19 22:05 work

六、生产环境tomcat规范

  • telnet管理端口保护 
       更改8005(更改为8000~8999之间即可)端口,和SHOTDOWN字符串
  • ajp链接端口保护,或者直接注释配置文件 
       更改8005(更改为8000~8999之间即可)端口,通过iptables限制此端口,或者直接注释配置文件
  • 禁用管理 
       1)删除默认的{Tomcat安装目录}/conf/tomcat-users.xml文件,重启tomcat后将会自动生成新的文件; 
       2)删除{Tomcat安装目录}/webapps下默认的所有目录和文件; 
       3)将tomcat 应用根目录配置为tomcat安装目录以外的目录;
  • 降权启动 
       1)tomcat启动用户权限必须为非root权限,尽量降低tomcat启动用户的目录访问权限; 
       2)如需直接对外使用80端口,可通过普通账号启动后,配置iptables规则进行转发;
  • 文件列表访问限制 
       conf/web.xml文件中default部分listings的配置必须为false;
  • 版本信息隐藏 
       1)修改conf/web.xml,重定向403、404以及500等错误到指定的错误页面; 
       2)也可以通过修改应用程序目录下的WEB-INF/web.xml下的配置进行错误页面的重定向;
  • Server header重写 
       在HTTP Connector配置中加入server的配置,server=”chuck-server”
  • 通过配置,限定访问的ip来源 
       allow=”61.148.18.138,61.135.165.” deny=”...*”/
  • 起停脚本权限回收 
       去除其他用户对Tomcat的bin目录下shutdown.sh、startup.sh、catalina.sh的可执行权限
  • 访问日志格式规范 
       开启Tomcat默认访问日志中的Referer和User-Agent记录
  • 关闭自动部署(根据自己实际情况) 
       autoDeploy=”false”>

七、tomcat的调优

7.1 外部调优

  • 操作系统调优
  • JVM调优,具体的调优详解请看后续博客文章 
    1)调整JVM内存使用 
    2)使用什么垃圾回收器
  • nginx代理调优

7.2 内部调优

  • maxThreads=”150” #最大线程数
  • minSpareThreads=”4” #初始化创建的线程数
  • maxSpareThreads=”500” #一旦创建的线程超过这个值,tomcat就会关闭不在需要的socket线程
  • acceptCount=”700” #指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队里的请求数,超过这个数将不予处理
  • compression=”on” compressionMinSize=”2048” compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain” #tomcat压缩,压缩起始大小为2048K和压缩类型
  • enableLookups=”false” #关闭dns查询
  • disableUploadTimeout=”25” #关闭上传超时
  • connectionTimeout=”20000” #链接超时
  • SSLEnabled=”true” #开启ssl加密,https时使用 
    附生产实际配置文件一个
  1. <Connector port="8080" protocol="HTTP/1.1"
  2. URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75"
  3. enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"
  4. acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5"
  5. useURIValidationHack="false"
  6. compression="on" compressionMinSize="2048"
  7. compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
  8. SSLEnabled="true"
  9. scheme="https" secure="true"
  10. clientAuth="false" sslProtocol="TLS"
  11. keystoreFile="d:/tomcat2/conf/shnlap93.jks" keystorePass="aaaaaa"
  12. />

7.3 开启jvm远程查看

更改启动参数

  1. echo "CATALINA_OPTS="$CATALINA_OPTS
  2. -Dcom.sun.management.jmxremote # 启用远程调用
  3. -Dcom.sun.management.jmxremote.port=12345 #端口12345 -Dcom.sun.management.jmxremote.authenticate=false #关闭验证
  4. -Dcom.sun.management.jmxremote.ssl=false #关闭ssl加密
  5. -Djava.rmi.server.hostname=192.168.56.222"" #本地主机ip >> /usr/local/tomcat/bin/catalina.sh

本地下载java,打开jconsole.exe,链接到jvm主机上

 

下图概览中显示了堆内存,线程和类的使用情况

下图显示了堆内存的使用详情,执行GC,会造成内存回收,应用卡顿,其他项目不再一一介绍

 

打开jvisualvm,可同时链接多个jvm主机

可以连接多个远程主机 

cpu,堆内存,类,和线程使用情况

 

线程详细情况

 

八、使用zabbix监控tomcat

8.1 方法一:zabbix-server安装gateway

  • 源码安装 
    指定编译参数和配置文件,包括zabbix-server端的gateway配置,和tomcat的gatewa配置:安装方法
  • yum安装 
    yum install -y zabbix-java-gateway.x86_64

8.2 方法二:java客户端命令行格式

下载jar包:cmdline-jmxclient_-0.10.3._jar

  1. java -jar cmdline-jmxclient-0.10.3.jar - localhost:12345 java.lang:type=Memory NonHeapMemoryUsage
  2. 01/26/2014 11:55:55 +0800 org.archive.jmx.Client NonHeapMemoryUsage:
  3. committed: 52690944
  4. init: 24313856
  5. max: 136314880
  6. used: 52454776

获取到值后通过zabbix-key的方式传送给zabbix-server,进行监控

posted @ 2018-03-08 13:29  秋天的风吹过原野  阅读(348)  评论(0编辑  收藏  举报