目录
之前讲过Nginx 的简介和正则表达式,那些都是Nginx较为基础的操作,Nginx 最重要的最核心的功能,当属反向代理和负载均衡了。
负载均衡
负载均衡可能好理解一点,从字面上来看,就是某个服务器不堪重负的时候,将它的请求均衡一下,前提是有多个后端服务器,如果只有一个那自然均衡不了,一般情况下都不会单挂的。
Nginx 提供多种负载均衡模式进行分流,常见的有
1.轮询
轮询就是假设现在有A、B、C 三台服务器,然后客户端发来了12345678910条请求,这些请求会被均匀地分布给三台服务器,1->A,2->B,3->C......以此类推,无论服务器是否负载,响应是快还是慢。
配置:
upstream backend #这是负载均衡的名字可以自定 {
server A.example.com; #这里也可以用服务器的ip地址
server B.example.com;
server C.example.com;
}
2.最少连接数
字面意思,还是那三台服务器,然后A 有5个请求,B有3个请求,C有一个请求,那么接下来的两个请求都会被分配到C服务器,简而言之就是现在谁最不忙谁来接待一下。
配置:
upstream backend {
least_conn;
server A.example.com;
server B.example.com;
server C.example.com;
}
3.IP哈希
ip哈希就是通过计算,将客户端的ip地址换算成哈希值,然后将固定的哈希值对应分配给某一台服务器,该客户端的请求只会分配给这台服务器,有助于会话保持
配置:
upstream backend {
ip_hash;
server A.example.com;
server B.example.com;
server C.example.com;
}
4.加权轮询
加权轮询就是为每台服务器设置一个权重,权重大的服务器会被分配更多的请求
配置:
upstream backend {
server A.example.com weight=3;
server B.example.com weight=5;
server C.example.com weight=4;
}
5.最少时间
最少时间也是顾名思义,将请求分配给响应时间最短的服务器,(注意:只有Nginx1.15.3及及以后的版本才可使用)
配置:
upstream backend {
least_time header;
server A.example.com;
server B.example.com;
server C.example.com;
}
6.一致性哈希
一致性哈希可以保证当集群中某台服务器故障时,只有部分请求会重新分配到其他服务器,而不是全部重新分配,在缓存等场景中非常有用。
配置:
upstream backend {
hash $request_uri consistent;
server A.example.com;
server B.example.com;
server C.example.com;
}
上面这些都是常用的负载均衡模式,都是在Nginx 主配置文件下,http{}模块内进行配置
反向代理
要想了解何为反向代理,首先先知道什么是正向代理。上过网的同学肯定知道,我们平时访问一些网站,由于一些原因是无法访问的,此时如果我们非要访问这个网站,那么可以通过向可以访问这个网站的代理服务器发送请求,然后代理服务器去访问这个网站,将网站返回的数据发送给你(客户端),这个过程就是正向代理,代理服务器是帮助客户端的
那么反向代理就是与正向代理相反,代理服务器是帮助服务端的,也就是你要访问的网站,这里的帮助并不是助纣为虐那种帮助,就是帮助处理需求那种帮助。我们访问的大型网站,比如淘宝京东,一般都不可能只有一个服务器,会有多个服务器,此时代理服务器会统一接收服务器返回的请求,返还给客户端,一方面隐藏了服务器信息,而客户端方面只知道自己访问的是淘宝京东,并不会知道是哪一个服务器。
测试
真实环境不方便演示,这里我们用几台虚拟机来模拟真实环境,对负载均衡进行测试
我的四台机器
172.16.233.101~172.16.233.104
101作为nginx 服务器,另外两台作为tomcat服务器
nginx 应该是安装好了的,此处不再教如何安装nginx,我的博客有nginx安装过程
nginx 服务器直接启动nginx 就行了
下面部署2台Tomcat 应用服务器
tomcat 部署需要jdk
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:{JAVA_HOME}/lib:{JRE_HOME}/lib
export PATH={JAVA_HOME}/bin:PATH
source /etc/profile
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
接下来是动静分离配置
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> #指定为 test1 页面
</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" 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
另两台tomcat 服务器也事完全一样的配置
/usr/local/tomcat/webapps/test/index.jsp 的内容 稍稍修改,分别改为2和3
<% out.println("动态页面 2,NameBright - Domain Expired");%>
<% out.println("动态页面 3,http://www.test3.com");%>
接下来再回到nginx服务器
echo '<html><body><h1>这是静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
vim /usr/local/nginx/conf/nginx.conf
在http模块下,大概就gzip 后面 配置负载均衡的服务器列表,这里权重我都填1,相当于轮询
upstream tomcat_server {
server 172.16.233.102:8080 weight=1;
server 172.16.233.103:8080 weight=1;
server 172.16.233.104:8080 weight=1;
}
server 模块下添加 #配置Nginx处理动态页面请求
charset utf-8;
location ~ .*\.jsp$ {
proxy_pass http://tomcat_server;
}
location / {
root html;
index index.html index.htm;
}
如果出现乱码得在server 模块下添加
配置完成后我们重新加载nginx服务
访问172.16.233.101/index.jsp(nginx 服务器ip)
多刷新几次,应该是在三个页面之间来回跳
这样的话我们负载均衡就算是做完了