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