经过以前做完的产品,受前公司几位前辈技术大拿指点,来自己动手实现并总结一下web端的负载解决方法,高手请略过,个人认知有限,请各位指正错误。

下面是结构图:

我的系统环境是Fedora22(适用readhat,centos)

2台物理机分别用于nginx的master和slaver

192.168.10.244

192.168.10.245

0.准备keepalived,nginx,

可以使用wget下载,也可直接去官网下载,这里我下载的版本是:

keepalived-1.2.19.tar.gz (官方下载地址:http://www.keepalived.org/download.html)

nginx-1.9.3.tar.gz (官方下载地址:http://nginx.org/en/download.html)

压缩包授权

 chmod  keepalived-1.2..tar.gz
chmod nginx-1.9..tar.gz

解压到相应的目录(随便哪个目录,注意这里不是安装目录,我的是/home/ops/tools/)

 tar -zxvf keepalived-1.2..tar.gz
tar -zxvf nginx-1.9..tar.gz

1.安装nginx(nginx依赖其它组件,因此需要先安装依赖,官网文档有详细说明)

进入解压后的nginx所在目录:

cd /usr/local/nginx/nginx-1.9.

检查nginx依赖是否安装:

./configure

出现:

checking for C compiler ... not found

./configure : error: C compiler cc is not found

缺少gcc依赖,安装gcc,执行:

dnf -y install gcc

安装完之后再次检查依赖是否齐全:

./configure

出现:

./configure: error :the HTTP rewrite module requires the PCRE library . 后面巴拉巴拉一片

缺少pcre库依赖,安装pcre-devel

dnf -y install pcre-devel

安装完之后再次检查依赖是否齐全命令同上,出现:

 ./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.

依次同上,再次安装zlib

dnf -y install zlib-devel

安装完,出现如下类似日志,说明nginx依赖安装成功(http://nginx.org/en/docs/configure.html,最新版本的doc文档上没有提到openssl可以不安装,原因不明,烦请知道的大哥告知一声)。


Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ using builtin md5 code
+ sha1 library is not found
+ using system zlib library


nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"

 

OK,此时开始编译安装nginx,配置nginx的安装目录,个人习惯将其所有配置都安装在固定的目录下/usr/local/nginx,目录不存在时,安装中自动创建(官网上根据职责安装到不同的目录),分别执行:

./configure --prefix=/usr/local/nginx/
make && make install

configure的作用不知道的烦请自行查阅,安装完成后出现如下类似界面,说明安装成功,此时可以删除下载和解压的nginx源码包了.

我习惯用源码安装

官网推荐源码安装的例子有这么一段:

 ./configure
--sbin-path=/usr/local/nginx/nginx
--conf-path=/usr/local/nginx/nginx.conf
--pid-path=/usr/local/nginx/nginx.pid
--with-http_ssl_module
--with-pcre=../pcre-8.40
--with-zlib=../zlib-1.2.

所以我就直接拷贝下来,进入源码解压目录执行:

 ./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx-1.13./nginx.conf --pid-path=/usr/local/nginx/nginx-1.13./nginx.pid --with-http_ssl_module --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2. --with-openssl=../openssl

进入nginx安装目录,启动nginx测试一下

cd /usr/local/nginx/sbin
./nginx

查看一下进程:

ps -aux | grep nginx

外部浏览器访问出现如下图,表示nginx启动成功

2.安装keepalived

进入解压后的keepalived的目录,同上先检查依赖是否安装

./configure

若出现:

configure: error:
!!! OpenSSL is not properly installed on your system. !!!!!! Can not include OpenSSL headers files. !!!

安装openssl依赖

dnf -y install openssl-devel

再次检查依赖,若出现如下类似说明依赖安装成功

 Keepalived configuration
------------------------
Keepalived version : 1.2.
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lssl -lcrypto -lcrypt
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : No
fwmark socket support : Yes
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
SNMP support : No
SHA1 support : No
Use Debug flags : No

OK,此时可以正式安装keepalived了,个人安装在/usr/local/keepalived目录

./configure --prefix=/usr/local/keepalived
make && make install

安装成功后进入安装后的目录,检测

cd /usr/local/keepalived/sbin
./keepalived

查看是否启动成功

ps -aux | grep keepalived

另一台机器以同样的方式安装nginx和keepalived

3.配置keepalived和nginx(测试时可以先略过这一步)

进入目录/usr/local/keepalived/sbin/,查看keepalived的启动配置参数

cd /usr/local/keepalived/sbin
./keepalived --help

注:该help参数可以在/usr/local/keepalived/etc/sysconfig/keepalived这个文件中查看)

keepalived启动时默认加载/etc/keepalived/keepalived.conf。此处个人遇到很大的坑,以为keepalived跟nginx一样安装到指定目录后会从这个安装后的目录去加载配置文件,没想到启动后日志一直停留在start...使用 ip a 查看虚拟IP也绑定不了。最后没办法只好在etc下新建keepalived目录,把keepalived.conf拷过去才解决。

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived

我的2台nginx配置文件nginx.conf部分配置片段如下:(这里我在118的机器上起了4个tomcat实例,nginx不配负载方式默认是轮询),用作测试

 # blentle add
upstream www.test.dev {
server 192.168.10.118:;
server 192.168.10.118:;
server 192.168.10.118:;
server 192.168.10.118:;
} server {
listen ;
server_name 127.0.0.1;
location / {
index index.php index.html index.jsp;
proxy_pass http://www.test.dev;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
} }

4.配置keepalived,实现nginx负载

(1)主从(master-slaver)

所谓主从即master的nginx正常提供服务时,永远轮不到slaver的nginx来提供服务。只有当master挂掉时,slaver的nginx才接管虚拟IP,提供正常服务。貌似有点浪费服务器。

(a)配置master(192.168.10.244)

vi /etc/keepalived/keepalived.conf

将以下内容替换keepalived.conf里面的内容

 ! Configuration File for keepalived
global_defs {
notification_email {
admin@milipp.com
}
notification_email_from dev@milipp.com
smtp_server mail.milipp.com
smtp_connect_timeout
router_id LVS_DEVEL
}
11 vrrp_script chk_nginx {
12 script "/home/ops/scripts/monitor-nginx.sh" #这个即使监控nginx宕机的脚本实现自动切换
13 interval 2
14 weight -5
15 fall 3
16 rise 2
17 }
vrrp_instance VI_1 {
state MASTER
interface eth0 #主nginx ip对应的网卡名,使用ifconfig查看
mcast_src_ip 192.168.10.244 #主nginx的ip
virtual_router_id #虚拟路由id,主从必须一致
priority #优先级,主比从大
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.10.246 #虚拟ip,主从必须一致,可以陪配置多个
}
track_script {
chk_nginx #上面配的监控nginx的脚本
}
}

(b).配置slaver(192.168.10.245)

vi /etc/keepalived/keepalived.conf

将以下内容替换keepalived.conf里面的内容

 ! Configuration File for keepalived
global_defs {
notification_email {
renhuan@milipp.com
}
notification_email_from xuyongming@milipp.com
smtp_server mail.example.com
smtp_connect_timeout
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/home/ops/scripts/monitor_nginx.sh"
interval
weight -
fall
rise
}
vrrp_instance VI_1 {
state BACKUP
interface enp3s0
mcast_src_ip 192.168.10.245
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.10.246
}
track_script {
chk_nginx
}
}

