文章目录
Nginx+Tomcat动静分离+keepalived高可用
一: 动静分离
-
动静分离:
将网站的静态资源(HTML,JavaScript,CSS,img等文件)与 后台应用 分开部署,提高用户访问静态代码的速度,降低对后台应用的访问。 -
静态资源部署在Nginx上,
后台项目部署到应用服务器上,根据一定规则使静态资源请求全部转到nginx服务器,达到动静分离的目的。 -
静态资源部署在CDN(Content Delivery Network)内容分发网络
将项目中的JavaScript,CSS以及img文件都存放在CDN服务器上,将HTML文件一起存放到CDN上之后,可以将静态资源统一放置在一种服务器上,便于前端进行维护;而且用户在访问静态资源时,可以很好利用CDN的优点 -
后端API提供数据,后端应用提供API
根据前端的请求进行处理,并将处理结果通过JSON格式返回至前端。目前应用主要采用Java平台开发,因此应用服务器主要是Tomcat服务器,现在也开始有部分应用采用node进行开发,应用服务器也开始使用node服务器
1.1 动静分离优缺点
-
优点:API接口服务化;前后端开发并行;减轻后端服务器的压力,提高静态资源访问速度
-
缺点:不利于网站SEO(搜索引擎优化);开发量变大;在业务高速发展时需要慎重考虑
1.2 动静分离场景
- 静态文件访问量大,服务器负载高,I/O问题导致用户访问卡顿
- 静态文件数量大,服务器存储空间不够
- 静态文件用户访问量大,且分布在各地
- 并发下载量高
二: Nginx+Tomcat实现动静分离
-
由于Tomcat本身处理静态效率不高,还会带来资源消耗,因此使用动静分离,将静态请求交由Nginx处理,动态请求交由Tomcat处理
-
Nginx根据客户端请求的url来判断请求的是否是静态资源,如果请求的url包含jpg、png,则由Nginx处理;如果请求的url是.php或者.jsp等,则被认为是动态的,将转发tomcat处理。即Nginx通过url来区分请求的类型,并且转发给不同的服务端
-
网络结构图:
三、操作
3.1 环境
nginx1 ip:192.168.100.10 主调度器
nginx2 ip:192.168.100.11 从调度器
tomcat1 ip:192.168.100.12
tomcat2 ip:192.168.100.13
nfs服务器 ip:192.168.100.14
验证访问客户端 ip:192.168.100.15
3.2 配置nfs服务器
- 安装nfs-utils rpcbind
yum -y install nfs-utils rpcbind
- 创建目录存放资源
mkdir /web1
mkdir /web2
- 编辑共享jsp网页资源
vim /web1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<head>
<title>tomcat1</title>
</head>
<body>
<% out.println ("This is tomcat1 server"); %>
<div>动态页面</div><br/><img src="a.jpg" />
</body>
</html>
:wq
vim /web2/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<head>
<title>tomcat2</title> //这里不同
</head>
<body>
<% out.println ("This is tomcat2 server"); %> //这里不同
<div>动态页面</div><br/><img src="b.jpg" /> //这里不同
</body>
</html>
:wq
- 编辑配置文件
vim /etc/exports
/web1 192.168.100.12(ro)
/web2 192.168.100.13(ro)
:wq
- 启动nfs systemctl start nfs
systemctl start nfs
systemctl start rpcbind
3.3 配置tomcat
3.3.1 配置java环境
- 解压jdk
tar zxvf jdk-8u91-linux-x64.tar.gz -C /opt
mv /opt/jdk1.8.0_91 /usr/local/java
- PATH环境变量添加java路径
cd /etc/profile.d/
vim java.sh
export JAVA_HOME=/usr/local/java/ //设置java根目录
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre //在PATH环境变量中添加java根目录下的bin子目录
- 测试
source java.sh
echo $PATH
java -version //查看版本
写段Java小脚本,测试是否能正常工作
vim test.java
public class test {
public static void main (String[] args) {
System.out.println("你好,世界!!!");
}
}
执行:javac test.java 编译后生成可执行文件
测试:java test 原样输出则为成功!
3.3.2 tomcat
- 安装tomcat
tar zxvf apache-tomcat-8.5.16.tar.gz -C /opt/
mv apache-tomcat-8.5.16 /usr/local/tomcat8
- tomcat启动和关闭
/usr/local/tomcat8/bin/startup.sh
netstat -anpt | grep 8080
/usr/local/tomcat8/bin/shutdown.sh //关闭tomcat
netstat -anpt | grep 8080
3. 链接tomcat启动关闭程序
ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup
ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown
- 创建网页资源挂载点,并挂载
mkdir /webapp1
mkdir /webapp2
mount 192.168.100.14:/web1 /webapp1
mount 192.168.100.14:/web2 /webapp2
- 编辑tomcat的server.xml配置文件
vim /usr/local/tomcat8/conf/server.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/webapp1" path="" reloadable="false">
</Context> //添加//
</Host>
//注释:docBase web应用的文档基准目录
//reloadable:值为true时,当web.xml或者class有改动的时候,都会自动reload无需重启的服务
// path="" 指定访问路径uri ,访问url路径下是否跟内容
3.3.3 安装nginx并配置调度
- 编译安装nginx
yum -y install pcre-devel zlib-devel openssl-devel
useradd -M -s /sbin/nologin nginx
tar zxvf nginx-1.12.2 -C /opt
cd /opt/nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
--with-file-aio \ //同时提交多个io请求给内核
--with-http_stub_status_module \ //状态统计
--with-http_gzip_static_module \
--with-http_flv_module \ //支持对FLV(flash)文件的拖动播放
--with-http_ssl_module //支持安全ssl模块
make && make install
- 编辑nginx配置文件实现动静分离
vim /usr/local/nginx/conf/nginx.conf
keepalive_timeout 65;
#gzip on;
添加: upstream tomcat_server {
//添加
server 192.168.100.12:8080 weight=1;
server 192.168.100.13:8080 weight=1;
}
server {
listen 80;
... ... 省略
location / {
root html;
index index.html index.htm;
}
######添加
location ~ \.jsp$ {
//添加
proxy_pass http://tomcat_server;
}
}
:wq
- 链接nginx启动程序
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx -t
- 测试动静分离效果
浏览器访问 http://192.168.100.10/index.jsp
http://192.168.100.10/index.jsp 图片不显示
使用抓包软件 发现静态资源图片 是在nginx服务器上查找的。
所以需要把资源放在nginx中 /usr/local/nginx/html
四、nginx+keepalived高可用
4.1 nginx主调度器
- 编译安装keepalived
tar zxvf keepalived.-2.0.13.tar.gz
yum -y install popt-devel kernel-devel openssl-devel //编译安装所需环境
cd keepalived-2.0.13/
./configure --prefix=/
make && make install
- 复制keepalived init.d文件
cp keepalived/etc/init.d/keepalived /etc/init.d/
- 编辑keepalived配置文件
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
1391578633@qq.com
}
notification_email_from sns-lvs@gmail.com
smtp_server smtp.qq.com
smtp_connection_timeout 30
router_id nginx_master //可以只设置这一个
}
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh" //最后手动执行此脚本,确保它正常执行
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 66 //虚拟路由编号,主从一致
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port //调用脚本
}
virtual_ipaddress {
192.168.100.200
}
}
:wq
- 编辑定义的脚本文件
vim /usr/local/src/check_nginx_pid.sh //检测是否开启nginx服务,并开启nginx服务
#!/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
:wq
chmod +x /usr/local/src/check_nginx_pid.sh
- 启动nginx服务器
nginx
- 启动keepalived
systemctl start keepalived
4.2 nginx从调度器
配置和主服务器大致相同,只有3处不同
router_id nginx_backup
state BACKUP
priority 105
4.3 验证效果
访问VIP 192.168.100.200/index.jsp