Nginx+Tomcat负载均衡、动静分离群集
Tomcat简介
最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发安装Tomcat后,安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件
Tomcat重要目录
● bin: 存放启动和关闭Tomcat脚本
● conf: 存放Tomcat不同的配置文件
● doc: 存放Tomcat文档
● lib: 存放Tomcat运行需要的库文件
● logs: 存放Tomcat执行时的LOG文件
● src: 存放Tomcat的源代码
● webapps: Tomcat的主要Web发布目录
● work: 存放jsp编译后产生的class文件
Nginx应用
■ Nginx是一款非常优秀的HTTP服务器软件
● 支持高达50 000个并发连接数的响应
● 拥有强大的静态资源处理能力
● 运行稳定
● 内存、CPU等系统资源消耗非常低
■ 目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,提升整个站点的负载并发能力
Nginx负载均衡实现原理2-1
■ Nginx实现负载均衡是通过反向代理实现
■ 反向代理原理
■ Nginx配置反向代理的主要参数
● upstream服务池名{}
◆ 配置后端服务器池,以提供响应数据
● proxy_pass http:/l服务池名
◆ 配置将访问请求转发给后端服务器池的服务器处理
Nginx动静分离实现原理
■ 动静分离原理
● 服务端接收来自客户端的请求中,既有静态资源也有动态资源,静态资源由Nginx提供服务,动态资源Nginx转发至后端(Tomcat等)
■ Nginx静态处理优势
● Nginx处理静态页面的效率远高于Tomcat的处理能力
● 若Tomcat的请求量为1000次,则Nginx的请求量为6000次
● Tomcat每秒的吞吐量为0.6M,Nginx的每秒吞吐量为3.6M
● Nginx处理静态资源的能力是Tomcat处理的6倍
Tomcat部署与测试网站搭建
■ 要求部署两台后端Tomcat服务器
■ 为了进行测试,搭建两个内容不同的网站
■ Tomcat部署与网站搭建步骤
● 关闭firewall防火墙
● 安装JDK,配置JAVA环境
● 安装配置Tomcat
● 创建/web/webapp1目录,修改server.xml,将网站文件目录更改到/web/webapp1/路径下
● /web/webapp1/下建立测试页面index.jsp,并进行测试
Nginx配置负载均衡、动静分离
■ 在Nginx服务器上安装Nginx,反向代理两个Tomcat站点,并实现负载均衡
● 关闭Firewalld防火墙
● 安装Nginx依赖软件
● 包解压并编译安装Nginx
● 配置nginx.conf,添加location静态页面处理及添加upstream配置段与proxy_pass
● 检测配置文件与启动Nginx
● 测试负载均衡、动静分离效果
部署流程
案例:Nginx+Tomcat负载均衡、动静分离
■ 以Nginx作为负载均衡器,Tomcat作为应用服务器
■ 环境配置
■ 配置NFS服务器
[root@nfs ~]# systemctl stop firewalld
[root@nfs ~]# setenforce 0
[root@nfs ~]# mkdir /opt/web1/
[root@nfs ~]# mkdir /opt/web2/
[root@nfs ~]# cd /opt/web1/
[root@nfs web1]# vi index.jsp #设置tomcat1主页
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<head>
<title>tomcat1 </title>
</head>
<body>
<% out println("this is tomcat server");%>
<div>动态页面</div></br><img src="a.jpg" />
</body>
</html>
#这个jsp中引入的page标签
#language表示语言是java
#import类似于java类中的import就是把包导入进来,这样在jsp才可以调用包中的类
#pageEncoding表示页面的编码格式
[root@nfs web1]# cp index.jsp /opt/web2
[root@nfs web1]# cd /web2
[root@nfs web2]# vi index.jsp #设置tomcat1主页
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<head>
<title>tomcat2 </title>
</head>
<body>
<% out println("this is tomcat server");%>
<div>动态页面</div></br><img src="b.jpg" />
</body>
</html>
[root@nfs ~]# cd
[root@nfs ~]# vi /etc/exports
/web1 192.168.10.30(ro)
/web2 192.168.10.40(ro)
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl restart rpcbind
[root@nfs ~]# showmount -e
Export list for nfs:
/opt/web1 192.168.10.30(ro)
/opt/web2 192.168.10.40(ro)
■ 配置Tomcat1服务器
[root@tomcat1 ~]# tar zxvf jdk-8u91-linux-x64.tar.gz
[root@tomcat1 ~]# mv jdk1.8.0_91/ /usr/local/java
[root@tomcat1 ~]# vi /etc/profile #最后一行下添加
export JAVA_HOME=/usr/loacl/java #全局变量,绝对路径
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre #引用老的环境变量冒号后跟上新的环境变量
[root@tomcat1 ~]# source /etc/profile
[root@tomcat1 ~]# echo $PATH
[root@tomcat1 ~]# java -version #查看版本
[root@tomcat1 ~]# vi abc.java #编写java小脚本,测试是否可以正常工作
public class abc {
public static void main (String[] args) {
System.out.println("hello");
}
}
[root@tomcat1 ~]# yum -y install java-devel
[root@tomcat1 ~]# javac abc.java
[root@tomcat1 ~]# java abc
[root@tomcat1 ~]# tar zxvf apache-tomcat-8.5.16.tar.gz
[root@tomcat1 ~]# mv apache-tomcat-8.5.16 /usr/local/tomcat8
[root@tomcat1 ~]# mkdir /webapp1
[root@tomcat1 ~]# cd /webapp1/
[root@tomcat1 webapp1]# mount 192.168.10.50:/opt/web1 /webapp1/
[root@tomcat1 webapp1]# df -Th
[root@tomcat1 ~]# ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup
[root@tomcat1 ~]# ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown
[root@tomcat1 ~]# tomcatup
[root@tomcat1 ~]# netstat -anpt | grep 8080
■ 配置Tomcat2服务器
[root@tomcat2 ~]# tar zxvf jdk-8u91-linux-x64.tar.gz
[root@tomcat2 ~]# mv jdk1.8.0_91 /usr/local/java
[root@tomcat1 ~]# vi /etc/profile
export JAVA_HOME=/usr/loacl/java #全局变量,绝对路径
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre
[root@tomcat1 ~]# source /etc/profile
[root@tomcat1 ~]# echo $PATH
[root@tomcat1 ~]# java -version #查看版本
[root@tomcat1 ~]# vi abc.java #编写java小脚本,测试是否可以正常工作
public class abc {
public static void main (String[] args) {
System.out.println("hello");
}
}
[root@tomcat1 ~]# yum -y install java-devel
[root@tomcat1 ~]# javac abc.java
[root@tomcat1 ~]# java abc
[root@tomcat1 ~]# tar zxvf apache-tomcat-8.5.16.tar.gz
[root@tomcat1 ~]# mv apache-tomcat-8.5.16 /usr/local/tomcat8
[root@tomcat1 ~]# mkdir /webapp1
[root@tomcat1 ~]# cd /webapp1/
[root@tomcat1 webapp1]# mount 192.168.10.50:/opt/web2 /webapp2/
[root@tomcat1 webapp1]# df -Th
[root@tomcat1 ~]# vi /usr/local/tomcat8/conf/server.xml #修改站点目录
<Context docBase="/webapp2" path="" reloadable="false">
</Context>
[root@tomcat1 ~]# ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup
[root@tomcat1 ~]# ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown
[root@tomcat1 ~]# tomcatup
配置Nginx1
[root@nginx1 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel #pcre-devel:正则表达式库;zlib-devel:函数库
[root@nginx1 ~]# useradd -M -s /sbin/nologin nginx #创建不带宿主,不可登录的用户nginx
[root@nginx1 ~]# tar zxvf nginx-1.13.7.tar.gz #解压缩
[root@nginx1 ~]# cd nginx-1.13.7/ #进入主目录
[root@nginx1 nginx-1.13.7]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx #安装路径,属主,属组设置
[root@nginx1 nginx-1.13.7]# make && make install #编译安装
[root@nginx1 nginx-1.13.7]# ln -s /usr/local/nginx/conf/nginx.conf /etc/ #创建设置链接
[root@nginx1 nginx-1.13.7]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/ #创建命令链接,方便使用命令
[root@nginx1 nginx-1.13.7]# cd
[root@nginx1 ~]# vi /usr/local/nginx/conf/nginx.conf
upstream tomcat_server { #服务地址池名
server 192.168.10.30:8080 weight=1;
server 192.168.10.40:8080 weight=1;
}
location ~ \.jsp$ {
proxy_pass http://tomcat_server;
} #服务地址池名
[root@nginx1 ~]# nginx -t 检查语法
[root@nginx1 ~]# nginx 服务启动
[root@nginx1 ~]# netstat -anpt | grep 80 查看端口状态
[root@nginx1 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel #安装依赖包
[root@nginx1 ~]# tar zxvf keepalived-2.0.13.tar.gz #解压缩
[root@nginx1 ~]# cd keepalived-2.0.13/
[root@nginx1 keepalived-2.0.13]# ./configure --prefix=/ 路径设置
[root@nginx1 keepalived-2.0.13]# make && make install 编译安装
[root@nginx1 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d
[root@nginx1 keepalived-2.0.13]# 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
[root@nginx1 keepalived-2.0.13]# scp /usr/local/src/nginx.sh root@20.0.0.12:/usr/local/src
[root@nginx1 keepalived-2.0.13]# chmod +x /usr/local/src/nginx.sh
[root@nginx1 keepalived-2.0.13]# systemctl start keepalived.service
[root@nginx1 keepalived-2.0.13]# systemctl status keepalived.service 服务状态
[root@nginx1 ~]# tail -100 /var/log/messages 查看日志
[root@nginx1 ~]# ip addr 查看虚拟地址
[root@nginx1 keepalived-2.0.13]# vi /etc/init.d/keepalived
#chkconfig: 35 21 79
[root@nginx1 keepalived-2.0.13]# chmod 755 /etc/init.d
[root@nginx1 keepalived-2.0.13]# chkconfig --add keepalived
[root@nginx1 keepalived-2.0.13]# chkconfig --list
[root@nginx1 keepalived-2.0.13]# vi /etc/keepalived/keepalived.conf
删除所有,除了第一行
添加:
global_defs {
router_id nginx1 #本服务器的名称
}
vrrp_script chk_http_port { #vrrp脚本
script "/usr/local/src/nginx.sh" #脚本路径 最后手动执行此脚本,以确保脚本能够正常运行
interval 2 #检测间隔时间 单位秒
weight 2
}**加粗样式**
vrrp_instance vi_1 { #实例名称
state MASTER #指定keepalived的角色,MASTER为主,BACKUP为备
interface ens33 #当前进行vrrp通讯的网络接口卡
virtual_router_id 51 #虚拟路由编号,主从要一致
priority 110 #优先级,数值越大,获取地址优先级越大
adver_int 1 #检查间隔,默认为1s (vrrp组播周期秒数)
authentication { #认证方式
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port #调用检测脚本
}
virtual_ipaddress {
20.0.0.100 #定义虚拟ip(VIP)
}
}
[root@nginx1 keepalived-2.0.13]# scp /etc/keepalived/keepalived.conf root@192.168.10.20:/etc/keepalived/ #拷贝文件
[root@nginx2 keepalived-2.0.13]# vi /etc/keepalived/keepalived.conf
修改:
router_id nginx2 服务器名称
state BACKUP 指定keepalived的角色,MASTER为主,BACKUP为备
priority 105 优先级
浏览器访问
http://192.168.10.100.100/index.jsp