监控脚本/home/ops/scripts/monitor_nginx.sh的内容:

 #!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "" ]; then
/usr/local/nginx/sbin/nginx
sleep
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "" ]; then
/usr/local/keepalived/sbin/keepalived stop
fi
fi

即当nginx挂掉后,停掉keepalived

测试:

分别启动两台nginx和两台keepalived,使用虚拟ip 192.168.10.246访问。

在244上执行:

ip a

得到结果:

虚拟ip绑定到244上,以同样的方式查看245,结果245没有绑定虚拟ip

此时停掉245的keepalived或者nginx,使用虚拟ip 246访问,没有问题,查看绑定情况,发现245绑定了虚拟ip。至此测试成功。

(2)主主(master master)

TODO:

双nginx(主备、主主)反向代理tomcat实现web端负载均衡的更多相关文章

  1. nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录

    在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能. 废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测) ...

  2. webRTC脱坑笔记(四)— windows下Nginx对Node服务的反向代理

    Nginx反向代理 1.什么是反向代理 当我们有一个服务器集群,并且服务器集群中的每台服务器的内容一样的时候,同样我们要直接从个人电脑访问到服务器集群服务器的时候无法访问,必须通过第三方服务器才能访问 ...

  3. nginx反向代理tomcat访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题

    问题说明:测试机上部署了一套业务环境,nginx反向代理tomcat,在访问时长时间处于加载中,十分缓慢! 通过浏览器调试(F12键->Console),发现有错误ERR_CONTENT_LEN ...

  4. 前nginx后Apache+Node反向代理

    前几天一直在被一个问题困扰,机器上跑的站点太多了,Apache上面有十几个,NodeJS的也有一堆,记端口号都要烦死,于是萌生了使用反向代理的想法.出发点貌似太low了,完全不是出于负载均衡.高并发什 ...

  5. Centos 7 上使用nginx为Node.js配置反向代理时错误:(13: Permission denied) while connecting to upstream

    错误来源:Centos 7 上使用nginx为Node.js配置反向代理时产生(13: Permission denied) while connecting to upstream的错误 nginx ...

  6. Nginx服务器的使用与反向代理负载均衡

    目录 Nginx服务器 一:什么是Nginx? 什么是Nginx - Nginx与其他服努器的性能比较 二:如何在Linux中搭建Nginx服务器? 常见的错误 三:Nginx的反向代理和负载均衡 什 ...

  7. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第九集之安装Tomcat+Nginx反向代理Tomcat集群】

    1,安装Tomcat:和在windows下安装是一样的. 安装tomcat:上传后解压: tar -zxvf apache-tomcat-7.0.88.tar.gz -z:代表.gz格式的压缩包,-x ...

  8. Nginx反向代理tomcat返回400 bad request

    Nginx反向代理tomcat返回400 bad request nginx 版本1.12, tomcat版本 9.06 最近用Nginx做反向代理tomcat,实现前后端分离,nginx 将请求代理 ...

  9. docker,构建nginx反向代理tomcat

    Nginx实现负载均衡是通过配置nginx.conf来实现的,nginx.conf的全部内容如下: user nginx; worker_processes 1; error_log /var/log ...

