JAVA介绍

Java有很多常见的名词,由于java是通过过java虚拟机运行的,所以在运行java的主机上需要配置java环境,常见的名词有如下几种:

  • JDK: Java 开发工具
  • JRE: Java运行环境
  • SDK:软件开发工具,包含一系列工具包
  • J2EE: Java平台企业版
  • J2SE: Java平台标准版
  • J2ME: Java平台微型版(手机端等)

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

Tomcat安装部署

Tomcat需要java的运行环境,在安装Tomcat时,需要安装JDK.

yum install java -y

在官方下载pache-tomcat-8.5.9.tar.gz, 解压到/usr/local目录下,并创建软链接:

ln -s  /usr/local/apache-tomcat-8.5.9    /usr/local/tomcat

添加系统账户tomcat,并添加文件权限:

useradd  -u 1001 tomcat 
chown -R  tomcat:tomcat  /usr/local/tomcat

启动tomcat:

 /usr/local/tomcat/bin/startup.sh 

通过查看端口,可以发现启动了8080,8005和8009端口:

[root@localhost local]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp6       0      0 :::8009                 :::*                    LISTEN      9229/java           
tcp6       0      0 :::8080                 :::*                    LISTEN      9229/java                 
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      9229/java      

tomcat的服务器主配置文件在/usr/local/tomcat/conf/server.xml中,其中指定了默认的3个端口:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  • 8080: web服务器访问的端口
  • 8009:AJP包重定向协议端口,用于本机对其它web服务器发起的连接
  • 8005:用于发送shutdown指令,生产情况下需要修改此端口和命令。

tomcat的站点根目录为:/usr/local/tomcat/webapps/ROOT
当修改tomcat的配置文件之后需要重启服务(使用tomcat用户):

$ /usr/local/tomcat/bin/shutdown.sh
$ /usr/local/tomcat/bin/startup.sh 

提示:在生产环境中,有时通过tomcat自带的脚本是无法停止服务的,一般会自定义脚本,使用kill 命令来结束进程,也可以多次使用kill -9 命令终止服务。
在重启tomcat服务前,需要删除上次启动服务所加载的缓存文件,默认目录为/usr/local/tomcat/work/usr/local/tomcat/temp 避免缓存原因造成不必要的问题。

Tomcat 服务状态管理

Tomcat在默认的其实页面列出了后端管理的选项,生产中可以利用这些状态参数监控tomcat服务器的运行情况。在默认的设置中,是没有权限查看的,如果要实现特定IP段访问Tomcat服务器服务状态信息,需要配置tomcat-users.xml文件。
添加用的访问权限,在/usr/local/tomcat/conf/tomcat-users.xml末尾添加用户和授权:

# vim /usr/local/tomcat/conf/tomcat-users.xml 

 <role rolename="manager-gui" />
 <role rolename="admin-gui" />
 <user username="tomcat" password="1qaz2wsx" roles="manager-gui" />
</tomcat-users>

修改上述文件需要重启tomcat,配置完成之后就可以在本机访问后端的管理信息。
如果让除本机之外的其他IP段访问tomcat管理节点信息,需要修改context.xml
Tomcat在8.5.4及以上版本对&lt;tomcat&gt;/webapps/manager/META-INF/context.xml 做出了调整,只需要修改对应的allow IP正则部分即可:

<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
</Context>

将127部分修改为其他网段的地址,\d 表示[0-9],如果只是单独修改此 context.xml 不需要重启tomcat即可生效。

为了安全,需要移除多余的后台管理组件,可以将/usr/local/tomcat/webapps目录下的host-managerexamples,docs目录直接移除。

