环境准备:
一、11台测试机器
hostname :v1 ~ v10 (10台测试机)
ip :192.168.33.81(v1) ~ 192.168.33.90(v101)
由于在内网测试,需要搭建个内网yum源,方便安装软件。yum所在机器为192.168.33.101
二、待实现功能
下面分别使用haproxy/ nginx/lvs实现HA + 负载均衡,软件环境如下:
v1:33.81 nginx
v2:33.82 nginx
v3:33.83 tomcat
v4:33.84 tomcat
v5:33.85 tomcat
v6:33.86 tomcat
v7:33.87 haproxy
v8:33.88 haproxy
v9:33.89 lvs
v10:33.90 lvs
1. 安装依赖包
yum - y install pcre - devel yum - y install openssl - devel yum - y install gcc yum - y install lrzsz yum - y install openssh - clients
2. 安装nginx
2.1. 上传、解压、重命名nginx
su - root
1、 cd /usr/local
2、 rz -y
3、 tar -xzvf nginx-1.7.7.tar.gz
4、 mv nginx-1.7.
1 、 进入解压后的目录,指定安装路径, 注:不指定 prefix ,则可执行文件默认放在/ usr / local / bin ,库文件默认放在/ usr / local / lib ,配置文件默认放在/ usr / local / etc cd / usr / local / nginx ./ configure -- prefix =/ usr / local / nginx -- conf - path =/ usr / local / nginx / nginx . conf 2 、 编译: make 3 、 安装: make install 4 、 启动 / usr / local / nginx / sbin / nginx 5 、 查看 http :// 192.168 . xx . xxx 出现: welcome Nginx ,就安装 ok 了。 6 、 停止 / usr / local / nginx / sbin / nginx – s stop
2.2. 安装nginx
2.3. 安装jdk
1 、 su - root 用户 2 、进入 usr 目录 cd / usr 3 、在 usr 目录下建立 java 安装目录 mkdir – m 755 java 4 、将 jdk - 6u24 - linux - i586 . bin 拷贝到 java 目录下 rz - y 4 、安装 jdk cd / usr / java chmod 755 jdk - 6u24 - linux - i586 . bin ./ jdk - 6u24 - linux - i586 . bin ‘ 注意:如果出现/ lib / ld - linux . so . 2 : bad ELF interpreter : No such file or directory ,安装下 glic 即可: yum install glibc . i686 5 、安装完毕为他建立一个链接以节省目录长度 ln - s / usr / java / jdk1 . 6.0 _24 / / usr / jdk 6 、配置环境变量 vim / etc / profile 添加内容: vi / etc / profile export JAVA_HOME =/ usr / jdk export PATH = $PATH : $JAVA_HOME / bin export CLASSPATH =.: $JAVA_HOME / lib / dt . jar : $JAVA_HOME / lib / tools . jar export JAVA_HOME PATH CLASSPATH 7 、执行下命令( source 命令也称为“点命令”,也就是一个点符号(.)。 source 命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。) source / etc / profile
2.4. 安装tomcat
1 、 上传、解压: rz - y tar - zxvf apache - tomcat - 6.0 . 37.tar . gz 2 、重命名: mv apache - tomcat - 6.0 . 37 tomcat
2.5. 重新配置nginx
1 、 cd / usr / local / nginx 2 、 vi / usr / local / nginx / nginx . conf
添加:
user nobody nobody ; #定义Nginx运行的用户和用户组 worker_processes 4 ; #nginx进程数,建议设置为等于CPU总核心数。 error_log logs / error . loginfo ; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] worker_rlimit_nofile 1024 ; #一个nginx进程打开的最多文件描述符数目,所以建议与ulimit -n的值保持一致。 pidlogs / nginx . pid ; #进程文件 #工作模式及连接数上限 events { use epoll ;#参考事件模型, use [ kqueue | rtsig | epoll | / dev / poll | select | poll ]; epoll 模型是 Linux 2.6 以上版本内核中的高性能网络 I / O 模型 worker_connections 1024 ;#单个进程最大连接数(最大连接数=连接数*进程数) } #设定http服务器,利用它的反向代理功能提供负载均衡支持 http { include mime . types ;#文件扩展名与文件类型映射表 default_type application / octet - stream ;#默认文件类型 #设定负载均衡的服务器列表 upstream tomcatxxxcom { server 192.168 . 56.200 : 8080 ; server 192.168 . 56.201 : 8080 ; } #设定日志格式 log_format www_xy_com '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' ; sendfile on ;#开启高效文件传输模式, sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用设为 on ,如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off ,以平衡磁盘与网络 I / O 处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成 off 。 keepalive_timeout 65 ; #长连接超时时间,单位是秒 #gzip on; #设定虚拟主机,默认为监听80端口 server { listen 80 ; server_name tomcat . xxx . com ;#域名可以有多个,用空格隔开 #charset koi8-r; #设定本虚拟主机的访问日志 access_log / data / logs / access . log www_xy_com ; #对 "/" 启用反向代理 location / { proxy_pass http :// tomcatxxxcom ; 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 ; } } }
3、创建 logs 所需要的文件夹 /data /logs/
cd / mkdir – m 755 data cd data mkdir – m 755 logs
4、启动 tomcat 、 nginx 。
/ usr / local / tomcat / bin / startup . sh / usr / local / nginx / sbin / nginx
5、修改 hosts ,加入
192.168.56.99 tomcat.xxx.com
6、访问 http://redis.xxy.com
上面部分安装,我是用脚本装的。没按照上面来,使用上面配置时,启动nginx时,提示我"[emerg] 7458#0: unknown directive "<feff>user" in /usr/local/nginx/nginx.conf:1 ",
于是,我就直接拿着nginx.conf.default修改了,改改也能用。下面是我修改后的配置(v1下:/usr/local/nginx/nginx.conf ):
worker_processes 1 ; error_log logs / error . log info ; pid logs / nginx . pid ; events { use epoll ; worker_connections 1024 ; } http { include mime . types ; default_type application / octet - stream ; # 配置需要代理的服务器列表 upstream servers { server v3 : 8080 ; server v4 : 8080 ; } log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' ; access_log logs / access . log main ; sendfile on ; keepalive_timeout 65 ; server { listen 80 ; server_name localhost ; access_log logs / host . access . log main ; location / { #引用上面的配置 proxy_pass http :// servers ; proxy_set_header Host $host ; proxy_set_header X - Real_IP $remote_addr ; proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for ; root html ; index index . html index . htm ; } error_page 500 502 503 504 / 50x . html ; location = / 50x . html { root html ; } } }
访问v1:80,使用rr策略自动轮巡v3,v4效果图:
对了,上面那句v3,v4的提示语,是我echo一句话把tomcat默认的ROOT/index.jsp 给覆盖了,用作测试
1.首先使用keepalived + nginx + tomcat 实现
测试过程中发现,我收到将nginx kill之后keepalived居然ip不飘,检查了配置也没发现问题。唯一能让keepavlied执行notify.sh脚本时候就是在启动kp时,
会检查nginx是否存活,不存活则启动。 现在已经实现了
于是又加了个脚本单独去监控kp ,脚本名称为:monitor.sh,代码在下边
v1的keepalived脚本:
! Configuration File for keepalived global_defs { } vrrp_script chk_nginx { script "killall -0 nginx" interval 1 weight - 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 1 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168 . 33.181 / 24 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 2 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168 . 33.182 / 24 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
v2的keepalived脚本:
! Configuration File for keepalived global_defs { } vrrp_script chk_nginx { script "killall -0 nginx" interval 1 weight - 2 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 1 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168 . 33.181 / 24 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 2 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168 . 33.182 / 24 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
v1,v2共同脚本:
monitor.sh:
#!/bin/bash while true ; do A = `ps -ef|grep nginx |wc -l` B = `ps -ef|grep keepalived |wc -l` if [ $A - eq 1 ]; then echo 'restart nginx!!!!' / usr / local / nginx / sbin / nginx if [ $A - eq 1 ]; then if [ $B - gt 1 ]; then killall keepalived service keepalived start & fi fi fi if [ $B - eq 1 ]; then service keepalived start & fi sleep 5 done
notify.sh
#!/bin/bash # keepalived notify script contact = 'root@localhost' notify () { mailsubject = "`hostname` to be $1: vip floating" mailbody = "`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1" echo $mailbody | mail - s "$mailsubject" $contact } case "$1" in master ) notify master echo "变成主了,触发master!" >> / root / k_tips . log / usr / local / nginx / sbin / nginx exit 0 ;; backup ) notify backup echo "变成从了,触发backup事件!" >> / root / k_tips . log / usr / local / nginx / sbin / nginx exit 0 ;; fault ) notify fault echo "脑列了,触发fault事件!" >> / root / k_tips . log / usr / local / nginx / sbin / nginx - s stop exit 0 ;; *) echo 'Usage: notify.sh {master|backup|fault}' exit 1 ;; esac
2.使用keepalived + haproxy + tomcat 实现
2.1 安装haproxy
yum -y install haproxy
2.2 修改配置
# to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the '-r' option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log # # 上面说我们要把日志写到/var/log/haproxy.log需要修改以下两个地方: 1./etc/sysconfig/syslog , 这个我现在用的centos6.6已经没有了,取代它的是同目录下的rsyslog vi /etc/sysconfig/rsyslog 这里对它做了以下更改: 修改前:SYSLOGD_OPTIONS="-c 5" 修改后:SYSLOGD_OPTIONS="-c 2 -r "
2. /etc/rsyslog.conf 修改日志存放位置 vi /etc/rsyslog.conf
我在local7.*下面加了一行,修改后是这样的: # Save boot messages also to boot.loglocal7.* /var/log/boot.loglocal2.* /var/log/haproxy.log
好了,基本的配置可以了。
下面开始修改/etc/haproxy/haproxy.cfg
3.使用keepalived + lvs + tomcat 实现
未完待续。。。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com