Nginx高可用 Tomcat 实现动静分离
文章目录
一、为什么要实现动静分离
1.1 什么是动静分离?
将动态请求和静态请求区分访问,
1.2 为什么要做动静分离?
静态由Nginx处理, 动态由PHP处理或Tomcat处理…
因为Tomcat程序本身是用来处理jsp代码的,但tomcat也能处理静态资源.
tomcat本身处理静态效率不高,还会带来资源开销.
1.3 如何实现动静分离?
Nginx根据客户端请求的url来判断请求的是否是静态资源,如果请求的url包含jpg、png,则由Nginx处理。
如果请求的url是.php或者.jsp等等,这个时候这个请求是动态的,将转发给tomcat处理。
总结来说,Nginx是通过url来区分请求的类型,并转发给不同的服务端。
动态资源和静态资源分开,使服务器结构更清晰。
二、为什么使用nginx?
在传统的web项目中,并发量小,用户使用的少,所以在低并发的情况下,用户可以直接访问tomcat服务器,然后tomcat服务器返回消息给用户,理解如下图:
当然我们知道,为了解决高并发,可以使用负载均衡,也就是我们多增加几个tomcat服务器,当用户访问的时候,请求可以提交到空闲的tomcat服务器上
总结就是:
1.Nginx实现负载均衡是通过反向代理实现、
当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
2.Nginx配置反向代理的主要参数
(1)upstream 服务池名{}
配置后端服务器池,以提供响应数据
(2)proxy_pass http://服务池名
配置将访问请求转发给后端服务器池的服务器处理
2.1 Nginx静态处理优势
- Nginx处理静态页面的效率远高于Tomcat的处理能力;
- 若Tomcat的请求量为1000次,则Nginx的请求量为6000次;
- Tomcat每秒的吞吐量为0.6M,Nginx的每秒吞吐量为3.6M;
- Nginx处理静态资源的能力是Tomcat处理的6倍。
三、Nginx动静分离实现原理
- 如下图所示,我们部署了 nginx 和 tomcat服务器,把所有的静态资源都放置在nginx的webroot目录下面,把动态请求的程序都放在 tomcat 的webroot目录下面。
- 当客户端访问服务端的时候,如果是静态资源的请求,就直接到nginx的webroot目录下面获取资源。
- 如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给tomcat进行处理,这样就实现了动静分离,提高了服务器处理请求的性能。
四、Nginx,Tomcat负载均衡,动静分离案例
其中使用Keepalived来实现高可用
环境配置:
主机 | IP地址 |
---|---|
Nginx负载均衡器 1 + Keepalived | 192.168.40.11 |
Nginx负载均衡器 2 + Keepalived | 192.168.40.12 |
Tomcat网站服务节点 1 | 192.168.40.13 |
Tomcat网站服务节点 2 | 192.168.40.14 |
NFS共享服务器 | 192.168.40.15 |
安装NFS:
[root@nfs ~]# mkdir /web1
[root@nfs ~]# mkdir /web2
[root@nfs ~]# vi /web1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>tomcat1</title>
</head><body>
<% out.println("this is tomcat1 server1");%>
<div>动态页面1</div><br/><img src="a.jpg" />
</body>
</html>
[root@nfs ~]# cp index.jsp /web2
[root@nfs ~]# vi /web2/index.jsp #修改web2节点
[root@nfs ~]# cd /web1 #导入a.jpg图片
[root@nfs web1]# ls
a.jpg index.jsp
[root@nfs web1]# cd /web2 #导入b.jpg图片
[root@nfs web2]# ls
b.jpg index.jsp
[root@nfs ~]# vi /etc/exports
/web1 192.168.40.13(ro)
/web2 192.168.40.14(ro)
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# showmount -e
Export list for nfs:
/web2 192.168.40.14
/web1 192.168.40.13
安装Tomcat
tomcat1:
导入jdk+tomcat安装包
先安装jdk:
tar zxvf jdk-8u91-linux-x64.tar.gz
mv jdk1.8.0_91/ /usr/local/java
vi /etc/profile
末行添加:
export JAVA_HOME=/usr/local/java ##设置java根目录
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre ##在PATH环境变量中添加JAVA根目录下的bin子目录
source /etc/profile ##java.sh脚本导入到环境变量中,使其生效
echo $PATH
vi abc.java #测试
public class abc{
public static void main (String[] args) {
System.out.println("hello world!!!");
}
}
javac abc.java
java abc
安装tomcat:
tar zxvf apache-tomcat-8.5.16.tar.gz
mv apache-tomcat-8.5.16/ /usr/local/tomcat8
mkdir /webapp1 #创建挂载目录
mount 192.168.40.15:/web1 /webapp1
df -Th #查看挂载情况
vi /usr/local/tomcat8/conf/server.xml #修改主页的站点目录
找到<Host name="localhost">
下面添加:
<Context docBase="/webapp1" path="" reloadable="false">
</Context>
#站点目录 #网页 #文件自动加载
ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup
ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown
tomcatup #启动
netstat -anpt | grep 8080
tomcat2的部署过程与1相同。
测试
在win10*问
安装Nginx + Keepalived
nginx1:
导入nginx安装包
yum -y install pcre-devel zlib-devel
tar zxvf nginx-1.13.7.tar.gz
cd nginx-1.13.7/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
useradd -M -s /sbin/nologin nginx #创建一个名为nginx的用户
ln -s /usr/local/nginx/conf/nginx.conf /etc/
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
vi /etc/nginx.conf
1、在#gzip on
添加
upstream tomcat_server {
server 192.168.40.13:8080 weight=1;
server 192.168.40.14:8080 weight=1;
}
2、在server { 下
添加
location ~ \.jsp$ { #反向代理
proxy_pass http://tomcat_server;
}
nginx -t #检查语法
nginx
netstat -anpt | grep 80
如:killall -1 nginx(若未出效果,可重启nginx)
测试1:
在win10*问:192.168.40.11/index.jsp
图片没有显示!!
因为没有把静态资源(图片)放入nginx站点目录下,所有没有正常显示:
cd /usr/local/nginx/html/
导入a.jpg b.jpg
测试2:
此时再访问:192.168.40.11/index.jsp
Keepalived 1:
yum -y install popt-devel kernel-devel openssl-devel
tar zxvf keepalived-2.0.13.tar.gz
cd keepalived-2.0.13/
./configure --prefix=/
make && make install
cp keepalived/etc/init.d/keepalived /etc/init.d #加入系统管理服务
vi /etc/init.d/keepalived
# chkconfig: 35 21 79
(- 改成35)
chmod +x /etc/init.d/keepalived
chkconfig -add keepalived
chkconfig --list
systemctl enable keepalived.service
vi /etc/keepalived/keepalived.conf #编辑配置文件
! Configuration File for keepalived
global_defs {
router_id nginx1 #本服务器的名称
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx.sh"
interval 2
weight 2
}
vrrp_instance VI_1 { #定义VRRP热备实例
state MASTER #热备状态,MASTER(主服务器)
interface ens33 #承载VIP地址的物理接口
virtual_router_id 51 #虚拟路由器的ID号,每个热备组保持一致
priority 110 #优先级,数值越大优先级越高
advert_int 1 #通告间隔秒数(心跳频率)
authentication { #热备认证信息,每个热备组保持一致
auth_type PASS #认证类型
auth_pass 8888 #密码字符串
}
track_script {
chk_http_port
}
virtual_ipaddress { ##指定漂移地址(VIP)
192.168.40.100
}
}
vi /usr/local/src/nginx.sh #添加检测脚本
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ]
then /usr/local/nginx/sbin/nginx
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]
then exit 1
else exit 0
fi
else
exit 0
fi
chmod +x /usr/local/src/nginx.sh
systemctl start keepalived.service
systemctl status keepalived.service
ip addr #检查漂移地址
tail -100 /var/log/messages #查看日志
Keepalived 2:
与Keepalived 1 的部署步骤基本相同,
在vi /etc/keepalived/keepalived.conf中修改三项
router_id nginx2
state BACKUP
priority 105
测试:
本文地址:https://blog.csdn.net/Mr_XHC/article/details/111032711