nginx反向代理结合keepalived实现高可用

一、概念

正向代理

正向代理最大的特点是客户端非常明确要访问的服务器地址。服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
总结
  始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口

用途
(1)访问原来无法访问的资源,如Google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

反向代理:

多个客户端给服务器发送的请求,Nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。
总结
  客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。
  反向代理,“它代理的是服务端,代服务端接收请求”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
用途
(1)保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
(2)负载均衡,通过反向代理服务器来优化网站的负载

二、nginx安装

原理结构如下:
nginx反向代理结合keepalived实现高可用_第1张图片

安装相关依赖

yum install pcre-devel zlib zlib-devel openssl openssl-devel

上传解压压缩包

tar zxvf nginx-1.12.2.tar.gz

创建目录,检测配置

mkdir -p /usr/local/nginx

./configure --prefix=/usr/local/nginx

预编译和安装

make && make install

启动、停止相关命令

cd /usr/local/nginx/sbin/
./nginx
./nginx -s stop
./nginx -s start

常见错误

在进行./configure 命令的时候经常会因为缺少库文件而报错,如下:

错误一:缺少gc++库文件

解决方式:在线安装gcc gcc-++

错误二:缺少PCRE库
./configure: error: the HTTP rewrite module requires the PCRE library.

解决方式:安装pcre-devel解决问题

yum -y install pcre-devel

错误三:
错误提示:./configure: error: the HTTP cache module requires md5 functions
from OpenSSL library. You can either disable the module by using
–without-http-cache option, or install the OpenSSL library into the system,
or build the OpenSSL library statically from the source with nginx by using
–with-http_ssl_module –with-openssl= options.

解决方式:

yum  -y install openssl openssl-devel

安装后继续执行configure命令,即可完成Nginx的安装

./configure --prefix=/usr/local/nginx

nginx的配置文件如下:

user  root;
worker_processes  8;
worker_cpu_affinity  00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000;
worker_rlimit_nofile 65535;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  3750;
    #accept_mutex on;
    #multi_accept on;
    use epoll;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #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;
    tcp_nopush    on;    # 激活 TCP_CORK socket 选择
    tcp_nodelay   on;    # 数据在传输的过程中不进缓存

   keepalive_timeout  65 60;

    client_header_timeout 15;
    client_body_timeout 15;
    send_timeout 25;
    client_max_body_size 8m;    # 设置客户端最大的请求主体大小为 8 M

    gzip  on;
    gzip_min_length  1k;         # 允许压缩的对象的最小字节
    gzip_buffers  4 32k;         # 压缩缓冲区大小,表示申请4个单位为32k的内存作为压缩结果的缓存
    gzip_http_version  1.1;      # 压缩版本,用于设置识别HTTP协议版本
    gzip_comp_level  9;          # 压缩级别,1级压缩比最小但处理速度最快,9级压缩比最高但处理速度最慢
    gzip_types  text/plain application/x-javascript text/css application/xml;    # 允许压缩的媒体类型
    gzip_vary  on;               # 该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用代理服务器缓存经过Nginx压缩的数据    

    include vhosts.conf;
    server_tokens off;
}
stream {

     upstream openldap {
         hash $remote_addr consistent;
         server 10.1.2.93:389 max_fails=4 fail_timeout=30s;
         server 10.1.2.94:389 max_fails=6 fail_timeout=30s;
     }

    server {
        listen 389;
        proxy_pass openldap;
        proxy_connect_timeout 60;
    }
}

三、keepalived安装

为了满足系统的高可用,在搭建nginx时使用Keepalived检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中。keepalived高可用结构如下:
nginx反向代理结合keepalived实现高可用_第2张图片

安装keepalived

yum install -y keepalived

keepalived.conf配置文件如下:

! Configuration File for keepalived

global_defs {
#  notification_email {
#    [email protected]
#    [email protected]
#    [email protected]
#  }
#  notification_email_from [email protected]
#  smtp_server 192.168.200.1
#  smtp_connect_timeout 30
        router_id proxy.hep.com  
                vrrp_skip_check_adv_addr
                vrrp_strict
                vrrp_garp_interval 0
                vrrp_gna_interval 0
}

vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh"   #检测 nginx 状态的脚本
                interval 2 #每2秒检测一次nginx的运行状态
                weight -20 #失败一次,将自己的优先级-20
}
vrrp_instance VI_1 {
        state BACKUP #BACKUP备状态,防止资源抢占,主备节点均采用BACKUP
                interface ens32 #网卡名,可使用ifconfig查看本机网卡名
                virtual_router_id 51 #虚拟路由ID,主备节点必须一致
                mcast_src_ip 10.1.2.91 #本机IP
                priority 100 #优先级,值越大,优先级越高,主节点优先级比备节点高
                nopreempt #设置不抢占资源,在主节点故障,备节点启用时,主节点恢复不抢占备节点,依旧使用备节点来进行请求
                advert_int 1 #组播信息发送间隔,主备节点必须一致
#设置验证信息,主备节点必须一致
                authentication {
                        auth_type PASS
                                auth_pass Zgjm0817
#  smtp_connect_timeout 30
#  smtp_connect_timeout 30
        router_id proxy.hep.com
                vrrp_skip_check_adv_addr
                vrrp_strict
                vrrp_garp_interval 0
                vrrp_gna_interval 0
}

vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh"
                interval 2
                weight -20
}
vrrp_instance VI_1 {
        state BACKUP #BACKUP备状态,防止资源抢占,主备节点均采用BACKUP
                interface ens32 #网卡名,可使用ifconfig查看本机网卡名
                virtual_router_id 51 #虚拟路由ID,主备节点必须一致
                mcast_src_ip 10.1.2.91 #本机IP
                priority 100 #优先级,值越大,优先级越高,主节点优先级比备节点高
                nopreempt #设置不抢占资源,在主节点故障,备节点启用时,主节点恢复不抢占备节点,依旧使用备节点来进行请求
                advert_int 1 #组播信息发送间隔,主备节点必须一致
#设置验证信息,主备节点必须一致
                authentication {
                        auth_type PASS
                                auth_pass Zgjm0817
                }
        track_script {
                chk_nginx
        }
        virtual_ipaddress {
                10.1.2.90  #虚拟IP地址
        }
}

keepalived.conf中的所有配置文件参数详解参考:
https://blog.csdn.net/mofiu/article/details/76644012

从机配置文件与主机几乎相同,只有vrrp_instance VI_1中的 mcast_src_ip和 priority 不同,变化如下:

vrrp_instance VI_1 {
                mcast_src_ip 10.1.2.92#本机IP
                priority 90#优先级,值越大,优先级越高,主节点优先级比备节点高
}

chk_nginx 中的检查脚本如下:

#!/bin/bash
if [  `ps -C nginx --no-header |wc -l` -eq 0 ];then
	/usr/local/nginx/sbin/nginx
	sleep 2
if [  `ps -C nginx --no-header |wc -l` -eq 0 ];then
	killall keepalived
	fi
fi

脚本解析

ps -C nginx –no-header
这里涉及ps 的用法,我们一般用ps查看相关进程,一般都是用 ps -ef | grep XX 但是这样通常都会覆盖一个grep的进程
我们可以用ps -C 或ps -c 的方式, -C 后面接命令的名字 ,–no-header 不打印头信息,如下:
nginx反向代理结合keepalived实现高可用_第3张图片

wc -l 行数计算,如果
ps -C nginx --no-header|wc -l
如果值为0,即代表服务未启动
如果值为非0,即代表服务已启动
killall keepalived以服务名称杀死进程

上面那段完整的脚本意思即为:
判断nginx 服务是否启动,如果未启动,执行启动命令,睡眠2秒。再次判断,如果启动失败,关掉keepalived,进入从节点。

启动keepalived服务

service keepalived start

查看虚拟ip
nginx反向代理结合keepalived实现高可用_第4张图片
启动后可以通过访问虚拟ip测试keepalived是否跳转ip成功,然后kill掉该ip的keepalived再重新访问,测试是否能正常访问跳到另外一个ip。

你可能感兴趣的:(Java,nginx,linux,java)