乐趣区

关于nginx:Nginx-反向代理负载均衡及搭建高可用集群

Nginx 反向代理,负载平衡及搭建高可用集群

前提筹备

首先是对于 linux 环境下的装置 (本地机器是 Windows 版本,大家能够应用Vmware, 然而须要配置网络连接等,这里就不再展现虚拟机上的演示。这里应用到集体的 阿里云云服务器 搭配上 xftpxshell来进行文件的上传与连贯命令行的输出)

留神:以下命令皆为 CentOS7 所应用。

上面开始进行系列依赖的装置:

<div align = “center”><img src= “http://maycope.cn/images/image-20200807092205021.png”></div>

gcc 装置:

yum -y install gcc automake autoconf libtool make
yum install gcc gcc-c++

pcre 装置

cd /usr/local/src
wget    https://netix.dl.sourceforge.net/project/pcre/pcre/8.40/pcre-8.40.tar.gz
tar -zxvf pcre-8.40.tar.gz
cd pcre-8.40
./configure
make && make install

zlib 装置

cd /usr/local/src
wget http://zlib.net/zlib-1.2.11.tar.gz      wget  http://www.zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make && make install
yum install -y zlib zlib-devel

openssl 装置

cd /user/local/scr
wget https://www.openssl.org/source/openssl-1.0.1t.tar.gz
tar -zxvf openssl-1.0.1t.tar.gz

nginx 装置

cd /user/local/scr
wget http://nginx.org/download/nginx-1.1.10.tar.gz
tar zxvf nginx-1.1.10.tar.gz
cd nginx-1.1.10
./configure
make && make install
启动 nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

实现之后能够后行查看本人的本人的服务器凋谢了哪些的端口:

firewall-cmd --list-all

若是没有进行端口的开发能够应用如下命令进行端口的凋谢:

firewall-cmd --zone=public --add-port=80/tcp --permanent
# 其中 80 能够进行批改为本人想要凋谢的端口,当然前提下是你要关上了防火墙。

防火墙设置

systemctl status firewalld.service # 查看防火墙状态
systemctl stop firewalld.service   # 敞开防火墙
systemctl start firewalld.service  # 关上防火墙

nginx 根底命令

  1. 在实现以上的根底筹备之后,曾经对 nginx 进行了启动,查看以后的 nginx 状况:
ps -ef | grep nginx
  1. 对 nginx 进行启动,进行与重启。
cd /usr/local/sbin   # 留神要进入到装置的 nginx 对应的相干的目录下才可能执行相关联的语句。./nginx # 示意启动 nginx
./nginx -s stop    # 示意对 nginx 进行进行。./nginx - s reload # 示意重启,个别在配置文件进行批改之后应用。

在启动实现之后就能够进行 ip 地址的拜访(因为对于 nginx 来说默认是启动在 80 端口,所以可间接进行 ip 地址的拜访)

配置文件解说:

首先是配置文件地址:/usr/local/nginx/conf/nginx.conf

对于 nginx 配置文件来说分为三大块:

全局快

从配置文件开始到 events 块之间的内容,次要会设置一些影响 nginx 服务器整体运行的配置指令,次要包含配置运行 Nginx 服务器的用户(组)、容许生成的 worker process 数,过程 PID 寄存门路、日志寄存门路和类型以及配置文件的引入等。

比方上面第一行配置的:

worker_processes  1;

这是 Nginx 服务器并发解决服务的要害配置,worker_processes 值越大,能够反对的并发处理量也越多,然而会受到硬件、软件等设施的制约

events 块

events {worker_connections  1024;}

events 块波及的指令次要影响 Nginx 服务器与用户的网络连接,罕用的设置包含是否开启对多 work process 下的网络连接进行序列化,是否容许同时接管多个网络连接,选取哪种事件驱动模型来解决连贯申请,每个 word process 能够同时反对的最大连接数等。

上述例子就示意每个 work process 反对的最大连接数为 1024. 这部分的配置对 Nginx 的性能影响较大,在理论中应该灵便配置。

http 块

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;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
       server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
…………………………

这算是 Nginx 服务器配置中最频繁的局部,代理、缓存和日志定义等绝大多数性能和第三方模块的配置都在这里。

须要留神的是:http 块也能够包含http 全局块server 块

http 全局块

http 全局块配置的指令包含文件引入、MIME-TYPE 定义、日志自定义、连贯超时工夫、单链接申请数下限等。

server 块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是齐全一样的,该技术的产生是为了节俭互联网服务器硬件老本。

