服务器名称

ip地址

slave-node1

172.16.1.91

27.1、 Tomcat简介:

Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。

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

JSP程序的首选。Tomcat和Nginx、Apache(httpd)、lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器

是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。目前Tomcat最新版本为9.0。Java容器还有resin、weblogic等。

27.2、软件准备:

JDK下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Tomcat下载:https://tomcat.apache.org/download-80.cgi

[root@slave-node1 ~]# cd tools/

[root@slave-node1 tools]# rz -y

rz waiting to receive.

Starting zmodem transfer. Press Ctrl+C to cancel.

Transferring apache-tomcat-8.5.37.tar.gz...

100% 9427 KB 9427 KB/sec 00:00:01 0 Errors

Transferring jdk-8u192-linux-x64.tar.gz...

100% 187262 KB 17023 KB/sec 00:00:11 0 Errors

27.3、准备java环境:

[root@slave-node1 tools]# tar -xzf jdk-8u192-linux-x64.tar.gz -C /application/

[root@slave-node1 tools]# mkdir /application/

[root@slave-node1 tools]# ln -s /application/jdk1.8.0_192/ /application/jdk

[root@slave-node1 tools]# sed -i.ori '$a export JAVA_HOME=/application/jdk\nexport CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar\nexport PATH=$JAVA_HOME/bin:$PATH' /etc/profile

[root@slave-node1 tools]# source /etc/profile

[root@slave-node1 tools]# java -version

java version "1.8.0_192"

Java(TM) SE Runtime Environment (build 1.8.0_192-b12)

Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)

[root@slave-node1 tools]# echo $JAVA_HOME

/application/jdk

27.4、准备tomcat环境:

[root@slave-node1 tools]# tar -xzf apache-tomcat-8.5.37.tar.gz -C /application/

[root@slave-node1 tools]# ln -s /application/apache-tomcat-8.5.37/ /application/tomcat

27.5、tomcat目录介绍:

[root@slave-node1 tools]# tree /application/tomcat/ -L 1

.

├── bin #用于启动、关闭tomcat或其它功能的脚本

├── BUILDING.txt

├── conf #用于配置tomcat的xml文件

├── CONTRIBUTING.md

├── lib #存放web应用能访问的JAR包

├── LICENSE

├── logs #catalina和其它web应用程序的日志文件

├── NOTICE

├── README.md

├── RELEASE-NOTES

├── RUNNING.txt

├── temp #存放临时文件的目录

├── webapps #web应用程序根目录,即站点目录

└── work #存放产生有jsp编译出的servlet的.java和.class文件

7 directories, 7 files

[root@slave-node1 tools]# tree /application/tomcat/webapps/ -L 1

.

├── docs #tomcat帮助文档目录

├── examples #web应用实例目录

├── host-manager #管理目录

├── manager #管理目录

└── ROOT #默认网站根目录

27.5、启动tomcat:

使用普通用户'tomcat'启动tomcat服务,能够提高系统的安全性;

[root@slave-node1 tools]# useradd tomcat

[root@slave-node1 tools]# chown -R tomcat.tomcat /application/tomcat/

[root@slave-node1 tools]# su - tomcat

[root@slave-node1 ~]$ /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.

[root@slave-node1 ~]$ su - root

[root@slave-node1 ~]# netstat -tunlp | grep java

tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 14770/java

tcp 0 0 :::8009 :::* LISTEN 14770/java

tcp 0 0 :::8080 :::* LISTEN 14770/java

[root@slave-node1 ~]# ps -ef | grep "tomcat" | grep -v "grep"

root 12081 11488 0 23:50 pts/1 00:00:00 su - tomcat

tomcat 12082 12081 0 23:50 pts/1 00:00:00 -bash

tomcat 12138 1 4 23:51 pts/1 00:00:20 //bin/java -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manag

er=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -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=172.16.1.91 -Dignore.endorsed.dirs= -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

27.6、访问网站:

27.7、tomcat日志:

[root@slave-node1 ~]# tree /application/tomcat/logs/ -L 1

.

├── catalina.2018-12-26.log

├── catalina.out #tomcat的实时日志

├── host-manager.2018-12-26.log

├── localhost.2018-12-26.log

├── localhost_access_log.2018-12-26.txt #访问日志

