nginx实现集群服务器的负载均衡 - Go语言中文社区

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.下载服务:[root@server2 ~]# yum install scsi-* -y
下载完成后编辑文件启动服务
这里写图片描述
编辑文件如下:去掉38–40行注释,修改39行指向刚才添加的硬盘
这里写图片描述
server1和server4下载iscsi服务
[root@server1 ~]# yum install -y iscsi-*

下载成功后指向server2
这里写图片描述
以上操作server1 和server4都执行

4.server1执行上述操作后,会产生共享磁盘/dev/sda,给这个磁盘分区

[root@server1 nodes]# fdisk -cu /dev/sda
Command (m for help): n
这里写图片描述
分区完成后同步分区表
Server4也指向server2

[root@server4 ~]# 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
[root@server4 ~]# iscsiadm -m node -l

此时在server4上面可以看到server1分出来的共享磁盘
[root@server1 ~]# pvcreate /dev/sda1
这里写图片描述
Server1查看并且,然后格式化
这里写图片描述
此时在server4可以看到server1分出来的磁盘
这里写图片描述
将磁盘挂载,在server4上写入东西,然后在server1挂载,则可以看到
这里写图片描述
这里写图片描述
但是只作为本地文件写入,两者不能同时写入.

下载数据库服务

[root@server1 ~]# yum install -y mysql-server

挂载磁盘到数据库目录下
这里写图片描述
Server1关闭了mysql,server4先挂载,然后开启,则可以同步到server1数据库的内容。
两边不可以同时写入或者挂载,否则会造成脑裂
此时在网页上关闭了挂载的服务,然后将服务写入/etc/fstab,关闭集群管理
Server1,4同时写入挂载,如下:
这里写图片描述
然后开启集群,它会自动挂载并且开启服务。
这里写图片描述

同时写入???

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/lj_11111/article/details/80786714
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-25 00:08:01
  • 阅读 ( 1647 )
  • 分类:Go Web框架

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