每个 http 块能够包含多个 server 块,而每个 server 块就相当于一个虚拟主机。

而每个 server 块也分为全局 server 块,以及能够同时蕴含多个 locaton 块。

1,全局 server 块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

2,location 块

一个 server 块能够配置多个 location 块。

这块的次要作用是基于 Nginx 服务器接管到的申请字符串(例如 server_name/uri-string),对虚拟主机名称(也能够是 IP 别名)之外的字符串(例如 后面的 /uri-string)进行匹配,对特定的申请进行解决。地址定向、数据缓存和应答管制等性能,还有许多第三方模块的配置也在这里进行。

反向代理

何为反向代理:

在理解反向代理之前,先理解正向代理:

正向代理:如果把局域网外的 Internet 设想成一个微小的资源库,则局域网中的客户端要拜访 Internet,则须要通过代理服务器来拜访,这种代理服务就称为正向代理。简而言之就是起到一个帮忙达到指标网络的作用。

反向代理:反向代理,其实客户端对代理是无感知的,因为客户端不须要任何配置就能够拜访,咱们只须要将 申请发送到反向代理服务器,由反向代理服务器去抉择指标服务器获取数据后,在返回给客户端,此时反向代理服务器和指标服务器对外就是一个服务器,裸露的是代理服务器地址,暗藏了实在服务器 IP 地址。

举个栗子:咱们在本地环境上装置一个 tomcat 服务器,对于 tomact 来说默认拜访是 8080 端口,然而咱们不想输出 80 端口就能够间接进行拜访,就须要咱们间接拜访 80 端口 示意拜访到 nginx 服务器,而后进行配置文件的配置,将申请转发到咱们的 tomcat 服务器上。

咱们能够进行如下配置:

在 http 模块中 进行如下配置:

 server {
        listen       80;
     #  server_name  localhost;
       server_name 121.*.*.34;# 示意监听的服务的名称是 如下地址
        location / {
            root   html;
           proxy_pass http://127.0.0.1:8080; # 示意进行转发的地址,首先须要在本机装置 tomact 并启动 自行官网下载即可
            index  index.html index.htm;
        }
        }

实现配置之后记得重启服务:即可看到如下展现:示意从 80 端口跳转到 8080 端口

实例二

在下面的案例中咱们拜访的还是默认的 80 端口,若是咱们想要更换端口去拜访呢,咱们若是想要拜访其余的端口,或者说是拜访带门路的信息呢,该如何进行操作,这个时候就能够增加一个 server,因为一个 server 监听一个惟一的端口,这里咱们能够再创立一个 server 选中咱们监听的端口信息。再 location 中进行配置即可。

 server {
        listen      3308; # 咱们监听不同的端口信息
        server_name  localhost;
        location  ~ /edu/  {
        # 在 tomcat 下的 webpage 下创立对应的目录,下增加一个 index.html 页面。proxy_pass http://127.0.0.1:8080;
        }
    }

这个时候咱们就能够拜访如下网址:能够发现如下的 3308(本人测试时候要提前开启端口)端口搭配上 edu 门路和对应的 index.html 就能够拜访到咱们tomact 服务器上面的对应的页面信息。

负载平衡

概念

负载平衡即是将负载摊派到不同的服务单元,既保证服务的可用性,又保障响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载平衡产品,很多业余的负载平衡硬件提供了很好的性能,但却价格不菲,这使得负载平衡软件大受欢迎,nginx 就是其中的一个,在 linux 下有 Nginx、LVS、Haproxy 等等服务能够提供负载平衡服务,而且 Nginx 提供了几种调配形式(策略):

  1. 轮询(默认)

    每个申请按工夫程序逐个调配到不同的后端服务器,如果后端服务器 down 掉,能主动剔除。

  2. weight

    weight 代表权, 重默认为 1, 权重越高被调配的客户端越多

    指定轮询几率,weight 和拜访比率成正比,用于后端服务器性能不均的状况。例如:

    upstream server_pool
    {
    server 121.111.2.34 weight = 10;
    server 121.111.2.35 weight = 10;
    }
  3. ip_hash

    每个申请按拜访 ip 的 hash 后果调配,这样每个访客固定拜访一个后端服务器,能够解决 session 的问题。

    upstream server_pool{
    ip_hash;
    server 121.111.2.34 weight = 10;
    server 121.111.2.35 weight = 10;
    }
  4. fair(第三方)

按后端服务器的响应工夫来调配申请,响应工夫短的优先调配。

