Nginx反向代理和负载均衡


承接一文初步认识Nginx,本篇文章,继续将基础知识和原理罗列出来,然后将实际操作演示Nginx的反向代理和负载均衡服务!


第一部分:基础知识

Nginx服务器的反向代理服务和负载均衡

一.Nginx的负载均衡简述
严格来说,Nginx仅仅是作为反向代理使用的,因为反向代理的功能可以表现出负载均衡的效果,所以常说Nginx可以实现负载均衡。
与传统的负载均衡不同,传统的负载均衡,比如LVS,他本质是将包进行转发,即整个过程其实就只有客户端和真实服务器建立连接,而Nginx不同,Nginx是接收到包后,打开包查看包中的信息,然后先自己与客户端建立连接,然后Nginx再去请求后端服务器,这一过程其实是建立了两个连接(一是客户端与Nginx代理服务器之间建立一个连接,另一个是Nginx代理服务器和后端的真实服务器建立连接)

二.Nginx实现负载均衡组件的说明

Nginx http模块模块说明
ngx_http_proxy_moudlenginx代理模块,用于把请求后抛给服务器节点或upstream服务器池
ngx_http_upstream_moudle负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查

三.Nginx负载均衡核心介绍-----Upstream
1.Nginx的upstream模块
ngx_http_upstream_moudle模块允许Nginx定义一组或多组节点服务器组,使用时可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应Upstream组的名字上,具体写法为“proxy_pass http://www.server_pools”,其中www_server_pools就是一个Upstream节点服务器组的名字
2.Nginx的upstream模块的配置案例

upstream server_pool { ###创建了一个集群,叫做server_pool
 server 192.168.10.10 max_fails=3,weight=10; #设置失败次数,和权重
 #ip_hash   #开启hash,ip_hash不可以与权重同时存在
 keepalive 100;   #允许集群同时建立的连接数为100
 }

3.upstream模块中server标签参数说明

upstream模块内参数参数说明
server < ip address>< port >负载均衡后面的RS配置,可以是IP地址+端口,也可以是域名+端口(高并发场景下,可以使用域名,然后通过DNS做负载均衡)
weight=< value >服务器权重,权重越大,被访问的几率越大
max_failsNginx尝试连接后端主机失败的次数,这个数值配合proxy_next_upstream,fastcgi_next_upstream和memcached_next_upstream这三个参数来使用,当Nginx接收后端服务器返回这三个参数定义的状态码时,会将请求发送给正常的后端服务器
backup热备配置。即配置了该参数的服务器,作热备份机,如果主服务器宕机了,那么备份机就会立即启用。注:如果调度算法是ip_hash的话,后端服务器在负载均衡中的调度不可以是weight和backup
fail_timeout在max_fails次数到数之后,每隔这个时间间隔就重新询问一下,服务器是否恢复正常,如果没有恢复正常,就再等待这个时间之后再进行询问
down标志着该服务器不可使用,这个参数可以配合ip_hash使用

4.upstream模块调度算法
调度算法一般分为两类
·第一类为静态调度算法,即负载均衡服务器按照本地设置的规则进行分配,不需要考虑后续服务器的状态,如rr,wrr,ip_hash等都属于静态调度算法
·第二类为动态调度算法,即负载均衡服务器会根据后端节点的状态来决定是否分配请求。例如,连接数少的优先获得请求,相应时间短的优先获得请求,如least_conn,fair等都属于常见的动态调度算法

下面介绍几种常见的调度算法
1.rr(轮询算法,静态)
按客户端请求顺序把客户端的请求,逐一分配到不同的后端服务器
2.wrr(加权轮询,静态)
在rr算法的基础上,加上了权重,即为权重轮询算法,当使用该算法时,权重和用户访问成正比,即权重越大的,分担的访问压力就越大
3.ip_hash(针对IP的哈希,静态)
每个请求按客户端的IP哈希结果进行分配,当新的请求到达时,先将客户端IP通过哈希算法得出来一个值,在随后的客户端请求中,客户IP的哈希值只要相同,就会分配至同一台服务器,这样的调度算法可以解决动态网页的session问题,但有时会导致请求分配不均,即无法保证1:1的负载均衡
4.fair(响应时间,动态)
此算法会根据后端节点服务器的响应时间来分配请求,响应时间短的优先分配,此算法可以根据页面大小和加载时间长短来智能地进行负载均衡,也就是根据后端的响应时间,响应时间短的优先被分配,nginx本身不支持这个算法,如果想使用,需要下载有关模块upstream_fair
5.least_conn(最少连接,动态)
根据后端节点的连接数来决定是否分配情况,哪个机器连接数少就进行分发
6.url_hash(针对URL的哈希,动态)
与ip_hash类似,这个算法是根据URL进行哈希,当后端服务器为缓存服务器时,有非常好的效果,可以提高缓存的命中率,Nginx本身不支持这种算法,需要下载对应的hash模块包
7.一致性hash(动态)
一致性hash算法一般用于代理后端业务为缓存服务(如squid,Memcached)的场景,通过将用户请求的URI或者指定字符串进行计算,然后调度到后端的服务器中,此后任何用户查找同一个URI或者指定字符串都会被调度到这一台服务器上,因此后端的每个节点的缓存内容都是不同的。一致性hash算法可以实现后端某个或某几个节点宕机后,缓存的数据动荡最小