└── manager.2018-12-26.log

0 directories, 6 files

27.8、tomcat配置文件:

[root@slave-node1 ~]# tree /application/tomcat/conf/ -L 1

.

├── Catalina

├── catalina.policy

├── catalina.properties

├── context.xml

├── jaspic-providers.xml

├── jaspic-providers.xsd

├── logging.properties

├── server.xml #tomcat主配置文件

├── tomcat-users.xml #tomcat管理用户配置文件

├── tomcat-users.xsd

└── web.xml

1 directory, 10 files

27.9、tomcat管理:

测试功能,用于测试环境,生产环境不要用;

Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。

如果需要开启这个功能,就需要配置管理用户,即配置前面说过的tomcat-users.xml。

[root@slave-node1 ~]# vim /application/tomcat/conf/tomcat-users.xml

<role rolename="manager-gui"/>

<role rolename="admin-gui"/>

<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>

</tomcat-users> #在此行前加入上面三行

[root@slave-node1 ~]# vim /application/tomcat/webapps/manager/META-INF/context.xml

<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" />

#需要将<Valve .... />该段代码注释掉,不然会报403错误;

<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache

(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>

</Context>

#重启tomcat:

[root@slave-node1 ~]# su - tomcat /application/tomcat/bin/shutdown.sh

[root@slave-node1 ~]# su - tomcat /application/tomcat/bin/startup.sh

#访问:

27.10、tomcat主配置文件server.xml详解:

1、server.xml组件类别:

(1)顶级组件:位于整个配置的顶层,如server;

(2)容器类组件:可以包含其它的组件,如service、engine、host、context

(3)连接类组件:连接用户请求至tomcat,如connector

(4)被嵌套类组件:位于一个容器当中,不能包含其他组件,如value、logger

2、组件:

<server>

<service>

<connector />

<engine>

<host>

<context></context>

</host>

<host>

<context></context>

</host>

</engine>

</service>

</server>

3、组件详解:

(1)engine:核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host。

(2)host:类似于httpd中的虚拟主机,一般而言支持基于FQDN的虚拟主机。

(3)context:定义一个应用程序,是一个最内层的容器类组件(不能再嵌套)。配置context的主要目的指定对应对的webapp的

根目录,类似于httpd的alias,其还能为webapp指定额外的属性,如部署方式等。

(4)connector:接收用户请求,类似于httpd的listen配置监听端口的。

(5)service:将connector关联至engine,因此一个service内部可以有多个connector,但只能有一个引擎engine。service内部

有两个connector,一个engine。因此,一般情况下一个server内部只有一个service,一个service内部只有一个engine,但一个service

内部可以有多个connector。

(6)server:表示一个运行于JVM中的tomcat实例。

(7)Valve:阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve)、

基于IP做访问控制(remote address filter valve)。

(8)logger:日志记录器,用于记录组件内部的状态信息,可以用于除context外的任何容器中。

(9)realm:可以用于任意容器类的组件中,关联一个用户认证库,实现认证和授权。可以关联的认证库有两种:UserDatabaseRealm、

MemoryRealm和JDBCRealm。

(10)UserDatabaseRealm:使用JNDI自定义的用户认证库。

(11)MemoryRealm:认证信息定义在tomcat-users.xml中。

(12)JDBCRealm:认证信息定义在数据库中,并通过JDBC连接至数据库中查找认证用户。

4、 配置文件内容详解:

<?xml version="1.0" encoding="UTF-8"?>

<Server port="8005" shutdown="SHUTDOWN">

<!-- "port"表示Tomcat监听shutdown命令的端口,默认是8005,"shutdown"表示

指定终止Tomcat服务器运行时发给Tomcat服务器的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="Catalina">

<Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443" />

<!--

Connector:接收用户请求,类似于httpd的listen配置监听端口

port:指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求

address:指定连接器监听的地址,默认为所有地址(即0.0.0.0)

protocol:连接器使用的协议,支持HTTP(tomcat与nginx建立通信)和AJP(tomcat与apache建立通信)

minProcessors:服务器最小创建的处理请求的线程数(最小并发数)

maxProcessors:服务器最大创建的处理请求的线程数(最大并发数)

