nginx实现集群服务器的负载均衡
一、概述
Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。
nginx 是一个很强大的高性能Web和反向代理服务器。这里主要使用的就是nginx的反向代理功能。
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
服务器集群:是指将很多服务器集中起来一起进行同一种服务,在客户端看来就是只有一个服务器。集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行。
均衡负载:对于集群来说,负载均衡意味着当方向代理服务nginx接受到用户发起的请求之后,会把请求按照配置的分配方式让各个服务器摊分任务,以此来减少服务器的压力,提高性能。
二、Nginx实现负载均衡
实验环境:四台虚拟机
调度器
server1:172.25.18.1
server4:172.25.18.4
后端服务器
server2:172.25.18.2
server3:172.25.18.3
1.下载安装nginx服务(版本为1.14.0)
下载地址:(www.pkgs.org)
从物理机上下载到虚拟机:
2.源码编译安装
编译之前编辑两个文件
[root@server1 nginx-1.14.0]# vim src/core/nginx.h
修改14行如上,不显示nginx版本号(防止黑客)
[root@server1 nginx-1.14.0]# vim auto/cc/gcc
注释掉179行内容,纯净安装
编辑完成后,下载编译所需要的依赖包
[root@server1 nginx-1.14.0]# yum install -y gcc pcre-devel openssl-devel
源码编译安装三部曲:
第一步:编译
第二步:检查安装环境
第三步:安装
3.创建软连接,检测是否有错误,没错误后启动服务
Server4做同样操作安装nginx服务,或者直接拷贝安装好的目录过去。
4.客户端访问
5.用server4实现负载均衡
首先创建一个nginx用户,然后编辑文件nginx.conf
配置文件第二行填写自己创建的nginx用户和组,第三行为cpu个数(也可填auto自动匹配)
第13行为默认为epoll模块(可写可不写),第14行,为最大连接数,
定义两个RS(后端服务器)的httpd网页,如下:
定义完成之后,需要再配置文件的最后进行调用
因为配置文件修改了最大连接数,所以应当编辑文件/etc/security/limits.conf:
在最后添加:
修改完成后,查看是否成功
成功后切回root用户,重新读取nginx服务
此时访问网页或者用真机测试,则负载均衡成功
Ip_hash(保持连接,一开始连接的谁,就一直连接谁)
三、集群服务器的负载均衡(Nginx + rhcs)
使用红帽自带的集群管理,server1和server4搭建一个集群(ricci和luci),请参考 https://blog.csdn.net/lj_11111/article/details/80836293
1.编写nginx启动关闭脚本,加上执行权限,移动到以下目录:
脚本:
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
lockfile="/var/lock/subsys/nginx"
pidfile="/usr/local/nginx/logs/${prog}.pid"
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc -p $pidfile $prog
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest_q || return 6
stop
start
}
reload() {
configtest_q || return 6
echo -n $"Reloading $prog: "
killproc -p $pidfile $prog -HUP
echo
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
configtest_q() {
$nginx -t -q -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
# Upgrade the binary with no downtime.
upgrade() {
local oldbin_pidfile="${pidfile}.oldbin"
configtest_q || return 6
echo -n $"Upgrading $prog: "
killproc -p $pidfile $prog -USR2
retval=$?
sleep 1
if [[ -f ${oldbin_pidfile} && -f ${pidfile} ]]; then
killproc -p $oldbin_pidfile $prog -QUIT
success $"$prog online upgrade"
echo
return 0
else
failure $"$prog online upgrade"
echo
return 1
fi
}
# Tell nginx to reopen logs
reopen_logs() {
configtest_q || return 6
echo -n $"Reopening $prog logs: "
killproc -p $pidfile $prog -USR1
retval=$?
echo
return $retval
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest|reopen_logs)
$1
;;
force-reload|upgrade)
rh_status_q || exit 7
upgrade
;;
reload)
rh_status_q || exit 7
$1
;;
status|status_q)
rh_$1
;;
condrestart|try-restart)
rh_status_q || exit 7
restart
;;
*)
echo $"Usage: $0 {start|stop|reload|configtest|status|force-reload|upgrade|restart|reopen_logs}"
exit 2
esac
可以用来启动关闭服务
Server1做同样操作;打开ricci和luci(全部设为开机自启)
搭建集群(https://blog.csdn.net/lj_11111/article/details/80836293)
集群搭建好以后,将上次编写的httpd改称nginx即可
添加图片
此时查看,服务在server4上面运行,如果server4宕掉,则会转到server1,使服务不断开
如何宕掉???
后端服务器:
server2和server3开启http服务,并设置默认发布文件
此时,客户端访问:
高可用集群+负载均衡搭建完毕
四、使用集群管理器共享硬盘
1.在集群操作页面上remove掉nginx服务,使其不工作
2.新打开server2添加一个虚拟硬盘,查看硬盘为vdb:
3.下载服务:[aaa@qq.com ~]# yum install scsi-* -y
下载完成后编辑文件启动服务
编辑文件如下:去掉38–40行注释,修改39行指向刚才添加的硬盘
server1和server4下载iscsi服务
[aaa@qq.com ~]# yum install -y iscsi-*
下载成功后指向server2
以上操作server1 和server4都执行
4.server1执行上述操作后,会产生共享磁盘/dev/sda,给这个磁盘分区
[aaa@qq.com nodes]# fdisk -cu /dev/sda
Command (m for help): n
分区完成后同步分区表
Server4也指向server2
[aaa@qq.com ~]# iscsiadm -m discovery -t st -p 172.25.18.2
Starting iscsid: [ OK ]
172.25.18.2:3260,1 iqn.2018-06.com.example:server.target1
[aaa@qq.com ~]# iscsiadm -m node -l
此时在server4上面可以看到server1分出来的共享磁盘
[aaa@qq.com ~]# pvcreate /dev/sda1
Server1查看并且,然后格式化
此时在server4可以看到server1分出来的磁盘
将磁盘挂载,在server4上写入东西,然后在server1挂载,则可以看到
但是只作为本地文件写入,两者不能同时写入.
下载数据库服务
[root@server1 ~]# yum install -y mysql-server
挂载磁盘到数据库目录下
Server1关闭了mysql,server4先挂载,然后开启,则可以同步到server1数据库的内容。
两边不可以同时写入或者挂载,否则会造成脑裂
此时在网页上关闭了挂载的服务,然后将服务写入/etc/fstab,关闭集群管理
Server1,4同时写入挂载,如下:
然后开启集群,它会自动挂载并且开启服务。