36.Tomcat
1.Tomcat环境部署
[root@oldboy-ol02 ~]# ifconfig | grep inet
inet 10.0.0.123 netmask 255.255.255.0 broadcast 10.0.0.255
inet 172.16.1.123 netmask 255.255.255.0 broadcast 172.16.1.255
inet 127.0.0.1 netmask 255.0.0.0
(1)Tomcat简介
tomcat是一个web服务器,类似nginx,apache的http
nginx,http只能处理html等静态文件(jpg)
网页分为静态网页(以.html或者.htm结尾的url地址)和动态网页
nginx和http配合php就能够处理动态的网页(.php结尾)
tomcat也可以处理静态的html文件
tomcat配合jdk就能够处理动态的网页(.jsp结尾)
http://tomcat.apache.org/
//apache自由软件基金会下的众多软件,解释java语言的容器。
(2)Tomcat下载、安装
http://blog.oldboyedu.com/java-tomcat/
下载8.0下的8.0.50的Core的tar包:
http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.50/bin/apache-tomcat-8.0.50-windows-x86.zip
jdk 8u:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
选择:Linux x64 180.97 MB jdk-8u161-linux-x64.tar.gz
或者:
http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.0.50/bin/apache-tomcat-8.0.50.tar.gz
http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.tar.gz
执行下载命令:
[root@oldboy-ol02 opt]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.0.50/bin/apache-tomcat-8.0.50.tar.gz
[root@oldboy-ol02 opt]# wget http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.tar.gz
[root@oldboy-ol02 opt]# ll
total 194512
-rw-r--r--. 1 root root 9417189 Feb 8 04:52 apache-tomcat-8.0.50.tar.gz
-rw-r--r--. 1 root root 189756259 Mar 11 09:59 jdk-8u161-linux-x64.tar.gz
2.jdk部署与检查
jdk==》java虚拟机(jvm)
jdk类似于java命令解释器,为java提供解释环境,java虚拟机代替执行java命令。
[root@oldboy-ol02 opt]# tar xf jdk-8u161-linux-x64.tar.gz -C /application/
[root@oldboy-ol02 ~]# ln -s /application/jdk1.8.0_161/ /application/jdk
#java环境变量设置:
#export JAVA_HOME=/application/jdk
#export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
#export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
#
[root@oldboy-ol02 ~]# sed -i.ori '$a export JAVA_HOME=/application/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
[root@oldboy-ol02 ~]# source /etc/profile
测试:显示jdk版本信息。
[root@oldboy-ol02 ~]# java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
3.tomcat部署与检查
安装tomcat:
[root@oldboy-ol02 opt]# tar xf apache-tomcat-8.0.50.tar.gz -C /application/
[root@oldboy-ol02 opt]# ln -s /application/apache-tomcat-8.0.50/ /application/tomcat
[root@oldboy-ol02 ~]# chown -R root.root /application/tomcat/ /application/jdk/
[root@oldboy-ol02 ~]# echo 'export TOMCAT_HOME=/application/tomcat'>>/etc/profile
[root@oldboy-ol02 ~]# source /etc/profile
测试:显示tomcat环境变量路径,版本信息。
[root@oldboy-ol02 ~]# /application/tomcat/bin/version.sh
4.tomcat目录结构与启动
[root@oldboy-ol02 ~]# tree /application/tomcat/ -L 1
/application/tomcat/
├── bin #启动文件目录,startup.sh,shutdown.sh,catalina.sh(核心)
├── conf #配置文件目录,server.xml(主配置文件),tomcat-users.xml(用户管理)
├── lib
├── LICENSE
├── logs #日志目录
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp #临时目录
├── webapps #站点存放目录,类似nginx的html目录
└── work #用以产生有JSP编译出的Servlet的.java和.class文件
关注点:bin、conf、logs、webapps
启动/关闭tomcat:
[root@oldboy-ol02 ~]# /application/tomcat/bin/startup.sh
[root@oldboy-ol02 ~]# netstat -lntup|grep java
tcp6 0 0 :::8080 :::* LISTEN 2584/java //用于监听浏览器发送的请求,设置成80 后可以直接使用http://localhost访问。
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 2584/java //tomcat监听的关闭端口8005。
tcp6 0 0 :::8009 :::* LISTEN 2584/java //使用8009接受其他服务器转发过来的请求。
[root@oldboy-ol02 ~]# ps -ef|grep java
输入测试1:
http://10.0.0.123:8080/
tomcat安装配置与启动运行正常!
查看日志:
[root@oldboy-ol02 ~]# ll /application/tomcat/logs/ //产生日志
total 40
-rw-r--r--. 1 root root 13816 Mar 11 10:28 catalina.2018-03-11.log //catalina.out文件每天的日志切割文件
-rw-r--r--. 1 root root 13816 Mar 11 10:28 catalina.out //实时记录tomcat运行信息,文件会越来越大,定时清空
-rw-r--r--. 1 root root 0 Mar 11 10:26 host-manager.2018-03-11.log
-rw-r--r--. 1 root root 1194 Mar 11 10:28 localhost.2018-03-11.log
-rw-r--r--. 1 root root 646 Mar 11 10:30 localhost_access_log.2018-03-11.txt
-rw-r--r--. 1 root root 0 Mar 11 10:26 manager.2018-03-11.log
输入测试2:
[root@oldboy-ol02 ~]# tail -f /application/tomcat/logs/catalina.out //表示启动成功。
11-Mar-2018 10:28:11.788 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 1754 ms
5.部署jpress网站(java版本的wordpress)
部署一个小网站试试:
JSP网页
Linux + Nginx + PHP + MySQL
Linux + Tomcat + JDK + MySQL (db01)
(1)连接db01的数据库:
[root@db01 ~]# mysql -uroot -p
Enter password: oldboy123
mysql> show databases;
mysql> create database jpress DEFAULT CHARACTER SET utf8;
mysql> grant all on jpress.* to jpress@'172.16.1.0/255.255.255.0' identified by 'jpress';
mysql> flush privileges;
mysql> show databases;
mysql> select user,host from mysql.user;
+-----------+--------------------------+
| user | host |
+-----------+--------------------------+
| root | 127.0.0.1 |
| jpress | 172.16.1.0/255.255.255.0 |
(2)部署站点代码:
[root@oldboy-ol02 webapps]# ll
total 20320
drwxr-xr-x. 14 root root 4096 Mar 11 10:11 docs
drwxr-xr-x. 6 root root 83 Mar 11 10:11 examples
drwxr-xr-x. 5 root root 87 Mar 11 10:11 host-manager
drwxr-xr-x. 6 root root 86 Mar 11 11:03 jpress-web-newest
-rw-r--r--. 1 root root 20797013 Mar 11 11:02 jpress-web-newest.war //上传,tomcat会将war包自动解压;拿走war包会自动消失。
drwxr-xr-x. 5 root root 103 Mar 11 10:11 manager
drwxr-xr-x. 3 root root 4096 Mar 11 10:11 ROOT
[root@oldboy-ol02 webapps]# mv jpress-web-newest jpress
[root@oldboy-ol02 webapps]# mv jpress-web-newest.war /opt/
输入:http://10.0.0.123:8080/jpress




