(第十九周作业)
1、运用haproxy实现nginx服务负载均衡
需要三台虚拟机做实验:
A机:安装haproxy,实现后端BC机上的nginx负载,IP地址为:192.168.184.100
B机、C机:安装Nginx服务器,监听80端口。(Nginx简单安装即可,这里不再描述) IP地址为192.168.184.101 、192.168.184.102
1)A机安装haproxy
先安装依赖软件包
# yum -y install make gcc gcc-c++ openssl-devel
下载haproxy,假如软件包为haproxy-1.7.9.tar.gz,并上传到A机
# tar -zxf haproxy-1.7.9.tar.gz
# cd /root/haproxy-1.7.9
查看安装帮助文件,得知要先查看一下系统的内核版本
# uname -r
根据上面的查看结果,到帮助文件中找到以下安装命令中TARGET参数合适的值,PREFIX是安装目录
# make TARGET=linux2628 PREFIX=/usr/local/haproxy
# make install
2)A机编写配置文件
# mkdir /usr/local/haproxy/etc
# vim /usr/local/haproxy/etc/haproxy.cfg
global
log 127.0.0.1 local0
maxconn 4096
chroot /usr/local/haproxy
uid 99#使用nobody用户的uid
gid 99 #使用nobody用户的 用户组
daemon #以守护进程形式运行haproxy
nbproc 1 #启动1个haproxy实例。设置成和CPU核心数一样
pidfile /usr/local/haproxy/run/haproxy.pid #进程ID
defaults
log global
log 127.0.0.1 local3 #日志文件的输出定向。产生的日志级别为local3. 系统中local1-7
mode http #工作模式默认采用http模式,Nginx服务要采用这种方式
option httplog #日志类别,记载http日志
option httpclose #每次请求完毕后主动关闭http通道,
option dontlognull #不记录空连接的日志
option forwardfor #使后端服务器可获得客户端真实ip
option redispatch #当serverid对应的服务器挂掉后,强制定向到其他健康服务器
retries 2 #2次连接失败就认为服务器不可用
maxconn 2000 #最大连接数
balance roundrobin #负载均衡算法轮询方式
stats uri /haproxy-stats #haproxy 监控页面的访问地址
timeout connect 5000 #连接超时时间。 单位毫秒
timeout client 50000 #客户端连接超时时间
timeout server 50000 #服务器端连接超时时间
option httpchk GET /hb.html #健康检查页面
frontend nginx #前端名称
bind 0.0.0.0:80 #监听80端口,请求会被转发到后端
default_backend nginx_back #后端名称
backend nginx_back #后端名称,给上文引用
server s1 192.168.184.101:80 weight 3 check #后端的主机 IP 通过weight设置权重
server s2 192.168.184.102:80 weight 3 check
3)启动haproxy
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
给B机和C机的Nginx添加一个hb.hmtl页面,内容为文本行“OK!"
给B机和C机添加一个index.html页面,内容不相同,以示区别
然后启动B机和C机的nginx服务
访问:http://192.168.184.100查看对应的index.html页面,多次刷新可以查看页面显示内容如何变化。
2、搭建haproxy实现mysql负载均衡
这里的haproxy安装过程与前一题差不多,这里只是说明一个配置文件的内容
# vim /usr/local/haproxy/etc/haproxy.cfg
global
daemon
nbproc 1
pidfile /usr/local/haproxy/run/haproxy.pid
defaults
mode tcp #对于mysql的负载均衡,这里要采用tcp(4层)。
retries 3 #3次连接失败就认为是服务器不可用
option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
maxconn 4096 #默认的最大连接数
timeout connect 5000 #连接超时 ms
timeout client 30000 #客户端超时
timeout server 30000 #服务器超时
timeout check 2000 #=心跳检测超时
log 127.0.0.1 local0 err #日志输出级别
listen configMysql
bind 127.0.0.1:3306 #监听3306端口
mode tcp
maxconn 4096
server s1 192.168.184.110:3306 #后端的两台数据库服务器
server s2 192.168.184.111:3306
3、搭建tomcat服务器,并通过nginx反向代理访问
需两台虚拟机进行实验:
A机:安装tomcat+java ,IP地址:192.168.184.137
B机:安装nginx设置反向代理 IP地址:192.168.184.138
1)A机安装java
上传jdk-8u151-linux-x64.rpm到A机的/root目录下,安装包是多官网下载的。
# rpm -ivh jdk-8u151-linux-x64.rpm
设置PATH环境变量
# vi ~/.bash_profile
最后增加两行:
export JAVA_HOME=/usr/java/jdk1.8.0_151
export PATH=$JAVA_HOME/bin:$PATH
保存后再执行一下
# source ~/.bash_profile
验证java 版本
#java -version
2)A机安装tomcat
上传apache-tomcat-8.0.47.0.tar到/root
# cd /root
# tar -xf apache-tomcat-8.0.47.0.tar
# mv apache-tomcat-8.0.47.0 tomcat
3)启动tomcat并验证
启动tomcat服务
# /root/tomcat/bin/startup.sh
查看日志
# tail -f /root/tomcat/logs/catlina.out
等出现Started UP表示启动完成
关闭防火墙
# service firewalld stop
从宿主机打开浏览器来访问http://192.168.184.137:8080,可以看到tomcat的首页
4)B机安装nginx
# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# yum install -y nginx
5)配置nginx
vi /etc/nginx/nginx.conf
#后端tomcat服务器
upstream apachetomcat {
#这里可以配置多台服务器和端口号
server 192.168.184.137:8080;
}server {
listen 80;
server_name 192.168.184.138;
#定义日志位置
access_log logs/tomcat.access.log main;
error_log logs/tomcat.error.log;
#配置站点根目录会根据完整的URI请求来映射
root html;
#默认页面
index index.html index.htm index.jsp;
#url映射
location / {
proxy_pass http://apachetomcat; #proxy_pass配置为:http:// + upstream名称
proxy_redirect off; #禁止所有的proxy_redirect指令
proxy_set_header Host $host; #允许重新定义或添加字段传递给代理服务器的请求头。
#将$remote_addr(客户端IP)的值放进变量请求头 X-Real-IP中
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 显示出客户端原始ip
#当其中一台返回错误码404,500...等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率,多可运用于前台程序负载,
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0; #一次访问能写入的临时文件的大小
proxy_connect_timeout 90; #后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_send_timeout 90; #后端服务器数据回传时间
proxy_read_timeout 90; #连接成功后_等候后端服务器响应时间
proxy_buffer_size 4k; #当中的设置单个缓冲区的大小。
proxy_buffers 4 32k; #由缓冲区数量和缓冲区大小组成的
#nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k; #一次访问能写入的临时文件的大小
}
}
6)重启nginx服务
#systemctl start nginx.service
7)访问测试:http://192.168.184.138
4、搭建Tomcat,并基于memcached实现会话共享
需要两台虚拟机:
A机:192.168.184.70 ,安装Nginx(80端口做反向代理),tomcat(8080端口) 主机名:nodeA
B机:192.168.184.71 安装tomcat(8080端口),memcache(11211端口) 主机名: nodeB
1)A机安装Nginx
安装依赖包:yum -y install gcc gcc-c++ libgcc
下载Nginx和pcre安装包 nginx-1.14.2.tar.gz 和 pcre-8.37.tar.gz
创建用户和用户组
groupadd web
useradd -s /sbin/nologin web
安装pcre
tar -zxvf pcre-8.37.tar.gz
cd pcre-8.37
./configure
make && make install
安装nginx
tar -zxvf nginx-1.14.2.tar.gz
cd nginx-1.14.2
./configure --prefix=/usr/local/nginx --user=web --group=web --conf-path=/etc/nginx/nginx.conf --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_flv_module --with-pcre=/usr/local/src/pcre-8.37
make && make install
启动nginx
/usr/local/nginx/sbin/nginx
2)A机Nginx配置反向代理
vi /etc/nginx/nginx.conf
user web web #运行用户
worker_processes 1; #启动进程,通常设置成和cpu的数量相等
#全局错误日志及PID文件
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
}
http {
include mime.types; #设定mime类型,类型由mime.type文件定义
default_type application/octet-stream;
sendfile on; #普通应用设置为on
keepalive_timeout 65; #连接超时时间
upstream webtomcat{ #设定负载均衡的服务器列表
server 192.168.184.70:8080;
server 192.168.184.71:8080;
}
server {
listen 80; #侦听80端口
server_name 192.168.184.70;
location / { #代理配置
proxy_pass http://webtomcat; #反向代理到webtomcat定义的服务器列表
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
重新加载nginx配置文件
/usr/local/nginx/sbin/nginx -s reload
3)A机和B机都安装jdk和tomcat
(安装步骤参考第3题的第(1)(2)(3)步操作)
4)B机安装memcache
下载相关的软件包: libevent-1.4.13-stable.tar.gz memcached-1.4.4.tar.gz
安装libevent
tar zxf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
./configure --prefix=/usr
make && make install
安装Memcached
tar zxf memcached-1.4.4.tar.gz
cd memcached-1.4.4
./configure --prefix=/usr/local/memcached --with-libevent=/usr
make && make install
启动Memcached
/usr/local/memcached/bin/memcached -d -m 64 -u root -l 192.168.184.71 -p 11211 -c 256 -P /tmp/memcached.pid
-d daemon后台进程
-m 指定最大使用内存大小
-u 绑定指定用户用于运行进程
-c 最大同时连接数
5)A机和B机在tomcat上进行连接 memcache session 会话共享
vi /root/tomcat/conf/context.xml
……
memcachedNodes="nodeB:192.168.184.71:11211"
requestUriIgnorePattern=".*/.(png|gif|jpg|css|js)$"
sticky="false"
storageKeyPrefix="context"
lockingMode="uriPattern:/path1|/path2"
sessionBackupAsync="false"
sessionBackupTimeout="100"
ranscoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
……
requestUriIgnorePattern 设置忽略会话同步的请求的 URI 地址的正则表达式
sticky 粘性会话需要保证每个用户的请求都路由到同一台 Tomcat 服务器中
lockingMode 用于非粘性会话
sessionBackupAsync 设置 session 会话中的数据是否异步同步到 memcached 中,默认为 true。
sessionBackupTimeout 备份 session 会话数据所需时间如果大于该值,将导致 session 会话数据同步失败
transcoderFactoryClass 配置序列化和反序列化 session 会话中的数据到 memcached 中的编码转换器的工厂类名
6)验证:
编写测试页面(A机和B机都要写,B机要把下文中的NodeA改为NodeB):
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%>
SessionIP:<%=request.getServerName()%>
SessionPort:<%=request.getServerPort()%>
<%
out.println("This is Tomcat Server NodeA");
%>