enableLookups:为true(默认)时调用"request.getRemoteHost()"方法进行DNS查询获得远程客户端的实际主机

名,为false则不进行DNS查询,返回的是远程客户端的ip地址;

redirectPort:指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号

acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过

这个数的请求将不予处理

connectionTimeout:指定连接超时的时间数(以毫秒为单位)

-->

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

<!-- 连接apache时使用,端口号默认为8009,如果在多实例的情况下,不注释只会起一个端口,不会影响到多实例的启动,

在生产环境中使用的是nginx做负载均衡,该段配置会被注释掉;

-->

<Engine name="Catalina" defaultHost="localhost">

<!-- 配置tomcat接收用户请求的默认主机,一般不做修改,默认是本地主机 -->

<Realm className="org.apache.catalina.realm.LockOutRealm">

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"

resourceName="UserDatabase"/>

</Realm>

<Host name="localhost" appBase="webapps"

unpackWARs="true" autoDeploy="true">

<!--

Host:表示一个虚拟主机

name:虚拟主机的域名,一般不做修改,因为一般一个tomcat服务只放一个站点,类似于nginx中的域名配置;

appBase:应用程序基本目录(站点目录),即存放应用程序的目录,默认appBase="webapps",相对于

"CATALINA_HOME"而言的,也可以写绝对路径,默认站点应用程序在该目录的ROOT目录下;

unpackWARs:为true(默认)表示tomcat会自动将WAR文件解压,false表示不解压

autoDeploy:在tomcat启动时,是否自动部署(默认自动部署)

xmlValidation:是否启动xml的校验功能,默认xmlValidation="false"

xmlNamespaceAware:检测名称空间,默认xmlNamespaceAware="false"

-->

<!-- <Context path="" docBase="web_name" debug="0" reloadable="true"/> -->

<!--

Context:表示一个web应用程序,通常为WAR文件

path:表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/<应用程序名>

docBase:应用程序的存放的路径,起始路径为此Context所属Host中appBase定义的路径,可以使用相对路径也可以使用绝对路径

reloadable:为true时tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,在不重启tomcat的情况下自动装载新

的应用程序(默认下是没有开启该功能的)

说明:该配置是设置默认站点应用程序的一种方法,优先级最高;

-->

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

prefix="localhost_access_log" suffix=".txt"

pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

</Engine>

</Service>

</Server>

27.11、web站点部署:

1、上线的代码有两种方式,第一种方式是直接将程序目录放在webapps目录下面然后输入http://172.16.1.91:8080/web_name进行访问;第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面,默认情况下回自动解压;

2、打war包的方法:

(1)jar -cf webapp.war webapp\" #表示将指定的文件夹进行打包;

(2)jar -cf webapp.war . #表示将当前目录下的所有文件进行打包;

3、解压war包的方法:

jar -xf webapp.war

27.12、tomcat多实例配置:

1、环境准备:

(1)复制出多个tomcat应用:

[root@slave-node1 ~]# cp -a /application/apache-tomcat-8.5.37/ /application/apache-tomcat-8.5.37-8080/

[root@slave-node1 ~]# cp -a /application/apache-tomcat-8.5.37/ /application/apache-tomcat-8.5.37-8081/

[root@slave-node1 ~]# rm -rf /application/apache-tomcat-8.5.37/

[root@slave-node1 ~]# rm -f /application/tomcat

[root@slave-node1 ~]# ln -s /application/apache-tomcat-8.5.37-8080/ /application/tomcat-8080

[root@slave-node1 ~]# ln -s /application/apache-tomcat-8.5.37-8081/ /application/tomcat-8081

(2)为tomcat应用包赋予普通用户的权限:

[root@slave-node1 ~]# chown -R tomcat.tomcat /application/tomcat-8080/

[root@slave-node1 ~]# chown -R tomcat.tomcat /application/tomcat-8081/

(3)创建站点目录:

[root@slave-node1 ~]# mkdir -p /data/www/tomcat/ROOT/

[root@slave-node1 ~]# cd /data/www/tomcat/ROOT/

[root@slave-node1 ROOT]# rz -y

[root@slave-node1 ROOT]# ls

memtest.war

[root@slave-node1 ROOT]# jar -xf memtest.war && rm -f memtest.war && mv meminfo.jsp index.jsp

