使用 Nginx + Tomcat 搭建负载均衡

使用 Nginx + Tomcat 搭建负载均衡

nginx 一般用来做反向代理和负载均衡,将客户端请求发送到后端的tomcat,并将tomcat的响应发送给客户端。后端的tomcat通常不止一个,nginx 根据配置来选择其中一个tomcat,比较常见的选择策略是轮询。
1.nginx调度部署 2.nginx部署 3.tomcat1和2部署 4.配置nginx负载均衡
5.使用nginx实现动静分离 6.nginx反向代理缓存 7.压力测试JMeter

1.nginx调度部署

目前最常用的负载的3 种方式

1.轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2.Weight(权重)
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
3.ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
4.fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5.url_hash(第三方) url哈西
按访问url的hash结果来分配请求,使同样的url定向到同一个后端服务器,后端服务器为缓存时比较有效
环境拓扑
在这里插入图片描述

2.nginx部署(nginx)

上传软件包并解压,安装

[root@nginx ~]# ls
anaconda-ks.cfg nginx-1.10.3.tar.gz
[root@nginx ~]# tar -zxvf nginx-1.10.3.tar.gz -C /usr/local/src/
安装nginx依赖包
[root@nginx nginx-1.10.3]# yum install -y gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel
预编译
[root@nginx ~]# cd /usr/local/src/nginx-1.10.3/
[root@nginx nginx-1.10.3]# ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre
在这里插入图片描述
编译安装
[root@nginx nginx-1.10.3]# make -j 4 && make install
启动nginx
[root@nginx ~]# /usr/local/nginx/sbin/nginx
查看端口号
[root@nginx ~]# netstat -antup | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7423/nginx: master
网站测试
http://192.168.100.101/
在这里插入图片描述

添加path变量

[root@nginx ~]# ln -s /usr/local/nginx/sbin/* /usr/local/bin/

生成服务启动脚本
[root@nginx ~]# vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: - 99 2
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
        start)
        $PROG
        ;;
        stop)
        kill -3 $(cat $PIDF)
        ;;
        restart)
        $0 stop &> /dev/null
        if [ $? -ne 0 ] ; then continue ; fi
        $0 start
        ;;
        reload)
        kill -1 $(cat $PIDF)
        ;;
        *)
        echo "Userage: $0 { start | stop | restart | reload }"
        exit 1
esac
exit 0
配置服务开机自动启动

[root@nginx ~]# chmod +x /etc/init.d/nginx #给脚本添加可执行权限
[root@nginx ~]# chkconfig --add nginx #把nginx添加为系统服务
[root@nginx ~]# chkconfig nginx on #把nginx添加开机自启动
[root@nginx ~]# chkconfig --list nginx #查看nginx开机启动项
或者[root@nginx ~]# nginx -s reload #重载nginx

3.tomcat server1部署(tomcat1)

安装JDK,卸载openjdk
安装之前需要查看下系统是否安装了openjdk,如果安装了openjdk,请先卸载,否则安装不了oracle官方的jdk
[root@nginx ~]# yum remove java-* -y

上传所有所需的软件包

[root@nginx ~]# ls
anaconda-ks.cfg apache-tomcat-8.5.42.tar.gz jdk-8u171-linux-x64.tar.gz mysql-connector-java-5.1.47.tar.gz

解压jdk

[root@tomcat1~]# tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/
配置JDK环境变量
[root@tomcat1~]# vim /etc/profile #在文件最后加入一下行
JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
[root@tomcat1~]# source /etc/profile #使环境变量生效
查看java环境
[root@tomcat1~]# java -version
在这里插入图片描述

安装tomcat

解压软件包
[root@tomcat1~]# tar -zxvf apache-tomcat-8.5.42.tar.gz -C /usr/local/
重命名目录
[root@tomcat1 ~]# cd /usr/local/
[root@tomcat1 local]# mv apache-tomcat-8.5.42/ tomcat
注意:Tomcat有两种安装方式,一种是直接解压就可以使用的二进制文件,第二种是编译安装,我们这里采用了第一种方法,下载的tomcat软件直接解压就可以执行的二进制文件,因为在官方默认下载的便是使用第一种方法安装。