upstream server_pool{
fair;
server 121.111.2.34 weight = 10;
server 121.111.2.35 weight = 10;
}

实例

在 http 中增加 upstream 关键字:

http{
……
upstream myserver{
# 领有两台服务器
fair # 示意 依照相应的工夫进行调配哪个服务来相应以后的申请。server 121.111.2.34:8080;
server 121.111.2.35:8080;
# 留神 这里是模仿两台服务器,对于没有两台实在的服务器的,能够开两个 tomcat 服务 配置不同的端口
server 121.111.2.34:8080;
server 121.111.2.34:8081;
}

server{
        listen 80;
        server_name 121.111.2.34;
        ……
        location /{
        proxy_pass http://myserver
        # myserver 和下面本人所起的 upstream 绝对应
        …… 
        }
}

这样就能够在拜访到本机的 80 端口时候进行数据的转发解决,抉择一个特定的主机进行服务的相应接管

高可用

简介

对于这部分常识,之前在学习基于 Mysql 与 Redis 集群上我的项目负载平衡时候有应用的到 docker 来搭建后端的nginx 负载平衡, 同时,这部分的具体实现的信息也在我的集体githubgithub 我的项目地址账户上有所体现。

无论是 nginx 集群的创立,还是负载平衡的实现上,对于 docker 来说都为咱们提供了很大的遍历,过后的 docker 配置上夹杂了一些其余的配置,可能把这部分宰割进去还是须要点工夫去了解,这里就独自进行剖析与学习。

实例

对于具体的逻辑信息,在我如上的 基于 Mysql 与 Redis 集群上我的项目负载平衡 ,次要就是说:为了避免只有一个nginx 导致问题的呈现的问题,而后增加两个 nginx 进行轮询,然而这个轮询的工作不须要咱们自行实现,而是借助第三方的工具Keepalived,帮忙咱们实现系列的工作, 见下图:利用心跳检测,来具体检测出故障的机器,并且进行 ip 的虚拟化,只须要记录一个 ip 信息,而后前面的操作

<img src=”https://img-blog.csdnimg.cn/20200501081514734.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDAxNTA0Mw==,size_16,color_FFFFFF,t_70″>

  1. 首先是有两台服务器,而后在其上都进行 keepalived 的装置

    yum install keepalived -y # 装置
    rpm -q -a keepalived # 查看装置的状况
    cd /etc/keepalived
    vi keepalived.conf
  2. 而后批改两台 keepalived 中的文件的配置信息:


global_defs {

    notification_email {

        acassen@firewall.loc

        failover@firewall.loc

        sysadmin@firewall.loc

    }

    notification_email_from Alexandre.Cassen@firewall.loc

    smtp_server 121.111.2.34

    smtp_connect_timeout 30

    router_id LVS_DEVEL #惟一

}

vrrp_script chk_http_port {
    script "/usr/local/src/nginx_check.sh"
    interval 2    #(检测脚本执行的距离)2 s 执行一次
    weight 2   # 脚本成立 权重减少 2。}

vrrp_instance VI_1 {

    state BACKUP    # 备份服务器上将 MASTER(主)改为 BACKUP 

    interface ens33    # 网卡

virtual_router_id 51    # 主、备机的 virtual_router_id 必须雷同

    priority 100    # 主、备机取不同的优先级,主机值较大,备份机值较小

    advert_int 1 # 进行心跳检测 每隔一秒 发送检测信息 查看是否存活

    authentication {

        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {121.111.2.20 # 虚拟地址}
}
  1. 脚本文件的编写, 不同于应用 docker 的形式,如下是应用到 dcoker 的解决方案, 配置文件的不同。

如下咱们编写具体的信息查看 nginx 是否存活。寄存的目录是/usr/local/src/

#!/bin/bash

A = `ps -C nginx –no-header |wc -l`

if [$A - eq 0]; then

    / usr / local / nginx / sbin / nginx
    # 查看 nginx 是否还存活

sleep 2

if [`ps -C nginx --no-header |wc -l` - eq 0]; then killall keepalived

fi

fi
  1. 实现之后对 nginxkeepalived 进行启动即可keepalived 启动命令:systemctl start keepalived

这个时候咱们拜访虚拟地址:121.111.2.20,而后两个 keepalived 会抢占这个虚构 ip,同时将服务申请发送到不同对应的 nginx 服务器上, 这样就保障了在一个服务器呈现故障时候,另外一个还可能失常的工作。

退出移动版