三.Nginx负载均衡核心介绍-----http_proxy——moudle模块
1.proxy_pass指令
http_proxy——moudle模块可以将请求转发到另一台服务器上,在实际的反向代理工作中,会通过location功能匹配指定的URI,然后把接收到的符合匹配URI的请求通过proxy_pass抛给定义好的upstream节点池

location /name/{
   proxy_pass http://127.0.0.1/remote/;
   }
   ###上述语句的意思是将匹配URI为name的请求抛给http://127.0.0.1/remote/

2.http proxy模块参数
Nginx的代理功能是通过http proxy模块来实现的,此处详细介绍了http_proxy参数

第二部分:搭建简单的负载均衡

实验环境

主机IP地址
负载均衡调度器192.168.10.10
后端真实服务器S1192.168.10.20
后端真实服务器S2192.168.10.30

一.安装nginx及相关软件包
三台机器的安装配置都是相同的!
1.安装依赖软件包

yum -y install openssl openssl-devel pcre pcre-devel
###openssl和nginx的https有关,pcre包和正则有关

2.安装Nginx软件包

mkdir /nginx  ###在根目录下创建nginx目录

cd /nginx  ###进入到nginx目录下

wget -q http://nginx.org/download/nginx-1.6.3.tar.gz ###获取nginx的压缩包

tar xf nginx-1.6.3.tar.gz  ###对压缩包进行解解压缩

useradd nginx -s /sbin/nologin -M ###创建名为nginx的用户

cd nginx-1.6.3  ###进入解压好的目录中

./configure --user=nginx --group=nginx --prefix=/application/nginx-1.6.3 --with-http_stub_status_module --with-http_ssl_module ###安装前的预配置

make   ###进行预编译

make install ###进行安装

至此安装完成
/application/nginx-1.6.3/sbin/nginx  ###开启nginx服务

二.配置用于测试的web服务站点
两台后端服务器(S1和S2)的配置都是一样的,这里只给出一次配置

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

    keepalive_timeout  65;

    server {
        listen       80;
        server_name  www.test1.com;  ###设置虚拟主机的域名

        location / {
            root   html/test1;     ###指定访问该虚拟主机时的主目录
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
    ....   ######后续一些配置,这里不再给出
    ....
  }

在自己本地的 /etc/hosts中添加自己主机的域名解析

[root@localhost test1]# tail -1 /etc/hosts
192.168.10.20 www.test2.com

三.反向代理和负载均衡服务器端的配置(192.168.10.10)

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


    sendfile        on;

    keepalive_timeout  65;

    upstream www_test1_com_pools {        #####创建一个后端服务器集群池
    server 192.168.10.20 weight=1;
    server 192.168.10.30 weight=1;

   }

    server {                             ###定义要代理的主机
        listen       80;
        server_name  www.test1.com;
        location / {
        proxy_pass http://www_test1_com_pools;
                            ###实现负载均衡最重要的一环!proxy_pass 后面接之前定义好的后端服务器集群池,注意要有http://构成完整的URL
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }


#负载均衡器本地也添加对应的主机解析
[root@localhost application]# tail -1 /etc/hosts
192.168.10.10 www.test2.com


四.实验现象

[root@localhost application]# curl www.test1.com
this is test 1 //192.168.10.20
[root@localhost application]# curl www.test1.com
this is test 1 //192.168.10.30
[root@localhost application]# curl www.test1.com
this is test 1 //192.168.10.20
[root@localhost application]# curl www.test1.com
this is test 1 //192.168.10.30

五.实验中遇到的问题
由于笔者,在安装Nginx之前安装了Apache,并开启但是没有关闭,导致80端口一直被占用,造成了实验无法完成的现象。这里也给大家提个醒!查看端口是否被占用netstat -tunpl | grep 80

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值