nginx(一)nginx配置反向代理与负载均衡

最近在研究秒杀程序的设计及服务器配置。

涉及到秒杀这个问题,那肯定就意味着大流量高并发访问,那么大概率我们需要做反向代理与负载均衡配置。

那么如何配置nginx的反响代理与负载均衡呢?

一:配置服务器环境

首先,我们大概需要准备三台服务器

一台做反向代理,剩下的两台做负载均衡的演示。

反向代理服务器只需要配置nginx环境即可,因为,其只做为请求转发的中转站。

两台负载均衡服务器,需要配置lnmp环境,具体配置过程请移步《Centos7.6配置lnmp

上边的方法是属于有那个条件的同学使用,正常一台服务器也行,在服务器上配置nginx和apache,nginx做反向代理,将请求转发至apache即可。

Lamp环境配置,请移步《LAMP环境配置及NGINX安装

二:负载均衡配置实例

下面我先放一下我测试使用的一个nginx配置示例,具体的配置项下边会有一个大概的解释:

http{
    
    
    # 配置负载均衡
    # 这里的域名要和下面proxy_pass的一样
    upstream  guanchao.site {
    
       
        # 将请求分配至最小链接
        least_conn;
        # 每个请求会按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理,可以解决session的问题。如果server挂掉,能自动剔除。     
        # ip_hash;
        # weigth参数表示权值,权值越高被分配到的几率越大
        # 下面表示219.44有2分之1几率,132.2有2分之1几率
        server    47.100.219.44:80 max_fails=2 fail_timeout=5s weight=1; 
        server    8.140.132.2:80 max_fails=2 fail_timeout=5s weight=1; 
    #     server    111.231.162.140:80 max_fails=2 fail_timeout=5s weight=1; 
    }     
 
    server {
    
      
        listen       80; 
        server_name  guanchao.site;  
 
        location / {
    
      
            # 配置负载均衡
            proxy_pass http://guanchao.site;  #请求转向taishan定义的服务器列表
            proxy_set_header Host $host;#将请求头转发给后端服务器
            proxy_set_header X-Forward-For $remote_addr;#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_connect_timeout 2s; 最长链接时间为2s
            proxy_redirect default;  
        }  
 
        error_page   500 502 503 504  /50x.html;  
        location = /50x.html {
    
      
            root   html;  
        }  
    }
}

111.231.162.140这个服务器作为反向代理服务器

47.100.219.44与8.140.132.2这两台服务器作为负载均衡服务器

以上的配置得到的效果:

在这里插入图片描述
在这里插入图片描述

我们可以看到,在同一个域名下,多次刷新,我们看到的页面是不同的,因此,证明我们上边的反向代理及负载均衡的配置是没有问题的。

三:负载均衡策略

1:轮询

这种是默认的策略,把每个请求按顺序逐一分配到不同的server,如果server挂掉,能自动剔除。

    # 配置负载均衡
    # 这里的域名要和下面proxy_pass的一样
    upstream  guanchao.site {
    
       
        # weigth参数表示权值,权值越高被分配到的几率越大
        # 下面表示44有2分之1几率,2有2分之1几率
        server    47.100.219.44:80 max_fails=2 fail_timeout=5s weight=1; 
        server    8.140.132.2:80 max_fails=2 fail_timeout=5s weight=1; 
    }

2:最少链接

    # 配置负载均衡
    # 这里的域名要和下面proxy_pass的一样
    upstream  guanchao.site {
    
       
        # 将请求分配至最小链接
        least_conn;
        # weigth参数表示权值,权值越高被分配到的几率越大
        # 下面表示44有2分之1几率,2有2分之1几率
        server    47.100.219.44:80 max_fails=2 fail_timeout=5s weight=1; 
        server    8.140.132.2:80 max_fails=2 fail_timeout=5s weight=1; 
    }