Tomcat 安全设置

  1. 管理端口配置
    系统监听的8005端口可以实现关闭tomcat服务,这里需要关闭此端口或修改SHUTDOWN命令:

    # netstat -lntp|grep 8005
    tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      10914/java          

    在配置文件server.xml将端口修改为8792,SHUTDOWN命令修改为DONTTUCH:

    <Server port="8792" shutdown="DONTTOUCH">

    重启tomcat后端口改变,即时连上此端口,使用原来的SHUTDOWN命令也无法关闭tomcat了:

    # netstat -lntp|grep 8792
    tcp6       0      0 127.0.0.1:8792          :::*                    LISTEN      11000/java          

    8009 ajp端口的管理也需要进行配置,默认情况下可以关闭此端口。
    将配置文件中的此项配置注释掉:

    <!--
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 
    -->
  • 禁用管理端

    • 删除安装目录下默认的conf/tomcat-user.xml文件,重启tomcat。
    • 删除tomcat安装目录webapps中的默认所有文件和目录
    • 将tomcat应用根目录配置为tomcat安装目录之外的其他目录,添加docBase:
      <Context path="webapps" docBase="/home/work/local/tomcat_webapps" debug="0
      " reloadable="false" crossContext="true" />
  • 降权设置
    • 禁止root权限用户启动服务,尽量降低tomcat用户的目录访问权限。如果要使用80端口,可以配置iptables进行转发。
    • 文件列表的访问控制:conf/web.xml文件listings的配置文件必须为false(默认为false)禁止读取文件列表。
      <param-name>listings</param-name>
      <param-value>false</param-value>
  • 版本信息的隐藏:
    修改conf/web.xml中定向到403,404,500等错误页面到指定的错误页,从而避免tomcat返回的错误页面中暴露的系统版本信息。
    也可以通过修改应用程序目录下的WEB-INF/web.xml下的配置进行错误页面的重定向。

  • 修改header请求头,修改header响应的请求头信息,在HTTP Connector配置中加入server的配置:
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               server="TRYINH"
             />
    $ curl --head http://172.16.10.60:8080/
    HTTP/1.1 200 
    Content-Type: text/html;charset=UTF-8
    Transfer-Encoding: chunked
    Date: Tue, 10 Jan 2017 07:08:25 GMT
    Server: TRYINH

Tomcat调优

Tomcat调优主要是对Tomcat自身内部进行调优和对外部应用和组件进行调优,外部的调优主要是操作系统,JVM,Nginx代理等,Tomcat自身的调优主要是禁止DNS查询,调整线程数,压缩等。

  1. 禁止DNS查询
    当web应用程序要记录客户端的信息时,会记录客户端的IP地址或者通过域名服务器查找机器名 转换为IP地址,但是DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP,这样会消耗一定的时间。修改server.xml文件中的Connector元素,修改属性enableLookups参数值为false,若为false则不进行DNS查询,而是返回其ip地址:

    <Connector  
    port="8887" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  
    enableLookups="false" redirectPort="8443" acceptCount="100"  debug="0" connectionTimeout="20000"  disableUploadTimeout="true" /> 
    • 调整线程数
      maxThreads="600"       ///最大线程数
      minSpareThreads="100" ///初始化时创建的线程数maxSpareThreads="500" ///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
      acceptCount="700" //指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
    <Connector port="80" protocol="HTTP/1.1" maxThreads="600"  minSpareThreads="100" 
    maxSpareThreads="500" acceptCount="700" connectionTimeout="20000" redirectPort="8443" />
    • 启用压缩
      Tomcat有一个通过在server.xml配置文件中设置压缩的选项。压缩可以在connector像如下设置中完成:
      <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8181" compression="on" compressionMinSize="2048" 
      compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
  • JVM堆内存优化
    Tomcat默认的内存参数比较小,在实际的生产环境中容易造成性能瓶颈,这种解决方法是通过增加JVM的栈内存实现的.在 linux系统下,内存优化需要修改TOMCAT_HOME/bin/catalina.sh,在文件末尾添加如下内容(最大堆内存是1024m):
    JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"

    -Xms – 指定初始化时化的堆内存
    -Xmx – 指定最大堆内存