1、tomcat的安装环境
tomcat使用java语言来编写,tomcat和php一样都是用来处理动态程序的(也可以解析静态资源),tomcat可以处理.jsp或者.do结尾的动态文件,处理时并不是tomcat本身去处理,而是交给后端的jvm来处理,也就是java虚拟机来处理,处理之前先装入tomcat的类文件,然后由jvm来处理,所以安装tomcat必须先安装JDK(Java Development Kit),java开发工具箱在java虚拟机之上,安装了JDK就相当于安装java虚拟机,JDK有两种开源的软件可以安装,OpenJDK和Oracle JDK
1、OpenJDK的安装
yum install java-1.8.0-openjdk-devel.x86_64
确定JDK是否安装可以使用如下命令
[root@centos6 ~]#java -version
openjdk version "1.8.0_121" ---可以看到版本,说明安装成功
OpenJDK Runtime Environment (build 1.8.0_121-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)
2、Oracle JDK的安装
在oracle官方网站上下载jdk-8u151-linux-x64.rpm
http://www.oracle.com/technetwork/java/javase/downloads/index.html
[root@centos7 app]#rpm -ivh jdk-8u151-linux-x64.rpm
[root@centos7 latest]#cd /usr/java/
[root@centos7 java]#ll ---有两个软链接文件,一个指向的是默认的,一个指向的是最新的,这里只有一个版本,如果有多个版本这两个软链接会分别指向不同的版本
total 0
lrwxrwxrwx 1 root root 16 Nov 3 21:01 default -> /usr/java/latest
drwxr-xr-x 9 root root 268 Nov 3 21:01 jdk1.8.0_151
lrwxrwxrwx 1 root root 22 Nov 3 21:01 latest -> /usr/java/jdk1.8.0_151
[root@centos7 java]#cd latest/
[root@centos7 latest]#ls
bin db javafx-src.zip lib man release THIRDPARTYLICENSEREADME-JAVAFX.txt
COPYRIGHT include jre LICENSE README.html src.zip THIRDPARTYLICENSEREADME.txt
[root@centos7 latest]#cd bin/ ---发现有很多java程序文件,因为不在PATH变量里,所以最好定义PATH变量
[root@centos7 bin]#ls
appletviewer jar javadoc javapackager jconsole jhat jmc jsadebugd jvisualvm pack200 rmiregistry tnameserv xjc
ControlPanel jarsigner javafxpackager java-rmi.cgi jcontrol jinfo jmc.ini jstack keytool policytool schemagen unpack200
extcheck java javah javaws jdb jjs jps jstat native2ascii rmic serialver wsgen
idlj javac javap jcmd jdeps jmap jrunscript jstatd orbd rmid servertool wsimport
[root@centos7 latest]#vim /etc/profile.d/java.sh
PATH=/usr/java/latest/bin/:$PATH
[root@centos7 latest]#. /etc/profile.d/java.sh ---生效
[root@centos7 latest]#java -version ---发现java环境已经准备好了,定义完PATH变量,java虚拟机就会自动开启
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
2、安装tomcat
安装tomca也有两种方法,一种是base仓库,另外一种就是到官方站点下载,这里在上面准备好的OpenJDK上用base仓库安装,在Oracle JDK上安装编译好的二进制包
1、Base Repo:
[root@centos6 ~]#yum install tomcat tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps
[root@centos6 tomcat]#rpm -q tomcat ---查看版本
tomcat-7.0.73-1.el6.noarch
[root@centos6 tomcat]#cat /usr/sbin/tomcat ---可以看到tomcat并不是一个二进制的程序,而是一个脚本文件,通过脚本文件调用java程序,
/etc/tomcat ---配置文件目录
/etc/tomcat/server.xml ---主配置文件
/etc/tomcat/tomcat-users.xml ---用户认证的账号和密码文件;角色(role),用户(User),此文件在tomcat启动时被装入内存
/usr/share/tomcat/webapps ---webapp的默认根目录
service tomcat start
[root@centos6 tomcat]#ps -aux ---我们发现tomcat启动的是一个java虚拟机程序
tomcat 5990 15.1 9.8 2938264 98592 ? Sl 03:29 0:06 /usr/lib/jvm/j
[root@centos6 tomcat]#jps -v ---可以看到启动过程,先装载tomcat的类文件完成自举,然后运行java虚拟机程序,所以tamcat真正运行的是一个java程序
5990 Bootstrap -Dcatalina.base=/usr/share/tomcat -Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat/temp -Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
6056 Jps -Dapplication.home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-1.b13.el6.x86_64 -Xms8m
[root@centos6 tomcat]#ss -nltp ---从这也可以看到运行的是java进程
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",5990,52))
LISTEN 0 100 :::8009 :::* users:(("java",5990,48))
LISTEN 0 100 :::8080 :::* users:(("java",5990,47))
监听的端口有三个:8080为http协议的接口,8009为ajp协议的接口,8005为管理接口
[root@centos6 tomcat]#telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
Connection closed by foreign host.
[root@centos6 tomcat]#ss -nlt ---发现tomcat实例被关闭了,所以这个管理端口监听在本地的8005,这样比较安全,不然谁telnet到这个端口都可以关闭tomcat,不过一般这个端最好不要监听,这样更安全
如何进行安全设置
vim /etc/tomcat/server.xml
把上面的改成port=-1,就表示关闭端口
或者openssl rand -hex 10 生成一个随机数来当shuntdown,这样别人就不知道该怎么关闭了
http://172.18.21.106:8080/ ---访问http协议的接口可以看到web站点
2、Tomcat binary release
在官方网站上下载
http://tomcat.apache.org/
tomcat是属于apache旗下的产品
这里下载的是apache-tomcat-7.0.82.tar
[root@centos7 app]#tar -xvf apache-tomcat-7.0.82.tar.gz -C /usr/local
[root@centos7 local]#ln -s apache-tomcat-7.0.82/ tomcat
[root@centos7 local]#cd tomcat
[root@centos7 tomcat]#useradd tomcat ---运行tomcat时最好以普通用户的身份运行,所以创建一个tomcat用户
[root@centos7 tomcat]#chown -R root:tomcat ./* ---修改tomcat目录下的文件的所有者和所属组,这里只修改所属组为tomcat是因为怕tomcat账号被别人盗用后,登陆此账号后修改tomcat内的二进制程序文件
[root@centos7 tomcat]#chown -R tomcat ./{logs,temp,work,webapps,conf} ---将这些目录的所有者修改为tomcat,因为在执行tomcat时有可能要修改这些目录
内的文件
[root@centos7 tomcat]#vim /etc/profile.d/tomcat.sh
PATH=/usr/local/tomcat/bin/:$PATH
[root@centos7 tomcat]#. /etc/profile.d/tomcat.sh
[root@centos7 tomcat]#su - tomcat
[tomcat@centos7 ~]$catalina.sh start ---利用这个命令来启动和关闭tomcat
[tomcat@centos7 ~]$catalina.sh --help
[tomcat@centos7 ~]$ss -nlt ---发现端口已经打开
[tomcat@centos7 ~]$ps -aux ---发现是以tomcat的身份在运行,如果用root用户去开启tomcat会发现tomcat是以root的身份在运行
[root@centos7 tomcat]#catalina.sh version
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/latest
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.82 ---可以看到tomcat的版本
Server built: Sep 29 2017 12:23:15 UTC
Server number: 7.0.82.0
OS Name: Linux
OS Version: 3.10.0-514.el7.x86_64
Architecture: amd64
JVM Version: 1.8.0_151-b12 ---java虚拟机的版本
JVM Vendor: Oracle Corporation
3、tomcat的常用组件配置
- Server:代表tomcat instance,即表现出的一个java进程;监听在8005端口,只接收“SHUTDOWN”。各server监听的端口不能相同,因此,在同一物理主机启动多个实例及多个java进程时,需要修改其监听端口为不同的端口;
- service:用于实现将一个或多个connector组件关联至一个engine组件;
- Connector组件:负责接收请求,连接内部的Engine,常见的有三类http/https/ajp;
进入tomcat的请求可分为两类:
(1) standalone : 请求直接来自于客户端浏览器;
(2) 由其它的web server反代:来自前端的反代服务器;
nginx --> http connector --> tomcat
httpd(proxy_http_module) --> http connector --> tomcat
httpd(proxy_ajp_module) --> ajp connector --> tomcat
属性:
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
address:监听的IP地址;默认为本机所有可用地址;
maxThreads:最大并发连接数,默认为200;
enableLookups:是否启用DNS查询功能;
acceptCount:等待队列的最大长度;
secure="TRUE" 后面两个属性是启用https的配置,一般tomcat不会使用https,而不是在前段的反代上设置,因为tomcat本身运行起来已经很慢了,加上https就更慢了
sslProtocol:ssl协议类型 - Engine组件:Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点; 通常需要通过defaultHost来定义默认的虚拟主机;
- Host组件:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机
appBase:设置默认网页文件的存放路径,也就是根目录,相当于httpd的document root
unpackWARs:如果我们拿到的一个程序是.war格式的,把它放到网页文件存放的目录下会自动展开
autoDeploy:是否启动自动部署功能
- Context组件:用来定义一个独立的应用,也就是你访问哪个uri时访问的是哪个目录,相当于http里的别名
示例:
-
Valve组件:
Valve存在多种类型:
定义访问日志:org.apache.catalina.valves.AccessLogValve
定义访问控制:org.apache.catalina.valves.RemoteAddrValve
webapp归档格式:
.war:webapp; ---一般生产中用到的都是这种格式的打包好的程序文件,只要把它扔到网页程序文件存放的目录下就会自动展开这个文件,不用解压包
.jar:EJB的类打包文件(类库);
.rar:资源适配器类打包文件;
.ear:企业级webapp;
JSP WebAPP的组织结构:
/: webapps的根目录
index.jsp:主页;
...
WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件;
META-INF/:类似于WEB-INF/;
classes/:类文件,当前webapp所提供的类;
lib/:类文件,当前webapp所提供的类,被打包为jar格式;
tree /usr/share/tomcat/webapps/ 可以看到根目录结构
4、部署(deploy)webapp的相关操作
- deploy:将webapp的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能够基于web.xml和context.xml文件中定义的路径来访问此webapp;将其特有的类和依赖的类通过class loader装载至JVM;
- 部署有两种方式:
自动部署:auto deploy
手动部署:
冷部署:把webapp复制到指定的位置,而后才启动tomcat;
热部署:在不停止tomcat的前提下进行部署;
部署工具:manager、ant脚本、tcd(tomcat client deployer)等;
undeploy:拆除(反部署),停止webapp,并从tomcat实例上卸载webapp;
start:启动处于停止状态的webapp;
stop:停止webapp,不再向用户提供服务;其类依然在jvm上;
redeploy:重新部署;
示例:冷部署一个test程序
mkdir /app/test/{WEB-INF} -pv ---模仿根目录的结构创建一个测试的程序目录
cd /app/test/
vim index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
Test Page
<% out.println("hello world");
%>
service tomcat stop ---冷部署要先停止服务
cp -r /app/test/ /usr/share/tomcat/webapps/ ---把这个写好的动态程序放到网站的根目录下
service tomcat start
测试
http://172.18.21.106:8080/test/ 发现hello world 部署成功
5、tomcat配置
示例1虚拟主机
vim /etc/tomcat/server.xml
mkdir -pv /app/website1/ROOT/{WEB-INF,META-INF,classes,lib}
vim /app/website1/ROOT/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
Test Page
<% out.println("hello node1.magedu.com");
%>
service tomcat restart
在客户端测试
vim /etc/hosts ---修改hosts文件保证能够解析主机名
[root@redhat7 ~]#elinks -dump http://node1.magedu.com:8080/
hello node1.magedu.com
总结:/app/website1为网站的根目录,在根目录下创建一个ROOT目录,把程序文件放到这个目录下,在网页上输入http://node1.magedu.com:8080/就可以自动找到这个程序,如果根目录下创建的不是ROOT目录,而是别的目录,比如test目录,访问网站的时候就要输入http://node1.magedu.com:8080/test,就像我们输入http://172.18.21.106:8080/,会自动访问默认虚拟主机的/usr/share/tomcat/appwebs/ROOT目录的程序文件,也就是网站的默认主页面,是一个汤姆猫
示例2Context组件
vim /etc/tomcat/server.xml
---表示当你访问的uri是testapp的时候,访问的目录是/app/website2,相当于http里面的别名, reloadable是否重新装载
[root@centos6 app]#cd /app/website2
[root@centos6 website2]#ls
index.jsp WEB-INF
测试
elinks -dump http://node1.magedu.com:8080/testapp
hello node1.magedu.com app
示例3定义访问日志
vim /etc/tomcat/server.xml
---表示日志文件的格式
service tomcat restart
测试
[root@redhat7 ~]#elinks -dump http://node1.magedu.com:8080/testapp
hello node1.magedu.com app
cat /var/log/tomcat/node1_access_log.2017-11-04.log
示例4 定义访问控制
---表示只允许172.18.21.7访问,如果允许多个ip地址中间用分号隔开,也可以使用deny表示拒绝
6、manager图形界面设置
- 1、Manager App配置
vim /etc/tomcat/tomcat-users.xml ---启用一个角色,并定义登录的用户名和密码,用这个账号可以登录到上图中的上面两个,Host Manager还要重新启用角色和定义登录用户名和密码
service tomcat restart
然后点击上图中的Manager App就可以进入到图形界面
利用图形界面进行热部署
[root@centos6 app]#cp -r test/ /app/website3 ---创建一个websit3的目录
[root@centos6 app]#ls
test website1 website2 website3
[root@centos6 app]#cd website3
[root@centos6 website3]#ls ---里面有index.jsp文件
classes index.jsp lib META-INF WEB-INF
在图形界面进行如下设置
点击Deploy
发现热部署成功,点击myapp就可以访问网页内容了
进入Server Status
- 2、Host Manager配置
vim /etc/tomcat/tomcat-users.xml ---定义一个角色和登录的用户名和密码
service tomcat restart
可以在此图形界面下添加一个虚拟主机
注意:通过上述图形界面进行热部署或者添加虚拟主机都是在内存中的,重启主机后都会失效。
7、实现LNT动静分离
这里nginx和tomcat在同一个主机,使用nginx反向代理至tomcat
1、安装并启动tomcat
2、安装nginx并配置
vim /etc/nginx/nginx.conf
在server段增加如下内容
root /usr/local/tomcat/webapps/ROOT; ---表示访问静态文件就访问nginx的这个目录,此目录是tomcat默认根目录,此tomcat不是yum安装的,是通过二进制安装的,所以默认根目录路径和yum安装的不同
index index.jsp;
location ~* \.(jsp|do)$ { ---访问的是jsp或者do结尾的动态文件就调度到后端主机tomcat
proxy_pass http://127.0.0.1:8080;
}
nginx -t
nginx ----启动服务
测试
http://172.18.21.107/ ---这里直接访问80端口就可以了看到tomcat默认主页面了
8、实现LAT
这里httpd和tomcat在同一个主机,使用httpd反向代理至tomcat
1、安装并启动tomcat
2、安装httpd服务
[root@centos7 conf]#httpd -M |grep "proxy" ---查看模块是否已经加载,如果没有加载,要在配置文件中加载这些模块
proxy_module (shared)
proxy_ajp_module (shared) ---表示方向代理时后端服务器是aip协议
proxy_balancer_module (shared)
proxy_connect_module (shared)
proxy_express_module (shared)
proxy_fcgi_module (shared)
proxy_fdpass_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared) ----表示方向代理时后端主机时http协议
proxy_scgi_module (shared)
proxy_wstunnel_module (shared)
3、与后端tomcat使用http协议连接时配置
vim /etc/httpd/conf.d/vhost.conf
servername node2.magedu.com
documentroot "/usr/local/tomcat/webapps/ROOT"
require all granted
proxyrequests off ---关闭正向代理,不加可以
proxyvia on ---在后端服务器响应给客户端的响应报文中增加一个首部via,via的值为当前代理服务器的主机名,加不加都可以
proxypreservehost on ---表示客户端访问的时候保留请求报文中的主机头,比如访问的是www.magedu.com,如果不保留主机头,网络中的主机是通过ip地址通讯的,到服务器后并不知道你要访问的是哪个虚拟主机,加上这一条就会在情况报文中保留这个主机头,可以访问后端固定的虚拟主机。不加也可以
proxypass "/" "http://127.0.0.1:8080/"
proxypassreverse "/" "http://127.0.0.1:8080/" ---表示客户端重新发起请求后,比如url重定向时,对于这些重新发起的请求反向代理至哪
httpd -t
systemctl start httpd
测试:http://172.18.21.107/
4、与后tomcat连接时使用的ajp协议时的配置
vim /etc/httpd/conf.d/vhost.conf
servername node2.magedu.com
documentroot "/usr/local/tomcat/webapps/ROOT"
require all granted
proxyrequests off
proxyvia on
proxypreservehost on
proxypass "/" "ajp://127.0.0.1:8009/"
proxypassreverse "/" "ajp://127.0.0.1:8009/"
httpd -t
systemctl reload httpd
测试:http://172.18.21.107/