架构师必会的nginx和tomcat集群高可用动静分离(从入门到高手的第七步)

Posted 遙遙背影暖暖流星

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了架构师必会的nginx和tomcat集群高可用动静分离(从入门到高手的第七步)相关的知识,希望对你有一定的参考价值。

前言

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 】是否反查域名,以返回远程主机的主机名,取值为: truefalse,如果设置为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 &quot;%r&quot; %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.html

vim /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;     #插入这这两行内容
}

在这里插入图片描述

以上是关于架构师必会的nginx和tomcat集群高可用动静分离(从入门到高手的第七步)的主要内容,如果未能解决你的问题,请参考以下文章

架构实践架构师必知必会的 5 种业界主流的架构风格

29个阿里架构师必会的核心实战知识点整理清单

29个阿里架构师必会的核心实战知识点整理清单

haproxy+nginx+tomcat+memcache实现动静分离会话同步集群

Linux运维-集群技术进阶Nginx+Keepalived+Tomcat搭建高可用/负载均衡/动静分离的Webserver集群

hadoop02---高可用网站架构