重启tomcat服务网站生效:
[root@oldboy-ol02 ~]# /application/tomcat/bin/shutdown.sh
[root@oldboy-ol02 ~]# /application/tomcat/bin/startup.sh
[root@oldboy-ol02 webapps]# tail -f /application/tomcat/logs/catalina.out
11-Mar-2018 11:24:48.911 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 13139 ms
输入:http://10.0.0.123:8080/jpress
输入:http://10.0.0.123:8080/jpress/admin进入后台管理员界面:

6.tomcat配置文件讲解
[root@oldboy-ol02 ~]# vim /application/tomcat/conf/server.xml
语法:
注释:以<!--开头,以-->结尾,中间包含的都是注释,段注释ml
#指定关闭tomcat的端口号及暗号
22 <Server port="8005" shutdown="SHUTDOWN">
#指定tomcat的web站点监听端口
69 <Connector port="8080" protocol="HTTP/1.1"
70 connectionTimeout="20000"
71 redirectPort="8443" />
123 <Host name="localhost" appBase="webapps" //类似于虚拟主机,定义站点目录
124 unpackWARs="true" autoDeploy="true"> //自动解压,自动部署
125
126 <!-- SingleSignOn valve, share authentication between web applications
127 Documentation at: /docs/config/valve.html -->
128 <!--
129 <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
130 -->
131
132 <!-- Access log processes all example.
133 Documentation at: /docs/config/valve.html
134 Note: The pattern used is equivalent to using pattern="common" -->
135 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
136 prefix="localhost_access_log" suffix=".txt" //tomcat访问日志,扩展名.txt
137 pattern="%h %l %u %t "%r" %s %b" />
138
139 </Host>
#专门和apache通信的端口,不用,注释
可注释:
90 <!-- Define an AJP 1.3 Connector on port 8009 -->
91 <!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />-->
[root@oldboy-ol02 ~]# ss -lntup|grep 8005
tcp LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=1210,fd=68))
[root@oldboy-ol02 ~]# netstat -lntup|grep java
tcp6 0 0 :::8080 :::* LISTEN 1547/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1547/java
[root@oldboy-ol02 ~]# echo SHUTDOWN |nc 127.0.0.1 8005 //测试关闭tomcat端口,传输指令SHUTDOWN则等于关闭tomcat服务。只有本地才可以关闭,所以不必担心,做优化时可以修改端口号和指令信息。
//nc命令就是通过管道向某个端口传递信息。
[root@oldboy-ol02 ~]# ss -lntup|grep 8005
[root@oldboy-ol02 ~]# ss -lntup|grep 8080
[root@oldboy-ol02 ~]#
[root@oldboy-ol02 ~]# tail -f /application/tomcat/logs/catalina.out
7.tomcat自定义网站目录
[root@oldboy-ol02 webapps]# ll
total 12
drwxr-xr-x. 14 root root 4096 Mar 11 10:11 docs
drwxr-xr-x. 6 root root 83 Mar 11 10:11 examples
drwxr-xr-x. 5 root root 87 Mar 11 10:11 host-manager
drwxr-xr-x. 8 root root 120 Mar 11 11:33 jpress
drwxr-xr-x. 5 root root 103 Mar 11 10:11 manager
drwxr-xr-x 3 root root 41 Mar 12 09:42 memtest
-rw-r--r-- 1 root root 643 Mar 11 11:02 memtest.war //上传
drwxr-xr-x. 3 root root 4096 Mar 11 10:11 ROOT
[root@oldboy-ol02 webapps]# ll memtest/
total 4
-rw-r--r-- 1 root root 407 Jan 26 2016 meminfo.jsp
drwxr-xr-x 2 root root 44 Mar 12 09:42 META-INF
显示每个java软件(java虚拟机)情况:
http://10.0.0.123:8080/memtest/
http://10.0.0.123:8080/memtest/meminfo.jsp
显示:
JVM memory detail info :
Max memory:483MB
Total memory:56MB
Free memory:16MB
Available memory can be used is :443MB
现在:
以前地址: http://10.0.0.201:8080/memtest/meminfo.jsp
想要的地址:http://10.0.0.201:8080/meminfo.jsp
第一种方法:将meminfo.jsp放入ROOT目录,默认在webapps/ROOT。
第二种方法: nginx的location规则。
location /oldboyedu/ {
....
}
[root@oldboy-ol02 ~]# vim /application/tomcat/conf/server.xml
//在Host标签中配置:
126 <Context path="" docBase="/application/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>
重启生效,就可以精简网址路径:
[root@oldboy-ol02 ~]# /application/tomcat/bin/shutdown.sh
[root@oldboy-ol02 ~]# /application/tomcat/bin/startup.sh
http://10.0.0.123:8080/meminfo.jsp
显示:
JVM memory detail info :
Max memory:483MB
Total memory:57MB
Free memory:23MB
Available memory can be used is :449MB
8.tomcat多实例
多虚拟主机:nginx
多实例:tomcat,尽可能使用我们系统的资源(资源相对多)
32cores 256G 8*600G
[root@oldboy-ol02 opt]# tar xf apache-tomcat-8.0.50.tar.gz
[root@oldboy-ol02 opt]# cp -a apache-tomcat-8.0.50 /application/tomcat8_1
[root@oldboy-ol02 opt]# cp -a apache-tomcat-8.0.50 /application/tomcat8_2
[root@oldboy-ol02 opt]# ll /application/tomcat
tomcat/ tomcat8_1/ tomcat8_2/
[root@oldboy-ol02 ~]# sed -i 's#8005#8011#;s#8080#8081#' /application/tomcat8_1/conf/server.xml
[root@oldboy-ol02 ~]# sed -i 's#8005#8012#;s#8080#8082#' /application/tomcat8_2/conf/server.xml
[root@oldboy-ol02 ~]# tar zcf /tmp/webapp_multi.tar.gz /application/tomcat8_*
tar: Removing leading `/' from member names
//生产经验:将已经配置的实例打包,以后方便批量配置多实例。
[root@oldboy-ol02 ~]# /application/tomcat8_1/bin/startup.sh
[root@oldboy-ol02 ~]# /application/tomcat8_2/bin/startup.sh
[root@oldboy-ol02 ~]# ss -lntup|grep java
tcp LISTEN 0 1 ::ffff:127.0.0.1:8011 :::* users:(("java",pid=1674,fd=68))
tcp LISTEN 0 1 ::ffff:127.0.0.1:8012 :::* users:(("java",pid=1698,fd=61))
tcp LISTEN 0 100 :::8080 :::* users:(("java",pid=1547,fd=48))
tcp LISTEN 0 100 :::8081 :::* users:(("java",pid=1674,fd=48))
tcp LISTEN 0 100 :::8082 :::* users:(("java",pid=1698,fd=48))
tcp LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=1547,fd=60))
tcp LISTEN 0 100 :::8009 :::* users:(("java",pid=1674,fd=53))
测试多实例:
http://10.0.0.123:8080/jpress/
http://10.0.0.123:8081/
http://10.0.0.123:8082/
现在既然俩实例一样,到底让用户访问哪个呢?8081还是8082
所以前边得加负载均衡或者反向代理,可以将反向代理和tomcat放在同一台服务器上,也可以像期中架构一样分开。
现在tomcat可以做到一台服务器上运行两个tomcat和运行一个nginx的负载均衡。

9.tomcat反向代理集群
编译安装nginx软件,略。
[root@oldboy-ol02 ~]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/application/nginx-1.12.2 --with-http_stub_status_module --with-http_ssl_module
[root@oldboy-ol02 ~]#
修改配置文件:
[root@oldboy-ol02 conf]# egrep -v '#|^$' nginx.conf.default >nginx.conf
[root@oldboy-ol02 conf]# cat nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#创建池
upstream web_pools {
server 10.0.0.123:8081;//可以增加权重、尝试连接次数和超时时间等
server 10.0.0.123:8082;
}
#end
server {
listen 80;
server_name localhost;
#
location / {
#root html;
index index.jsp index.html index.htm;
#遇到就往后扔,扔到web池里。
proxy_pass http://web_pools;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
[root@oldboy-ol02 conf]# /application/nginx/sbin/nginx -t
[root@oldboy-ol02 conf]# /application/nginx/sbin/nginx -s reload
测试:
[root@oldboy-ol02 conf]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 4333 root 6u IPv4 33613 0t0 TCP *:http (LISTEN)
nginx 4484 www 6u IPv4 33613 0t0 TCP *:http (LISTEN)
[root@oldboy-ol02 conf]# ss -lntup|grep 80
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=4484,fd=6),("nginx",pid=4333,fd=6))
tcp LISTEN 0 1 ::ffff:127.0.0.1:8011 :::* users:(("java",pid=1674,fd=68))
tcp LISTEN 0 1 ::ffff:127.0.0.1:8012 :::* users:(("java",pid=1698,fd=61))
tcp LISTEN 0 100 :::8080 :::* users:(("java",pid=1547,fd=48))
tcp LISTEN 0 100 :::8081 :::* users:(("java",pid=1674,fd=48))
tcp LISTEN 0 100 :::8082 :::* users:(("java",pid=1698,fd=48))
tcp LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=1547,fd=60))
tcp LISTEN 0 100 :::8009 :::* users:(("java",pid=1674,fd=53))
现在我们访问80端口服务就相当于是反向代理替我们访问8081和8082端口服务。
[root@oldboy-ol02 application]# for name in tomcat8_1 tomcat8_2 ;do echo $name >$name/webapps/ROOT/index.html ;done
[root@oldboy-ol02 application]# for name in tomcat8_1 tomcat8_2 ;do cat $name/webapps/ROOT/index.html ;done
tomcat8_1
tomcat8_2
成功测试1:
[root@oldboy-ol02 application]# curl 10.0.0.123
tomcat8_1
[root@oldboy-ol02 application]# curl 10.0.0.123
tomcat8_2
[root@oldboy-ol02 application]# curl 10.0.0.123
tomcat8_1
[root@oldboy-ol02 application]# curl 10.0.0.123
tomcat8_2
成功测试2:
输入:
http://10.0.0.123/index.html 循环显示:tomcat8_1和tomcat8_2
http://10.0.0.123:8081/ 显示:tomcat8_1
http://10.0.0.123:8082/ 显示:tomcat8_2
10.tomcat监控和优化
显示正常运行的java进程:
[root@oldboy-ol02 application]# jps //java里的ps命令
1698 Bootstrap
4546 Jps
1210 Bootstrap
1674 Bootstrap
1547 Bootstrap
[root@oldboy-ol02 application]# jps -lvm //查看当前运行的java进程及pid号
[root@oldboy-ol02 application]# jps -lvm|wc -l
5
//可以存放到zabbix上进行监控。
JAVA企业级应用TOMCAT实战
http://blog.oldboyedu.com/java-tomcat/
企业案例:Linux下java/http进程高解决案例
Tomcat安全管理规范
浙公网安备 33010602011771号