Tomcat启动脚本
[root@tomcat1 ~]# vim /etc/init.d/tomcat
#!/bin/bash
# Tomcat init script for Linux
# chkconfig: 2345 96 14
# discription: The Apache Tomcat Server/JSP container
JAVA_OPTS='-server -Xms64m -Xmx128m'
JAVA_HOME=/usr/local/jdk1.8.0_171/
CATALINA_HOME=/usr/local/tomcat
start_tomcat=$CATALINA_HOME/bin/startup.sh       #tomcat启动文件
stop_tomcat=$CATALINA_HOME/bin/shutdown.sh     #tomcat关闭文件

start() {
        echo -n "Starting tomcat: "
        ${start_tomcat}
        echo "tomcat start ok."
}
stop() {
        echo -n "Shutting down tomcat: "
        ${stop_tomcat}
        echo "tomcat stop ok."
}       

# See how we were called

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        sleep 10
        start
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
esac

exit 0
启动脚本添加执行权限

[root@tomcat1 ~]# chmod +x /etc/init.d/tomcat

建立系统服务文件
[root@tomcat1 ~]# vim /lib/systemd/system/tomcat.service
 [Unit]
Description=tomcat
After=network.target

[Service]
Type=forking
Environment=JAVA_HOME=/usr/local/jdk
Environment=CATALINA_HOME=/usr/local/tomcat
ExecStart=/etc/init.d/tomcat start
ExecStop=/etc/init.d/tomcat stop
ExecRestart=/etc/inie.d/tomcat restart
PrivateTmp=true

[Install]
WantedBy=multi-user.target

[root@tomcat1 ~]# systemctl daemon-reload #重载service文件

启动tomcat

[root@tomcat1 ~]# systemctl start tomcat #或者以绝对路径启动
添加开机自启动
[root@tomcat1 ~]# systemctl enable tomcat
查看是否启动
[root@tomcat1 ~]# ps -ef | grep tomcat
在这里插入图片描述
查看端口
[root@tomcat1 ~]# netstat -antup | grep 8080
在这里插入图片描述

安装mysql-connector

[root@tomcat1 ~]# tar -zxvf mysql-connector-java-5.1.47.tar.gz -C /usr/local/src/
[root@tomcat1 ~]# cd /usr/local/src/mysql-connector-java-5.1.47/
[root@tomcat1 mysql-connector-java-5.1.47]# cp mysql-connector-java-5.1.47-bin.jar /usr/local/tomcat/lib/ #tomcat可以连接到mysql
[root@tomcat1 ~]# systemctl restart tomcat

创建测试页面

[root@tomcat1 ~]# echo “tomcat server1” > /usr/local/tomcat/webapps/ROOT/index.jsp
测试
http://192.168.100.102:8080/
在这里插入图片描述
直接将tomcat传给tomcat server2
在这里插入图片描述

tomcat server2部署(tomcat2)

部署tomcat参照tomcat1 #查看tomcat主目录的作用
在这里插入图片描述

创建测试页面

[root@tomcat2 ~]# echo “tomcat server2” > /usr/local/tomcat/webapps/ROOT/index.jsp
使环境变量生效
[root@tomcat1~]# source /etc/profile
重启tomcat
[root@tomcat1 ~]# systemctl start tomcat #或者以绝对路径启动
添加开机自启动
[root@tomcat1 ~]# systemctl enable tomcat
测试
http://192.168.100.103:8080/
在这里插入图片描述

4.配置nginx负载均衡

(相当于NAT模式)从调度器进来从调度器出去