[root@slave-node1 ROOT]# ls

index.jsp META-INF

[root@slave-node1 ROOT]# cd ~

[root@slave-node1 ~]# chown -R tomcat.tomcat /data/www/tomcat/

2、修改server.xml文件:

(1)修改端口号:

[root@slave-node1 ~]# sed -i.ori '22s#8005#8010#;69s#8080#8080#' /application/tomcat-8080/conf/server.xml

[root@slave-node1 ~]# sed -i.ori '22s#8005#8011#;69s#8080#8081#' /application/tomcat-8081/conf/server.xml

(2)配置tomcat多实例使用同一个站点目录下的应用:

[root@slave-node1 ~]# sed -i '148s#webapps#/data/www/tomcat#' /application/tomcat-8080/conf/server.xml

[root@slave-node1 ~]# sed -i '148s#webapps#/data/www/tomcat#' /application/tomcat-8081/conf/server.xml

3、tomcat优化配置:

(1)屏蔽dns查询、增大服务器超时时间、限制最大并发量(性能优化):

[root@slave-node1 ~]# sed -i '70s#connectionTimeout="20000"#connectionTimeout="6000" enableLookups="false" acceptCount="800"#' /application/tomcat-8080/conf/server.xml

[root@slave-node1 ~]# sed -i '70s#connectionTimeout="20000"#connectionTimeout="6000" enableLookups="false" acceptCount="800"#' /application/tomcat-8081/conf/server.xml

(2)关闭ajp连接(安全优化):

[root@slave-node1 ~]# sed -i '116s#<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />#<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->#' /application/tomcat-8080/conf/server.xml

[root@slave-node1 ~]# sed -i '116s#<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />#<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->#' /application/tomcat-8081/conf/server.xml

(3)jvm优化(性能优化):

[root@slave-node1 ~]# sed -i.ori '117a 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"' \

/application/tomcat-8080/bin/catalina.sh

[root@slave-node1 ~]# sed -i.ori '117a 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"' \

/application/tomcat-8081/bin/catalina.sh

(4)删除tomcat管理配置(安全优化):

[root@slave-node1 ~]#

dir_array=(docs examples host-manager html manager)

for n in {0..1}; do

