使用 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服务器,再去测试!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值