Nginx+Tomcat的负载均衡与动静分离集群
一、Nginx 负载均衡实现原理
1、Nginx 实现负载均衡是通过反向代理实现
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。反向代理代理服务器。
2、Nginx 配置反向代理的主要参数
1.upstream 服务池名 {} 作用:配置后端服务器池,以提供响应数据
3.proxy_pass http:// 服务池名
作用:配置将访问请求转发给后端服务器池的服务器处理
二、Nginx 动静分离实现原理
1、动静分离原理
服务端接收来自客户端的请求中,既有静态资源也有动态资源,静态资源由 Nginx 提供服务,动态资源由 Nginx 转发至后端
2、Nginx 静态处理优势
Nginx 处理静态页面的效率远高于 Tomcat 的处理能力 若 Tomcat 的请求量为1000次,则 Nginx 的请求量为6000次 Tomcat 每秒的吞吐量为0.6M,Nginx 的每秒吞吐量为3.6M Nginx 处理静态资源的能力是 Tomcat 处理的6倍
三、配置Nginx + Tomcat 动静分离、负载均衡
准备三台服务器,1台Nginx作为负载均衡器,2台Tomcat作为后端应用服务器(1台部署多实例)
Nginx 服务器:192.168.132.51:80
Tomcat服务器1:192.168.132.53:8080
Tomcat服务器2:192.168.132.52:8080 192.168.132.52:8081
1、部署 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加密功能
--with-stream #启用 stream模块,提供4层调度
----------------------------------------------------------------------------------------------------------
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
2、部署两台 Tomcat 应用服务器
关闭防火墙 systemctl stop firewalld setenforce 0 解压 tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/ cd /usr/local/jdk1.8.0_91 设置JDK环境变量 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:${JRE_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 查看端口 netstat -ntap | grep 8080
3、动静分离配置
1.tomcat1 192.168.132.53
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: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" /> </Host>
/usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh
2.tomcat2 192.168.132.52(多实例)
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> #指定为 test2 页面 </head>
<body> <% out.println("动态页面 2,http://www.test2.com");%> </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>
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> #指定为 test3 页面 </head>
<body> <% out.println("动态页面 3,http://www.test3.com");%> </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 /usr/local/tomcat/tomcat1/bin/shutdown.sh /usr/local/tomcat/tomcat1/bin/startup.sh
3.Nginx server 配置
#准备静态页面和静态图片 echo '<html><body>this is static</body></html>' > /usr/local/nginx/html/index.html mkdir /usr/local/nginx/html/img cd /usr/local/nginx/html/img
vim /usr/local/nginx/conf/nginx.conf ...... http { ...... #gzip on; #配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大 upstream tomcat_server { server 192.168.132.53:8080 weight=1; server 192.168.132.52:8080 weight=1; server 192.168.132.52: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;
}
...... } ...... }
4、测试结果
使用浏览器访问
动态