修改nginx配置文件
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
#修改添加标红部分
32     upstream tomcat {  # 服务器集群名字    
33          server    192.168.100.102:8080  weight=1;   #服务器配置,weight是权重的意思,权重越大,分配的概率越大。  
 34          server    192.168.100.103:8080  weight=2;   
 35      }   
 36     #gzip  on;
 37     
 38     server {
 39         listen       80;
 40         server_name  localhost;
 41         
 42         #charset koi8-r;
 43         
 44         #access_log  logs/host.access.log  main;
 45 
 46         location / {
 47           #  root   html;
 48           #  index  index.html index.htm;
 49           proxy_pass http://tomcat;        #集群名字
 50           proxy_redirect default;		
              #tomcat源ip,http头部还是保持客户端,不会变成nginx
 51         }
重启nginx服务器

[root@nginx ~]# nginx -s reload
测试
http://192.168.100.101/
在这里插入图片描述
刷新http://192.168.100.101/
在这里插入图片描述
再刷新http://192.168.100.101/
在这里插入图片描述
发现负载是1:2,跟我们的权重设置一样。

补充,负载配置说明

在http节点里添加:
# 定义负载均衡设备的 Ip及设备状态
upstream tomcat {
  ip_hash; #添加这一行
  server 192.168.100.101:9090 down;
  server 192.168.100.102:8080 weight=2;
  server 192.168.100.103:6060;
  server 192.168.1.14:7070 backup;
 }
在需要使用负载的Server节点下添加
proxy_pass http://tomcat; #集群名称
upstream 每个设备的状态;
ip_hash:服务器配置,weight是权重的意思,权重越大,分配的概率越大。
利用ip哈希 绑定一个, 然后直到 连接超时,或是 连接的tomcat死机 才会失效。这个是你可以理解成 绑定某个ip的意思。
down:表示当前的 server 暂时不参与负载 ;
weight:默认为 1,weight 越大,负载的权重就越大;
max_fails:允许请求失败的次数默认为 1,当超过最大次数proxy_next_upstream 模块定义的错误 ;
fail_timeout:max_fails:请求失败后,暂停的时间;
backup:其它所有的非 backup 机器 down 或者忙的时候,请求 backup 机器,所以这台机器压力会最轻;

5.使用nginx实现动静分离

添加nginx配置文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

	 	  upstream tomcat {  	#动态服务器集群名字    
  	          server    192.168.100.102:8080  weight=1;   #服务器配置,weight是权重的意思,权重越大,分配的概率越大。  
	          server    192.168.100.103:8080  weight=2;   
	      }        
	      upstream nginx {                    #静态服务器集群
	          server localhost:808 weight=1;
	      }
#配置nginx静态服务器					 (在80端口下添加以下内容)
	    server{
	         listen 808;
	         server_name nginx;
	         location / {
	            root   html;
	            index  index.html index.htm;
	         }
	         location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff|htm|html|gif|jpeg|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
	             root html ;
	             expires 30d; #缓存30天
	          }
	
#配置tomcat动态服务器
	     server {
	        listen       80;
	        server_name  localhost;
	        root   html;
	        location /  {
	              proxy_next_upstream http_502 http_504 error timeout invalid_header;
	              proxy_pass http://tomcat;
	              proxy_set_header   X-Real-IP        $remote_addr;
	              proxy_set_header   Host             $host;
	              proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
	              proxy_set_header   X-Forwarded-Proto $scheme;
	              }
	        location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff|htm|html|gif|jpeg|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
	              proxy_pass http://nginx;
	              root html;
	              expires 30d; 
	          }
	}
在nginx服务器上传图片

[root@nginx html]# cd /usr/local/nginx/html
[root@nginx html]# ls
50x.html index.html qingniao.jpg
重启nginx

测试

http://192.168.100.101/
在这里插入图片描述
http://192.168.100.101
在这里插入图片描述
http://192.168.100.101/index.html
在这里插入图片描述
http://192.168.100.101/qingniao.jpg

在这里插入图片描述

6.nginx反向代理缓存

启动缓存支持以后,nginx 在将请求转发到tomcat之前会在缓存里查找结果,如果缓存里存在匹配客户端请求的结果,则直接返回给客户端,不会将请求发送给tomcat;如果缓存没有命中,才会将请求发送给tomcat,接收到tomcat返回的结果后,会将结果进行缓存以备客户端下次的请求.

配置缓存目录

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
#直接在http再添加一行
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=web_cache:50m inactive=10m max_size=1g;
在这里插入图片描述