随机推荐

  1. 欧拉工程第70题:Totient permutation

    题目链接 和上面几题差不多的 Euler's Totient function, φ(n) [sometimes called the phi function]:小于等于n的数并且和n是互质的数的个 ...

  2. jQuery通知插件 -- noty

    noty是一个jQuery的通知(信息提示)插件,灵活轻便,是一个非常棒的用于替代传统提示对话框的插件. 当前最新版本为2.1.0: 从https://github.com/needim/noty 可 ...

  3. cololection

    package cn.bjsxt.col; /** * 简化迭代器原理 * hasNext * next * @author Administrator * */ public class MyArr ...

  4. IOS数据类型

    id – 动态对象类型.动态类型和静态类型对象的否定词汇为 nil. Class – 动态类的类型.它的否定词汇为 Nil.SEL – 选择器的数据类型(typedef):这种数据类型代表运行时的一种 ...

  5. Android L 使用ART能提高多少性能?

    点击打开链接 刚刚结束的 Google I/O 大会上,Android 下一代操作系统「L」带来不少惊喜.新系统运行更快.更省电. 然而开发者对这个新系统也有颇多疑问,比如新的运行模式 ART 对开发 ...

  6. TeeChart的X轴为时间,多个Y轴的显示

    最后上代码 public partial class Test : Form { private TChart tChart = new TChart(); ; public Test() { Ini ...

  7. Android开发之定义接口暴露数据

    写了一个网络请求的工具类,然后想要获取到网络请求的结果,在网络工具类中写了一个接口,暴露除了请求到的数据 代码: package com.lijingbo.knowweather.utils; imp ...

  8. hdu 2986 Ballot evaluation (模拟)

    题目 上次比赛的题目,好长时间了. 这几天感冒了很难受, 直到现在才整理, 上次比赛的时候,出了各种错误,   ,,,样例都没过,题目读的也很差,今天做的时候, 看了一下网上的,发现一个代码特别简洁, ...

  9. POJ 3233 矩阵乘法

    题意:求解A+A^2+...+A^k 题解: 1)利用通和公式,原式=(A^k+1 - A)(A - O)^-1 时间复杂度O(n^3lgk) 2)递归求解,A+A^2+...+A^k=(A+A^2+ ...

  10. 最大流 Dinic + Sap 模板

    不说别的,直接上模板. Dinic+当前弧优化: struct Edge{ int x,y,c,ne; }e[M*]; int be[N],all; int d[N],q[N]; int stack[ ...