Tomcat
安装Tomcat(先下载jdk-8u201-linux-x64.rpm包)
[root@GW ~]#rpm -ivh jdk-8u201-linux-x64.rpm
#安装JDK包
警告:jdk-8u201-linux-x64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:jdk1.8-2000:1.8.0_201-fcs ################################# [100%]
[root@GW ~]#cd /usr/java/jdk1.8.0_201-amd64/
[root@GW jdk1.8.0_201-amd64]#ll
总用量 25980
[root@GW jdk1.8.0_201-amd64]#vim /etc/profile
#添加环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
[root@GW jdk1.8.0_201-amd64]#source /etc/profile
#刷新配置文件
[root@GW tomcat]#tar zxvf apache-tomcat-9.0.16.tar.gz
[root@GW tomcat]#cp -r apache-tomcat-9.0.16 /usr/local/tomcat
[root@GW tomcat]#cd /usr/local/tomcat/
[root@GW tomcat]#/usr/local/tomcat/bin/startup.sh
#启动tomcat #catalina.sh start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_201-amd64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@GW ~]# /usr/local/tomcat/bin/shutdown.sh
#关闭服务 #catalina.sh stop
添加到
[root@GW bin]#useradd -s /sbin/nologin tomcat
#新建用户
[root@GW local]#chown tomcat:tomcat tomcat/ -R
#修改属主和属组
[root@GW ~]#cat > /usr/lib/systemd/system/tomcat.service <<EOF
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
EOF
[root@GW local]#systemctl daemon-reload
[root@GW local]#systemctl start tomcat
[root@GW local]#ss -ntap |grep 8080
配置文件
安装目录下 文件介绍
目录名字 | 功能 |
---|---|
bin | 存放启动和关闭 Tomcat 的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh 三个文件 |
conf | 存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。 |
lib | 存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的 jar 包 |
logs | 存放 Tomcat 日志 catalina.out |
temp | 存放 Tomcat 运行时产生的文件 |
webapps | 存放项目资源的目录 |
work | Tomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到(升级版本时注意要删除里面的缓存) |
conf子目录
文件名 | 说明 |
---|---|
server.xml | 主配置文件 全局生效 |
web.xml | 每个webapp只有“部署"后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件 |
context.xml | 用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中,覆盖全局的文件 |
tomcat-users.xml | 用户认证的账号和密码文件 |
catalina.policy | 当使用security选项启动omcat时,用于为tomcat设置安全策略 |
catalina.properties | Tomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数 |
logging.properties | Tomcat日志系统相关的配置,可以修改日志级别和日志路径等 |
组件分层和分类
顶级组件
Server,代表整个Tomcat容器,一台主机可以启动多tomcat 实例 ,需要确保端口不要产生冲突
服务类组件
Service,实现组织Engine和Connector,建立两者之间关联关系, service 里面只能包含一个Engine
连接器组件
Connector,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议。
容器类
Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序。
内嵌类
可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组件内分别定义。
集群类组件
listener、cluster
首先开启 tomcat进程, 会有 server 产生 ,
然后产生 一个 service管理组件 管理 所有其他组件的
用户发送请求httpd 请求过来
connector 连接器(默认监听)接收到此请求, 会转交给 engine (引擎)
engine (引擎) 会处理请求, 遍历 host (虚拟主机) 会交给 客户访问的host, 如果找不到交给默认的 host 会根据 上下文 context (上下文) 映射关系 去找相对应的文件
找到文件后, 交给 JSP 生成代码, 再交给 servlet 生成 html
原路返回 反馈给用户
名称 | 说明 |
---|---|
server | 服务器,Tomcat运行的进程实例,一个Server中可以有多个service,但通常就一个 |
service | 服务,用来组织Engine(引擎)和Connector(连接器,端口)的对应关系,一个service中只有一个Engine |
connector | 连接器,负责客户端的HTTP、HTTPS、AJP等协议连接。一个Connector只属于某一个Engine |
Engine | 即引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector |
Host | 即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分 |
Context | 应用的上下文,配置特定url路径映射和目录的映射关系: url => directory |
核心组件
-
Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例, 但一般只启动一个
-
创建一个Service提供服务。可以创建多个Service,但一般也只创建一个
- 每个Service中,是Engine和其连接器Connector的关联配置
-
可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应
-
Service 内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host
- Engine对请求头做了分析,将请求发送给相应的虚拟主机
- 如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机
- Engine上的缺省虚拟主机可以修改
-
Host 定义虚拟主机,虚拟主机有name名称,通过名称匹配
-
Context 定义应用程序单独的路径映射和配置
引擎:
一般而言,引擎是一个程序或一套系统的支持部分。常见的程序引擎有游戏引擎、搜索引擎、杀毒引擎等
范例:
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true">
<Context >
<Context />
</Host>
</Engine>
</Service>
</Server>
tomcat 处理请求过程
-
假设来自客户的请求为: http://localhost:8080/test/index.jsp
浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1Connector获得此请求。 -
Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
-
Engine获得请求192.168.91.100:8080/test/index.jsp,遍历它所有虚拟主机Host
-
Engine匹配到名为localhost的Host。如果匹配不到,就把请求交给该Engine中的defaultHost处理. localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
-
Host匹配到路径为/test的Context
-
path=/test的Context获得请求index.jsp,在它的mapping table中寻找对应的servlet
-
Context匹配到URLPATTERN为*.jsp的Sservlet,对应于]spServlet类构造HtpServletRequest对象和HttpServletResponse对象,作为参数调用)spSer
let的doGet或doPost方法。 -
Context把执行完了之后的HttpServletResponse对象返回给Host
-
Host把HttpServletResponse对象返回给Engine
-
Engine把HttpServletResponse对象返回给Connector
-
Connector把HttpServletResponse对象返回给浏览器端
通常意义上的 Web 服务器接受请求后,只是单纯地响应静态资源,如 HTML 文件,图片
文件等,不能在后端进行一定的处理操作。 Tomcat 是 Apache 下的一个子项目,它具备 Web
服务器的所有功能,不仅可以监听接受请求并响应静态资源,而且可以在后端运行特定规范
的 Java 代码 Servlet,同时将执行的结果以 HTML 代码的形式反回客户端。
Tomcat 由一系列的组件构成,其中核心的组件有三个:
1)Web 容器:完成 Web 服务器的功能。(https请求)
2)Servlet 容器:名字为 catalina,用于处理 Servlet 代码。(具体的任务)
3)JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码。
① Web容器
负责底层的HTTP协议
② Servlet容器
由catalina脚本帮忙处理的servlet代码,主要处理后端逻辑业务
catalina实际处理的是Servlet代码,而Servlet代码是由Java编写的
③ JSP容器(JAVA Scripts page)
JSP:在正常的html标签中嵌入一些java代码
这些JSP最终会被翻译成Servlet代码被执行
主要提供提供前端页面展示<% %>
小结:tomcat就是一个容器,在这个容器中有三大核心组件:
WEB、Servlet 和JSP,所以Tomcat是极其轻量级别的,核心组件都是支持基本运行的组件
TIPS:
多实例:
多实例就是在一台服务器上同时开启多个不同的服务端口,同时运行多个服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供服务
主页文件的优先级
- index.html
- index.htm
- index.jsp
[root@GW conf]#vim /usr/local/tomcat/conf/web.xml
#此文件末尾定义了优先级,可以在站点的目录下配置
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
[root@GW blog]#chown tomcat:tomcat WEB-INF/ -R
状态页
默认的管理页面被禁用,启用方法如下
修改conf/conf/tomcat-users.xml
[root@centos7 tomcat]#ls conf/
Catalina context.xml logging.properties tomcat-users.xml
catalina.policy jaspic-providers.xml server.xml tomcat-users.xsd
catalina.properties jaspic-providers.xsd tomcat.conf web.xml
[root@centos7 tomcat]#cat conf/server.xml
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<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>
用户认证,配置文件是conf/tomcat-users.xml。打开tomcat-users.xml,我们需要一个角色manager-gui
[root@centos8 tomcat]#vim conf/tomcat-users.xml
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
#加下面两行,指定用户和密码
<role rolename="manager-gui"/>
<user username="admin" password="123456" roles="manager-gui"/>
</tomcat-users>
#修改全局配置文件需要重启服务生效
[root@centos8 tomcat]#systemctl restart tomcat
修改webapps/manager/META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<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" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.
(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreve
ntionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
查看正则表达式就知道是本地访问了,由于当前访问地址是192.168.x.x,可以修改正则表达式为
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.\d+\.\d+"
开启状态页 但是 只能本地访问
- server status 状态页
- manger app 管理项目
- host manger 配置虚拟主机的设置
[root@GW conf]#vim /usr/local/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
45 <user username="tomcat" password="tomcat" roles="manager-gui"/>
46 </tomcat-users>
开启允许远程状态页
由于是访问的http://192.168.91.100:8080/manager/status manager 这个页面,所以需要manager 文件夹有权限
[root@GW webapps]#vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
#添加允许的 主机地址
< allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.\d+\.\d+\.\d+" />
host manger
配置虚拟主机的设置
[root@GW conf]#vim /usr/local/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@GW host-manager]#vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml
< allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.\d+\.\d+\.\d+" />
tomcat 端口号
8080: 默认接收 http 请求的端口
8005: 安全端口,可以关闭tomcat
8009: apache 和 tomcat 联动 AJP 协议
虚拟主机配置
可能有时候公司会有多个项目需要运行,那么肯定不可能是一台服务器上运行多个
Tomcat 服务,这样会消耗太多的系统资源。此时,就需要使用到 Tomcat 虚拟主机。例如现
在新增两个域名 www.kgc.com,www.accp.com希望通过这两个域名访问到不同的项目内
容。
例子:
#创建虚拟主机前,必须先创建相关目录,否则创建虚拟机不成功
[root@centos7 ~]#mkdir /data/web{1,2,3}/ROOT/ -pv
[root@centos7 ~]#echo web1 > /data/web1/ROOT/index.html
[root@centos7 ~]#echo web2 > /data/web2/ROOT/index.html
[root@centos7 ~]#echo web3> /data/web3/ROOT/index.html
[root@centos7 ~]#chown -R tomcat.tomcat /data/
修改配置文件
[root@localhost data]#vim /usr/local/tomcat/conf/server.xml
#找到 host 主机项 ,注意 根目录中 一定要有 ROOT 这是默认 的主目录
#注意 默认的 结束 </HOST> 这段要在 默认结束的后面加上
<Host name="www.a.com" appBase="/data/web1"
unpackWARs="true" autoDeploy="true">
</Host>
<Host name="www.b.com" appBase="/data/web2"
unpackWARs="true" autoDeploy="true">
</Host>
<Host name="www.c.com" appBase="/data/web3"
unpackWARs="true" autoDeploy="true">
</Host>
root
alias 置换
Context配置
Context作用:
- 路径映射:将url映射至指定路径,而非使用appBase下的物理目录,实现虚拟目录功能
- 应用独立配置,例如单独配置应用日志、单独配置应用访问控制
#映射指定路径
<Context path="/test" docBase="/data/test" reloadable="true" />
#映射站点的根目录
<Context path="/" docBase="/data/website" reloadable="true" />
#还可以添加日志等独立的配置
<Context path="/test" docBase="/data/test" reloadable="true" >
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_test_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Context>
说明:
- path:指的是访问的URL路径,如果path与appBase下面的子目录同名,context的docBase路径优先更高
- docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)
- reloadable:true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB应用重新加载。生产环境中,建议使用false来禁用。
例子:
[root@localhost data]#mkdir test
[root@localhost data]#echo test > test/index.html
[root@localhost test]#vim /usr/local/tomcat/conf/server.xml
<Host name="www.a.com" appBase="/data/web1"
unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="/data/test" reloadable="false" />
##如果 访问 www.a.com/test/ 那么 就替换成"/data/test
</Host>
[root@node2 ~]#curl www.a.com:8080/test/
test
tomcat nginx 动静分离
实际操作
---------------------Nginx+Tomcat负载均衡、动静分离-------------------------
Nginx 服务器:192.168.10.1:80
Tomcat服务器1:192.168.10.10:80
Tomcat服务器2:192.168.10.20:8080 192.168.10.20:8081
1.部署Nginx 负载均衡器
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \ #启用文件修改支持
--with-http_stub_status_module \ #启用状态统计
--with-http_gzip_static_module \ #启用 gzip静态压缩
--with-http_flv_module \ #启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module #启用 SSL模块,提供SSL加密功能
--with-stream #启用 stream模块,提供4层调度
----------------------------------------------------------------------------------------------------------
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
2.部署2台Tomcat 应用服务器
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH
source /etc/profile
tar zxvf apache-tomcat-8.5.16.tar.gz
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
3.动静分离配置
(1)Tomcat1 server 配置
mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title> #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>
(2)Tomcat2 server 配置
mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test
vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title> #指定为 test2 页面
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
vim /usr/local/tomcat/tomcat1/conf/server.xml
#删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>
/usr/local/tomcat/tomcat1/bin/shutdown.sh
/usr/local/tomcat/tomcat1/bin/startup.sh
vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test3 page</title> #指定为 test3 页面
</head>
<body>
<% out.println("192.168.91.100");%>
</body>
</html>
systemctl stop firewalld
setenforce 0
vim /usr/local/tomcat/tomcat2/conf/server.xml
#删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
</Host>
/usr/local/tomcat/tomcat2/bin/shutdown.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
(3)Nginx server 配置
#准备静态页面和静态图片
echo '<html><body><h1>这是静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
cp /root/game.jpg /usr/local/nginx/html/img
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
#gzip on;
#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
upstream tomcat_server {
server 192.168.80.100:8080 weight=1;
server 192.168.80.101:8080 weight=1;
server 192.168.80.101:8081 weight=1;
}
server {
listen 80;
server_name www.kgc.com;
charset utf-8;
#access_log logs/host.access.log main;
#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
location ~ .*\.jsp$ {
proxy_pass http://tomcat_server;
#设置后端的Web服务器可以获取远程客户端的真实IP
##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。
proxy_set_header HOST $host;
##把$remote_addr赋值给X-Real-IP,来获取源IP
proxy_set_header X-Real-IP $remote_addr;
##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#配置Nginx处理静态图片请求
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/img;
expires 10d;
}
location / {
root html;
index index.html index.htm;
}
......
}
......
}
4.测试效果
测试静态页面效果
浏览器访问 http://192.168.80.10/
浏览器访问 http://192.168.80.10/game.jpg
测试负载均衡效果,不断刷新浏览器测试
浏览器访问 http://192.168.80.10/index.jsp
标签:xml,Tomcat,tomcat,local,usr,root
From: https://www.cnblogs.com/GrandOB/p/18276842