目录
前言
Servlet
一、什么是Servlet
SUN公司制定的一种用于拓展web服务器的功能组件规范,其主要作用是用于接收(浏览器)客户端传过来的数据,对数据进行处理计算,然后将数据返回前端浏览器,在浏览器上生成动态页面。
servlet是一种组件,组件是符合的一定的规范,并且约定了一部分功能,我们可以基于组件去开发自己的程序,组件必须部署到容器中才能运行,由容器来负责管理组件。
二、Web容器
1,作用:
给Servlet组件的运行提供一种运行环境,容器也被称为软件服务器,Java中可以使用不同的web容器,最常用的是Tomcat容器
2、tomcat 的介绍
Apache组织出的一款应用于web服务器端的容器,给servlet组件的运行提供环境。
安扎jdk
将jdk包下载到/opt/下
一,tomcat的安装
1、安装jdk
cd /opt
rpm -vih jdk-8u201-linux-x64.rpm
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64 #/etc/profile.d/环境变量脚本目录
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar #可执行文件的位置
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile.d/java.sh
2、安装tomcat
将tomcat包下载到/opt/下
cd /opt
tar zxf apache-tomcat-9.0.16.tar.gz -C /usr/local/ #解压安装在指定目录下
mv /usr/local/apache-tomcat-9.0.16 /usr/local/tomcat #修改目录名称
ln -s /usr/local/tomcat/bin/startup.sh /usr/local/bin/
ln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/bin/
startup.sh
netstat -anpt | grep 8080
登录192.168.100.6:8080检测
3、优化启动速度
生产环境中第一次启动tomcat可能会发现 tomcat启动很慢,默认情况下可能需要几十秒,此时可以修改jdk参数进行优化。
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
securerandom.source=file:/dev/urandom #修改117行
shutdown.sh
startup.sh
二,tomcat的虚机主机配置
1、域名映射与网页文件
vim /etc/hosts
192.168.100.6 www.cat.com www.dog.com
mkdir /usr/local/tomcat/webapps/cat
mkdir /usr/local/tomcat/webapps/dog
echo “this is cat page” >/usr/local/apache-tomcat-9.0.16//webapps/cat/index.jsp
echo “this is dog page” >/usr/local/apache-tomcat-9.0.16//webapps/dog/index.jsp
2、修改配置文件
vim /usr/local/tomcat/conf/server.xml
在165行下插入
<Host name="www.cat.com" appBase="webapps" unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/atomcat/webapps/cat" path="" reloadable="true" />
</Host>
<Host name="www.dog.com" appBase="webapps" unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/dog" path="" reloadable="true" />
</Host>
shutdown.sh
startup.sh
名词解析:
Host name :主机名
appBase : Tomcat程序工作目录,相对路径为webapps,绝对路径为/usr/local/apache-tomcat-9.0.48/webapps
unpackWARs :tomcat在webapps文件夹中发现war包文件时,是否自动将其解压
autoDeploy :设为true,则web.xml发生变化时,tomcat自动重新部署程序。实现这个功能必需允许后台处理
xmlvalidation :是香开启对XML文件的验证
xmlNamespaceAware :是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验
docBase : WEB应用的目录(本地路径)
path:设置访问的URI为WEB应用的根目录(URL路径),""表示默认,加载系统中自带的类(class文件)
reloadable :是否在程序有改动时重新载入
3、登录验证
登录 www.cat.com:8080和 www.dog.com:8080
(注意端口,这是写在tomcat网页文件)
实验成功!
三、一些参数的优化
默认安装下的缺省配置并不适合生产环境,它可能会频繁出现假死现象需要重启,只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面,分别为操作系统优化(内核参数优化),Tomcat配置文件参数优化,Java虚拟机(JM)调优。
这种优化是什么方向,能为客户提高体验感或者服务性能(运行、处理效率)
得到哪些提升/优化。
优化方向:
1、服务本身的(系统五大负载+内核优化)
2、配置文件(nginx压缩、防盗链、版本隐藏、缓存、)
3、第三方工具(ab辅助测试服务/服务器的健壮性)
常用的优化相关参数如下:
【maxThreads 】 Tomcat使用线程来处理接收的每个请求,这个值表示Tomcat可创建的最大的线程数,默认值是200。
【minspareThreads 】最小空闲线程数,Tomcat启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是10。
【maxSpareThreads 】最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值是-1(无限制)。一般不需要指定。
【URIEncoding 】指定Tomcat 容器的URL编码格式,语言编码格式这块倒不如其它Web服务器软件配置方便,需要分别指定。
【connnectionTimeout 】网络连接超时,单位:亳秒,设置为0表示永不超时,这样设置有隐患的。通常默认20000亳秒就可以。
【enableLookups 】是否反查域名,以返回远程主机的主机名,取值为: true或false,如果设置为false,则直接返回IP地址,为了提高处理能力,应设置为false。
【disableUploadTimeout 】上传时是否使用超时机制。应设置为true。
【connectionUploadTimeout 】上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效
【acceptCount 】 指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为100个。
【compression 】是否对响应的数据进行GZIP压缩,off:表示禁止压缩; on:表示允许压缩
(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off,压缩数据后可以有效的减少页面的大小,一般可以减小1/3左右,节省带宽。
【compressionMinSize】表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是2048
【compressableMimeType 】压缩类型,指定对哪些类型的文件进行数据压缩。
【noCompressionJserAgents= "gozilla,traviata” 】对于以下的浏览器,不启用压缩
以上是一些常用的配置参数,还有好多其它的参数设置,还可以继续深入的优化,HTTP Connector 与AJP Connector的参数属性值
1,优化参数
vim /usr/local/tomcat/conf/server.xml
------71行插入------
minSpareThreads="50"
enableLookups="false" #是否开启上传超时机制
disableUploadTimeout="true"
acceptCount="300" #队列
maxThreads="500"
processorCache="500" #系统可以缓存对象的数量
URIEncoding="UTF-8"
compression="on" #压缩
compressionMinsize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif, image/jpg,image/png"
shutdown.sh
startup.sh
四、nginx和tomcat 的搭建
以LNMP为例,一个企业内部最基础的架构组成需要一个处理静态web服务的页面,一个动态web服务的页面和数据库而我们实现了在Linux平台上,实现了Nginx + PHP实现动静分离,而实际生产中往往一台nginx
需要"对应"多个动态处理的服务(及tomcat),所以如何将前端接收到的动态请求转交给后端多个tomcat处理,是我们此处研究的内容。
环境:两台tomcat,一台nginx
nginx 192.168.100.7
tomcat1 192.168.100.6
tomcat2 192.168.100.5
动静分离配置
1、Tomcat1 server配置
mkdir -p /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>
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com" );%>
</body>
</html>
修改配置文件
vim /usr/local/tomcat/conf/server.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true"/> #大概在150行 新增
……
pattern="%{X-Real-IP}i %l %u %t "%r" %s %b"/> #171行检索的消息头
shutdown.sh
startup.sh #重启服务
curl 192.168.100.6:8080/index.jsp #登录验证
2、Tomcat2 server配置
mkdir -p /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 test2 page</title>
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com" );%>
</body>
</html>
修改配置文件
vim /usr/local/tomcat/conf/server.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true"/> #大概在150行 新增
shutdown.sh
startup.sh #重启服务
curl 192.168.100.5:8080/index.jsp #登录验证
3.nginx server端的配置
准备静态页面
echo ‘
this is static
’ > /usr/local/nginx/html/index.htmlvim /usr/local/nginx/conf/nginx.conf
http{
..........
#gzip on
upstream tomcat_server {
server 192.168.100.5:8080 weight=1;
server 192.168.100.6:8080 weight=1;
} #大概在34行插入这4行内容
.......
location ~ .*\.jsp$ {
proxy_pass http://tomcat_server;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
名称解析
名称解析
location ~ .*\.jsp$ {
proxy_pass http://tomcat_server; #匹配到以jsp结尾的URL都会转发给后端服务器
proxy_set_header HOST $host; #设定后端web服务器接收到的请求的主机名
proxy_set_header X-Real-IP $remote_addr; #获取ip地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #将经过的IP都记录下来
set_real_ip_from 192.168.100.6/24; #后端服务器的ip
set_real_ip_from 192.168.100.5/24; #从哪个header头检索出真实IP
real_ip_header X-Forwarded-For;
}
nginx -t
systemctl stop nginx
systemctl start nginx
这时候访问192.168100.7就会访问nginx 的静态页面
访问192.168.100.7/index.jsp 就会在tomcat1和tomcat2 进行轮询,实现可负载均衡
4、优化日志
vim /usr/local/nginx/conf/nginx.conf
http{
..........
location ~ .*\.jsp$ {
proxy_pass http://tomcat_server;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
set_real_ip_from 192.168.100.7/24;
real_ip_header X-Forwarded-For; #插入这这两行内容
}