在location中配置缓存

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
在location中添加如下内容:(在所有server当中添加)
在这里插入图片描述
location ~ .*.(js|css|ico|png|jpg|eot|svg|ttf|woff|htm|html|gif|jpeg|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma) {
proxy_cache web_cache;
proxy_cache_valid 200 304 302 5d;
proxy_cache_valid any 5d;
proxy_cache_key ‘$host:$server_port$request_uri’;
add_header X-Cache '$upstream_cache_status ';
proxy_pass http://nginx;
root html;
expires 30d; #缓存30天
}
在这里插入图片描述
注释:

proxy_cache cache; # 缓存使用前面定义的内存区域
proxy_cache_valid 200 304 302 5d; 
proxy_cache_valid any 5d;   #设置缓存时间为5天
proxy_cache_key '\$host:\$server_port\$request_uri';
# 设置缓存的 key,这里用到了 nginx 的内嵌变量,表示用整个 url 作 key
add_header X-Cache '$upstream_cache_status from $host';
# 在返回的响应里添加响应头 X-Proxy-Cache,其值表示是否命中了缓存	#HIT表示缓存成功,MISS未缓存
创建缓存目录

[root@nginx ~]# mkdir -p /data/nginx/cache
[root@nginx ~]# nginx -t
重载nginx
[root@nginx ~]# nginx -s reload

测试

网页查看
http://192.168.100.101
在这里插入图片描述
在这里插入图片描述

日志查看,以日志格式,查看你是否缓存成功

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
log_format main '$remote_addr - $remote_user [$time_local] “$request” ’
'$status $body_bytes_sent “$http_referer” ’
‘"$http_user_agent" “$http_x_forwarded_for”"$upstream_cache_status"’;
access_log logs/access.log main; #直接把这些粘进来,把原先的删掉
在这里插入图片描述
重置nginx
[root@nginx ~]# systemctl restart nginx
动态查看日志
[root@nginx ~]# tail -f /usr/local/nginx/logs/access.log
刷新网页
http://192.168.100.101/qingniao.jpg
查看日志
在这里插入图片描述

7.压力测试JMeter(测试,可以先看一下一点优化都没有做的。再优化,测试看效果)

JMeter简介:JMeter作为一款广为流传的开源分布式压测产品,能自动生成图形报告。最初被设计用于Web应用测试,如今JMeter可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP服务器等等,还能对服务器、网络或对象模拟巨大的负载,通过不同压力类别测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能测试和回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言(规则)。
JMeter的特点包括对HTTP、FTP服务器、数据库进行压力测试和性能测试;完全的可移植性;完全 Swing和轻量组件支持包;完全多线程;缓存和离线分析/回放测试结果;可链接的取样器;具有提供动态输入到测试的功能;支持脚本编程的取样器等。在设计阶段,JMeter能够充当HTTP PROXY(代理)来记录浏览器的HTTP请求,也可以记录Apache等WebServer的log文件来重现HTTP流量,并在测试运行时以此为依据设置重复次数和并发度(线程数)来进行压测

下载地址
http://jmeter.apache.org/download_jmeter.cgi

在这里插入图片描述

Windows JDK下载

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
在这里插入图片描述

Windows安装JDK
打开windwos 版本jdk安装包进行安装(一直下一步)

在这里插入图片描述
在这里插入图片描述

测试

新版本的JDK不需要再手动添加环境变量
cmd打开命令窗口
C:\Users\Administrator>java –version
在这里插入图片描述

安装JMeter,解压缩软件

在这里插入图片描述
在windows上解压缩软件,进入bin目录,找到jmeter.bat文件,双机打开即可启动
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改主题和语言

在这里插入图片描述
在这里插入图片描述

创建tomcat测试

在这里插入图片描述
添加线程组,使用线程模拟用户的并发
在这里插入图片描述
1000个线程,每个线程循环10次,也就是tomcat会接收到10000个请求
在这里插入图片描述
添加http请求
在这里插入图片描述
在这里插入图片描述
添加请求监控(在HTTP请求当中添加!)
在这里插入图片描述
在这里插入图片描述
启动、进行测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关掉一台8080tomcat服务器,再去测试!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值