for ((i=0;i<${#dir_array[*]};i++)); do

rm -rf /application/tomcat-808$n/webapps/${dir_array[$i]}

done

done

[root@slave-node1 ~]# for n in {0..1};do rm -rf /application/tomcat-808$n/webapps/ROOT/*;done

4、启动多实例:

[root@slave-node1 ~]# for n in {0..1};do su - tomcat /application/tomcat-808$n/bin/startup.sh;sleep 20s;done

[root@slave-node1 ~]# netstat -tunlp | grep java

tcp 0 0 ::ffff:127.0.0.1:8010 :::* LISTEN 3547/java

tcp 0 0 ::ffff:127.0.0.1:8011 :::* LISTEN 3567/java

tcp 0 0 :::8080 :::* LISTEN 3547/java

tcp 0 0 :::8081 :::* LISTEN 3567/java

[root@slave-node1 ~]# ps -ef | grep tomcat | grep -v "grep"

tomcat 27195 1 1 18:27 pts/0 00:00:09 //bin/java -Djava.util.logging.config.file=/application/tomcat-8080/conf/logging.properties -Djava.util.logging.

manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -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=172.16.1.91 -Dignore.endorsed.dirs= -classpath /application/tomcat-8080/bin/bootstrap.jar:/application/tomcat-8080/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat-8080 -Dcatalina.home=/application/tomcat-8080 -Djava.io.tmpdir=/application/tomcat-8080/temp org.apache.catalina.startup.Bootstrap start

tomcat 27239 1 1 18:27 pts/0 00:00:08 //bin/java -Djava.util.logging.config.file=/application/tomcat-8081/conf/logging.properties -Djava.util.logging.

manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12346 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=172.16.1.91 -Dignore.endorsed.dirs= -classpath /application/tomcat-8081/bin/bootstrap.jar:/application/tomcat-8081/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat-8081 -Dcatalina.home=/application/tomcat-8081 -Djava.io.tmpdir=/application/tomcat-8081/temp org.apache.catalina.startup.Bootstrap start

5、测试:

(1)在浏览器中输入http://172.16.1.91:8080:

(2)在浏览器中输入http://172.16.1.91:8081:

27.13、tomcat的nginx负载均衡:

1、安装nginx:

(1)下载nginx:

cd /tools/

wget http://nginx.org/download/nginx-1.16.0.tar.gz

(2)安装:

yum install openssl openssl-devel gcc pcre pcre-devel -y

useradd -M -s /sbin/nologin www

tar -xzf nginx-1.16.0.tar.gz

cd /tools/nginx-1.16.0/

./configure --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --prefix=/application/nginx-1.16.0/

echo $?

0

make install

echo $?

0

ln -s /application/nginx-1.16.0/ /application/nginx

(3)启动nginx:

/application/nginx/sbin/nginx

ps -ef | grep nginx | grep -v "grep"

root 5230 1 0 23:56 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx

www 5231 5230 0 23:56 ? 00:00:00 nginx: worker process

2、配置nginx负载均衡:

(1)清理注释的配置:

sed -ri.ori "/#|^$/d" /application/nginx/conf/nginx.conf

(2)创建nginx的配置文件目录:

mkdir /application/nginx/conf/conf.d/ -p

(3)修改配置文件:

1)主配置文件:

vim /application/nginx/conf/nginx.conf

worker_processes 1;

events {

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

include conf.d/*.conf;

}

2)包含配置文件:

vim /application/nginx/conf/conf.d/tomcat.conf

upstream tomcat_pools {

server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=60;

server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=60;

}

server {

listen 80;

server_name localhost;

location / {

proxy_pass http://tomcat_pools;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

}

}

3)验证配置文件:

/application/nginx/sbin/nginx -t

nginx: the configuration file /application/nginx-1.16.0//conf/nginx.conf syntax is ok

nginx: configuration file /application/nginx-1.16.0//conf/nginx.conf test is successful

3、重启nginx:

/application/nginx/sbin/nginx -s reload

ps -ef | grep nginx | grep -v "grep"

root 5230 1 0 7月17 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx

www 7612 5230 0 00:42 ? 00:00:00 nginx: worker process

netstat -tunlp | grep nginx

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5230/nginx: master

4、测试:

多次刷新页面时,页面上监控tomcat容器内存情况的数据会依次轮询;

1)http://172.16.1.91

2)http://172.16.1.91

27.14、小结:

1、tomcat安全优化:

(1)降权启动:

创建tomcat用户,并使用该用户启动tomcat;

(2)telnet管理端口保护:

更改8005 shutdown端口,监听的是127.0.0.1;

[root@slave-node1 ~]# netstat -tunlp | grep 8010

tcp6 0 0 127.0.0.1:8010 :::* LISTEN 2414/java

[root@slave-node1 ~]# telnet 127.0.0.1 8010

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

SHUTDOWN

Connection closed by foreign host.

[root@slave-node1 ~]# netstat -tunlp | grep 8010

(3)ajp连接端口保护:

关闭server.xml配置文件中ajp连接配置项;

(4)禁用管理端:

删除webapps应用程序下的"docs examples host-manager html manager"目录,并清空

ROOT目录下的所有内容;

2、tomcat性能优化:

(1)屏蔽dns查询:

在server.xml配置文件配置tomcat访问端口号处添加'enableLookups="false"'

(2)jvm优化:

1)说明:

Tomcat最吃内存,只要内存足够,这只猫就跑的很快;

如果系统资源有限,那就需要进行调优,提高资源使用率;

2)优化配置:

优化catalina.sh配置文件,在catalina.sh配置文件中117行的下面添加以下代码:

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"

3)jvm优化参数说明:

server:一定要作为第一个参数,在多个CPU时性能佳;

-Xms:初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些;

-Xmx:初始堆内存heap最大值,使用的最大内存;

#上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半;

-XX:PermSize:设定永久保存区域内存的初始空间;

-XX:MaxPermSize:设定永久保存区域内存的最大空间;

-XX:NewSize:表示新生代码初始内存的大小;

-XX:MaxNewSize:表示新生代码可被分配内存的最大上限;

#上面4个参数均设置为分配给jvm内存的一半;

-Xss 15120:这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512KB;

+XX:AggressiveHeap:会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap;

-Xss:每个线程的Stack大小;

-verbose:gc:现实垃圾收集信息;

-Xloggc:gc.log:指定垃圾收集日志文件;

-Xmn:young:generation的heap大小,一般设置为Xmx的3、4分之一;

-XX:+UseParNewGC:缩短minor收集的时间;

-XX:+UseConcMarkSweepGC:缩短major收集的时间;

3、tomcat多实例访问:

(1)tomcat的并发访问数约为700-800,所以一个tomcat就是一个站点,不会再配置多余的虚拟主机,增加并发访问量的方法是通过

tomcat多实例来实现的,常用的负载均衡架构是nginx+tomcat(多实例),所有tomcat都使用统一的站点目录;

(2)一个tomcat实例只能使用一个zabbix监控端口(默认12345),具体监控参见"9.4、安装zabbix"监控tomcat小节;

(3)tomcat多实例内存分配原则:

列如:8核8G内存的服务器跑4个tomcat实例:

分配原则:服务器自留2G的内存,然后每个tomcat分jvm分配1.5G;

(4)tomcat本身是好的,有垃圾回收机制,但是挡不住代码烂,结果就是会导致tomcat内存占用量一直升高,得不到释放,导致程序

访问变慢,解决的方法是改代码(可能性小)或重启tomcat服务(可以做定时任务,在夜里定时重启tomcat服务,需要注意的是多实例不能

同时重启,要一个一个的去重启)

4、访问:

(1)tomcat默认启动监听的是8080端口,监听所有的网卡,在连接器组件中可以更改监听的IP地址;

(2)一个appBase="webapps"目录下可以放置多个web应用,根据不同的web应用名进行区分访问,也可以直接指定appBase的路径(相对和绝对路径都可),

也可以通过Context组件设置默认访问的服务;

(3)一台服务器可以部署多个tomcat服务,是靠端口号进行区分的,需要改变的是conf/service.xml文件的两个端口号停止1、访问1个端口);

5、使用"show-busy-java-threads.sh"脚本监控tomcat的cpu使用率:

"show-busy-java-threads.sh"脚本用于快速排查Java的CPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出

其线程栈,从而确定导致性能问题的方法调用,目前只支持Linux,"https://github.com/oldratlee/useful-scripts"网站有比较详细的使用细则;

(1)下载脚本:

[root@slave-node1 tools]# cd /tools/

[root@slave-node1 tools]# git clone https://github.com/oldratlee/useful-scripts.git

(2)使用脚本:

[root@slave-node1 tools]# sh useful-scripts/show-busy-java-threads.sh

[1] Busy(1.9%) thread(1302/0x516) stack of java process(1037) under user(zabbix):

"VM Periodic Task Thread" os_prio=0 tid=0x00007f801c14a800 nid=0x516 waiting on condition

[2] Busy(0.0%) thread(1037/0x40d) stack of java process(1037) under user(zabbix):

[3] Busy(0.0%) thread(1117/0x45d) stack of java process(1037) under user(zabbix):

"main" #1 prio=5 os_prio=0 tid=0x00007f801c04b800 nid=0x45d runnable [0x00007f802654b000]

java.lang.Thread.State: RUNNABLE

at java.net.PlainSocketImpl.socketAccept(Native Method)

at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)

at java.net.ServerSocket.implAccept(ServerSocket.java:545)

at java.net.ServerSocket.accept(ServerSocket.java:513)

at com.zabbix.gateway.JavaGateway.main(JavaGateway.java:80)

[4] Busy(0.0%) thread(1230/0x4ce) stack of java process(1037) under user(zabbix):

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f801c05e800 nid=0x4ce runnable

[5] Busy(0.0%) thread(1231/0x4cf) stack of java process(1037) under user(zabbix):

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f801c060000 nid=0x4cf runnable

6、补充:单独配置Nginx的tomcat动态网站环境:

[root@nginx conf.d]# cat jsp.conf

server {

server_name localhost;

listen 80;

location / {

#root /soft/code;

try_files $uri @java_page;

#index index.jsp index.html;

}

location @java_page{

proxy_pass http://192.168.56.20:8080;

}

}

27、Tomcat服务的安装与配置的更多相关文章

  1. CentOS 7 Tomcat服务的安装与配置

    3422人阅读  http://blog.51cto.com/13525470/2073657 一.Linux下的Java运行环境 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由S ...

  2. Tomcat服务的安装与配置

    介绍 百度百科 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同开 ...

  3. Tomcat服务的安装及配置

    在进行Java Web开发时必须有Web服务器的支持,常用的Web服务器便是Tomcat,本文主要介绍Tomcat的安装和配置.客户端通过Web浏览器发送一个基于HTTP协议的请求到服务器上后,服务器 ...

  4. tomcat是什么?Tomcat 下载、安装、配置图文教程

    你用浏览器上网的所有操作,所有请求发送给服务器(tomcat),服务器通过请求,找相应的逻辑处理程序(jsp或servelet或java类,就是有关java语言的所有可以处理逻辑的代码,其中包括访问后 ...

  5. CentOS 6.5 下Nginx服务的安装与配置

    参考网站: http://www.cnblogs.com/zhuhongbao/archive/2013/06/04/3118061.html http://www.cnblogs.com/jilia ...

  6. Xinetd服务的安装与配置

    Xinetd服务的安装与配置 http://blog.chinaunix.net/uid-21411227-id-1826885.html 1.什么是xinetd xinetd即extended in ...

  7. 修改Tomcat服务中的端口配置

    1.修改Tomcat服务中的端口配置: 分别修改安装目录下的conf子目录中的server.xml文件(注意:两个文件中对应的端口号要不一样),修改如下 : a. 修改Shutdown端口(默认为80 ...

  8. 关于httpd服务的安装、配置

    httpd是Apache超文本传输协议(HTTP)服务器的主程序.通常,httpd不应该被直接调用,而应该在linux系统中由 apachectl 调用.接下来我们将了解有关httpd服务的安装与配置 ...

  9. 关于linux - Centos 7 下DHCP服务的安装与配置

    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP ...

随机推荐

  1. [ML] 高德软件的路径规划原理

    路径规划 Dijkstra s:起点:S:已知到起点最短路径的点:U:未知到起点最短路径的点 Step 1:S中只有起点s,从U中找出路径最短的 Step 2:更新U中的顶点和顶点对应的路径 重复St ...

  2. Centos7 cache/buff过高处理方法

    Centos7 cache/buff过高处理方法   kevinxliu关注0人评论36799人阅读2018-07-26 10:09:59   当linux运行久点,会产生很多不必要的cache或者b ...

  3. docker总结复习

    一.概念 1.容器( container-based )虚拟化方案,充分利用了操作系统本身已有的机制和特性,以实现轻量级的虚拟化(每个虚拟机安装的不是完整的虚拟机),甚至有人把他称为新一代的虚拟化技术 ...

  4. linux route命令的使用详解-(转自小C爱学习)

    route命令用于显示和操作IP路由表.要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现.在Linux系统中,设置路由通常是 为了解决以下问题:该Linu ...

  5. Nginx|Apache目录权限禁止执行PHP设置

    Ngnix: location ~ /upload/.*.(php|php5)?$ { deny all; } 这就是禁止upload内执行php,但是图片可以打开哦 多目录禁止: location ...

  6. 90%的人都不知道的Node.js 依赖关系管理(上)

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/nodejs-dependency-mana ...

  7. 『动善时』JMeter基础 — 24、JMeter中使用“用户参数”实现参数化

    目录 1.用户参数组件介绍 2.用户参数界面介绍 3.使用"用户参数"组件实现参数化 (1)测试计划内包含的元件 (2)线程组元件内容 (3)HTTP请求组件内容 (4)用户参数组 ...

  8. Spring 是什么?

    概述 Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好.易于测试.可重用的代码. Spring 框架是一个开源的 Ja ...

  9. Cannot resolve class or package 'mysql’处理方法

    在application.properties中配置mybatis_plus碰见报了这个错误 Cannot resolve class or package 'jdbc' 错误产生的原因 其实这个问题 ...

  10. Linux下Flash-LED的处理

    Linux下Flash-LED的处理 一些LED设备提供两种模式-torch和flash.在LED子系统中,LED类(参见Linux下的LED处理)和LED Flash类,分别支持这些模式.torch ...