3:权重weight

    # 配置负载均衡
    # 这里的域名要和下面proxy_pass的一样
    upstream  guanchao.site {
    
       
        server    47.100.219.44:80 max_fails=2 fail_timeout=5s weight=1; 
        server    8.140.132.2:80 max_fails=2 fail_timeout=5s weight=1; 
    }

4:ip_hash

每个请求会按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理,可以解决session的问题。如果server挂掉,能自动剔除。

    # 配置负载均衡
    # 这里的域名要和下面proxy_pass的一样
    upstream  guanchao.site {
    
       
        # 每个请求会按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理,可以解决session的问题。如果server挂掉,能自动剔除。     
        ip_hash;
        # weigth参数表示权值,权值越高被分配到的几率越大
        # 下面表示44有2分之1几率,2有2分之1几率
        server    47.100.219.44:80 max_fails=2 fail_timeout=5s weight=1; 
        server    8.140.132.2:80 max_fails=2 fail_timeout=5s weight=1; 
    }

以上四个策略可以组合叠加使用。

剩下配置的用处,我在nginx配置实例中都有备注。

四:其他参数

参数列表如下:

down

表示单前的server暂时不参与负载

weight

默认为1.weight越大,负载的权重就越大

max_fails

允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

fail_timeout

max_fails次失败后,暂停的时间

backup

其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻

五:Nginx如何处理事件并且实现高并发

下面这段话是我在百度找资料的时候发现的,觉得写的还挺好的,借鉴一下。

Nginx内部采用了异步非阻塞的方式来处理请求,也就是说,Nginx是可以同时处理成千上万个请求的。

异步非阻塞:当一个网络请求过来时,我们并不依赖于这个请求才能做后续操作,那么这个请求就是异步操作,也就是调用者在没有得到结果之前同样可以执行后续的操作。非阻塞就是当前进程/线程没有得到请求调用的结果时也不会妨碍到进程/线程后续的操作。可以看出异步和非阻塞的对象是不同的。

回到Nginx中,首先,请求过来,要建立连接,然后再接收数据,接收数据后,再发送数据。具体到系统底层,就是读写事件,而当读写事件没有准备好时,必然不可操作,如果不用非阻塞的方式来调用,那就得阻塞调用了,事件没有准备好,那就只能等了,等事件准备好了,再继续。而阻塞调用会进入内核等待,cpu就会让出去给别人用了,对单线程的worker来说,显然不合适,当网络事件越多时,大家都在等待,cpu空闲下来没人用,cpu利用率自然上不去了,更别谈高并发了。而非阻塞就是,事件没有准备好,马上返回EAGAIN,告诉调用者,事件还没准备好,过会再来。过一会,再来检查一下事件,直到事件准备好了为止,在这期间,Nginx可以处理其他调用者的读写事件。但是虽然不阻塞了,但Nginx得不时地过来检查一下事件的状态,Nginx可以处理更多请求了,但带来的开销也是不小的。所以,才会有了异步非阻塞的事件处理机制,具体到系统调用就是像select/poll/epoll/kqueue这样的系统调用。它们提供了一种机制,让你可以同时监控多个事件,以epoll为例子,当事件没准备好时,放到epoll里面,事件准备好了,Nginx就去读写,当读写返回EAGAIN时,就将它再次加入到epoll里面。这样,只要有事件准备好了,Nginx就可以去处理它,只有当所有事件都没准备好时,才在epoll里面等着。这样便实现了所谓的并发处理请求,但是线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件,事实上就是这样的。与多线程相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常的轻量级。并发数再多也不会导致无谓的资源浪费(上下文切换)。更多的并发数,只是会占用更多的内存而已。现在的网络服务器基本都采用这种方式,这也是nginx性能高效的主要原因。

以上大概就是nginx的反响代理与负载均衡的配置,有好的建议,请在下方输入你的评论。

欢迎访问个人博客
https://guanchao.site

欢迎访问小程序:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39708228/article/details/115064523
今日推荐