一.Nginx负载均衡完成原理
Nginx完成负载均衡是通过反向署理完成
1、 反向署理原理
2、反向署理的概念
反向署理(Reverse Proxy)方法是指以署理服务器来承受internet上的衔接恳求,然后将恳求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上恳求衔接的客户端,此时署理服务器对外就表现为一个反向署理服务器。
反向署理是为服务端服务的,反向署理能够协助服务器接纳来自客户端的恳求,协助服务器做恳求转发,负载均衡等。
反向署理对服务端是通明的,对咱们是非通明的,即咱们并不知道自己拜访的是署理服务器,而服务器知道反向署理在为他服务。
3、反向署理的优势
反向署理的优势:
- 隐藏实在服务器;
- 负载均衡便于横向扩大后端动态服务;
- 动态别离,提升体系健壮性;
4、Nginx四层反向署理和七层反向署理
四层反向署理:是根据IP+PORT(TCP/UDP端口)转发
七层反向署理:根据http,https,mail署理转发
二、Nginx动态别离完成原理
1、动态别离的概念
动态别离是指在web
服务器架构中,将静态页面与动态页面或许静态内容接口和动态内容接口分开不同体系拜访的架构规划办法,进而提示整个服务的拜访性和可维护性。
2、动态别离的原理
服务端接纳来自客户端的恳求中。既有静态资源也有动态资源,静态资源由Nginx供给服务,动态资源Nginx转发至后端
3、Nginx 静态处理优势
• Nginx处理静态页面的功率远高于Tomcat的处理才能
• 若Tomcat的恳求量为1000次,则Nginx的恳求量为6000次
• Tomcat每秒的吞吐量为0.6M,Nginx的每秒吞吐量为3.6M
• Nginx处理静态资源的才能是Tomcat处理的6倍
三、Nginx负载均衡调度算法(6种)
1、轮询(默许)
每个恳求按时刻次序逐一分配到不同的后端服务器,假如超越了最大失败次数后(max_fails,默许1),在失效时刻内(fail_timeout,默许10秒),该节点失效权重变为0,超越失效时刻后,则康复正常,或许全部节点都为down后, 那么将所有节点都康复为有用持续探测,一般来说rr能够依据权重来进行均匀分配。
2、加权轮训
weight的值越大分配到的权限概率越高,主要用于后端每台服务器功用不均匀情况,或许仅仅为在主从情况下设置不同的权重值,达到合理运用主机资源
3、least_conn最少衔接
优先将客 户端恳求调度到当时衔接最少的服务器。
4、ip_hash
每个恳求按拜访ip的hash结果分配,这样每个访客固定拜访一个后端服务器, 能够解决session(会话状况)的问题,但是ip_hash会形成负载不均,有的服务恳求承受多,有的服务恳求承受少,所以不建议采用ip_hash方法
弥补:session的概念
session同享问题可用后端服务的session同享代替nginx的ip_hash。ip_hash无法作用于四层反向署理,装备需求将其他方法删去例如weight删掉然后直接在加上
注释:
Session又称为会话状况,是Web体系中最常用的状况,用于维护和当时浏览器实例相关的一些信息。咱们控制用户去权限中经常用到Session来存储用户状况
session其实分为客户端Session和服务器端Session。
当用户初次与Web服务器建立衔接的时分,服务器会给用户分发一个 SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在 HTTP头中提交给Web服务器,这样Web服务器就能区别当时恳求页面的是哪一个客户端。这个SessionID便是保存在客户端的,归于客户端Session。
其实客户端Session默许是以cookie的方法来存储的,所以当用户禁用了cookie的话,服务器端就得不到SessionID。这时咱们能够运用url的方法来存储客户端Session。也便是将SessionID直接写在了url中,当然这种办法不常用。
Session同享:指在一个浏览器对应多个Web服务时,服务端的Session数据需求同享。例如单点登录、Web服务器集群等场景都需求用到、多子服务。
5、fair(第三方)
按后端服务器的呼应时刻来分配恳求,呼应时刻短的优先分配。
6、url_hash(第三方)
和ip hash算法类似,是对每个恳求按url的hash结果分配,使每个URL定向到同一个后端服务器, 但是也会形成分配不均的问题, 这种方法后端服务器为缓存时比较好。
四、Nginx+Tomcat负载均衡、动态别离的操作过程
1、预备三台服务器,Nginx作为负载均衡器,Tomcat作为应用服务器
Nginx 服务器:192.168.2.66:80
Tomcat服务器1:192.168.2.105:80
Tomcat服务器2:192.168.2.200:8080 192.168.2.200:8081
2、部署Nginx 负载均衡器
systemctl stop firewalld
setenforce 0
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \ #启用文件修正支撑
--with-http_stub_status_module \ #启用状况计算
--with-http_gzip_static_module \ #启用 gzip静态紧缩
--with-http_flv_module \ #启用 flv模块,供给对 flv 视频的伪流支撑
--with-http_ssl_module #启用 SSL模块,供给SSL加密功用
----------------------------------------------------------------------------------------------------------
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
3、部署2台Tomcat 应用服务器
systemctl stop firewalld
setenforce 0
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile.d/java.sh
tar zxvf apache-tomcat-8.5.16.tar.gz
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
netstat -ntap | grep 8080
4、动态别离装备
Tomcat1 server 装备
mkdir /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,Tomcat1");%>
</body>
</html>
vim /usr/local/tomcat/conf/server.xml
#由于主机名 name 装备都为 localhost,需求删去前面的 HOST 装备
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
</Context>
</Host>
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
Tomcat2 server 装备(多实例)
mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test
vim /usr/local/tomcat/tomcat1/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,Tomcat2中的实例1");%>
</body>
</html>
vim /usr/local/tomcat/tomcat1/conf/server.xml
#删去前面的 HOST 装备
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>
/usr/local/tomcat/tomcat1/bin/shutdown.sh
/usr/local/tomcat/tomcat1/bin/startup.sh
vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test3 page</title>
</head>
<body>
<% out.println("动态页面 3,Tomcat2中的实例2");%>
</body>
</html>
vim /usr/local/tomcat/tomcat2/conf/server.xml
#删去前面的 HOST 装备
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
</Host>
/usr/local/tomcat/tomcat2/bin/shutdown.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
Nginx server 装备——七层转发装备
#预备静态页面和静态图片
echo '<html><body><h1>这是静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
cp /root/game.jpg /usr/local/nginx/html/img
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
#gzip on;
#装备负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
upstream tomcat_server {
server 192.168.116.70:8080 weight=1;
server 192.168.116.120:8080 weight=1;
server 192.168.116.120:8081 weight=1;
}
server {
listen 80;
server_name www.kgc.com;
charset utf-8;
#access_log logs/host.access.log main;
#装备Nginx处理动态页面恳求,将 .jsp文件恳求转发到Tomcat 服务器处理
location ~ .*.jsp$ {
proxy_pass http://tomcat_server;
#设置后端的Web服务器能够获取远程客户端的实在IP
##设定后端的Web服务器接纳到的恳求拜访的主机名(域名或IP、端口),默许HOST的值为proxy_pass指令设置的主机名。假如反向署理服务器不重写该恳求头的话,那么后端实在服务器在处理时会认为所有的恳求都来在反向署理服务器,假如后端有防进犯战略的话,那么机器就被封掉了。
proxy_set_header HOST $host;
##把$remote_addr赋值给X-Real-IP,来获取源IP
proxy_set_header X-Real-IP $remote_addr;
##在nginx 作为署理服务器时,设置的IP列表,会把通过的机器ip,署理机器ip都记录下来
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#装备Nginx处理静态图片恳求
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/img;
expires 10d;
}
location / {
root html;
index index.html index.htm;
}
......
}
......
}
5、测验作用
测验静态页面作用
浏览器拜访http://192.168.2.66/
浏览器拜访http://192.168.2.66/pic.jpg
测验负载均衡作用,不断刷新浏览器测验
浏览器拜访http://192.168.2.66/index.jsp
五、实例操作:Nginx+Tomcat负载均衡、动态别离
1、预备好Nginx服务器(192.168.2.66)
2、预备好tomcat服务器1(192.168.2.105:8080)
3、预备好Tomcat服务器2(两个实例):192.168.2.200:8080 192.168.2.200:8081
4、动态别离Tomcat1 server 装备
4.1 装备Tomcat1的动态网页显示内容
4.2 增加新的host内容
4.3 重启服务
5、Tomcat2 server 装备(实例1)
5.1 创立Tomcat实例1的网页测验目录test和测验网页文件
5.2 Tomcat实例1主装备删去前面的 HOST 装备,增加新的HOST装备
5.3 重启服务
6、Tomcat2 server 装备(实例2)
6.1 创立Tomcat实例2的网页测验目录test和测验网页文件
6.2 Tomcat实例2主装备删去前面的 HOST 装备,增加新的HOST装备
6.3 重启服务
7、Nginx server 装备(192.168.2.66)
7.1 预备网页显示相关内容
7.2 修正主装备文件——七层转发装备
7.3 重启服务
8、运用win10客户端在浏览器中进行测验,动态页面测验进行不断刷新即可
测验静态页面作用
浏览器拜访http://192.168.2.66/
浏览器拜访http://192.168.2.66/meme.jpg
测验负载均衡作用,不断刷新浏览器测验
浏览器拜访http://192.168.2.66/index.jsp
8.1 测验静态页面作用
8.2 测验负载均衡作用,不断刷新浏览器测验
六、Nginx四层署理装备
1、nginx做四层署理时编译需求增加 –with-stream模块
1.1 查看当时模块
1.2 在已有的nginx上面增加该模块–with-stream
2、nginx四层署理装备
2.1 修正装备文件进行四层署理装备
2.2 重启服务
3 浏览器拜访测验
根据端口拜访,但是会有60s左右的缓存时刻才会完成跳转到其他tomcat服务器
输入网址:http://192.168.2.66
输入网址:http://192.168.2.66:8080