Nginx系列二:负载均衡与反向代理

      

一、负载均衡

 

       1、什么是负载均衡

随着请求数的快速增长,单服务器已经无法承担大量用户的并发访问,这个时候,就需要建立服务器集群,来让多台服务器协同工作,提高整体项目的吞吐量和QPS。假设一台设备资源占有率已经饱和,而另一台服务器缺只有零星几个请求处理,这显然是不合理的。我们期望多台服务器需要平均承担客户端发来的请求,使每台机器都充分利用。这时,我们就需要用到一种技术,叫做负载均衡。

负载均衡是多台服务器组合为一个集群,其中每台机器可以单独运行,服务器之间地位相同,通过负载均衡技术,将客户端发来的请求平均分配到每台服务器中,使得项目的负载能够均衡的分布,每台服务器的资源使用量也基本相同。直白的说,通过负载均衡技术,使得项目巨额访问量从单台服务器均匀的分摊到每台服务器上。这种思想,也是高性能网站结构的核心思想:分!

 

2、负载均衡之DNS轮询

我们对同一个域名添加多个A记录解析。DNS服务器会将请求随机分配到其中一条记录中。DNS轮询是否支持需要询问域名注册商。比如,我对博客www.lanecn.com添加了一个二级域名nginx.lanecn.com。在万网的操作后台,对这个域名添加了4A记录解析,分别为10.10.10.110.10.10.210.10.10.310.10.10.4。如果有请求来访问nginx.lanecn.com,域名会随机被解析到10.10.10.1 – 10.10.10.4中的其中一台。这就是用DNS轮询的方式来做负载均衡。

无标题.png

 

优点:DNS轮询的成本非常低。

缺点:1)分配不均匀。首先本地浏览器缓存问题会使下次请求根本不会去查询域名解析的IP,其次最简单的随机分配算法,不能根据服务器的性能差异来为某台高配机器多分,低配机器少分。这使得低配机器已经高负荷运行了,而高配机器只有10%的资源消耗。2)不可靠。DNS轮询没有心跳检测,假设其中一台服务器宕机,域名供应商是不可知的。其次DNS生效时间过长,而且各级都有缓存。

应用:在可靠性要求不高的服务器集群可以使用DNS轮询

 

3、负载均衡之四\七层负载均衡设备

       在可靠性要求高的应用场景,硬件层面通常采用四\七层负载均衡设备。鼎鼎大名的就是F5负载均衡设备。

       在网络中,有一个叫做开放系统互联模型,也就是OSI七层模型。一到四层和数据传输相关,五到七层是和应用程序数据相关,数据一层层的传输。从第一层到第七层名称依次为:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。其中,我们熟知的IP协议位于第三层网络层,TCP协议位于第四层传输层,HTTP/FTP等协议位于最高的一层第七层应用层。

       常见的负载均衡交换机有F5 BIG-IPCisco CSS等,价格高昂。这些设备通常应用在第四层或者第七层。因此,被成为四\七层负载均衡设备。

 

4、负载均衡之软件层面

1)应用在第四层的负载均衡软件的代表是Linux Virtual Server,简称为LVSLVS根据IP和内容进行请求奋发。并且可以自动识别并屏蔽故障服务器,使得服务器集群更加高可用。

2)、应用在第七层的负载均衡软件的代表是基于HTTP反向代理的NginxHA Proxy等。Nginx的反向代理支持虚拟主机,可配置。能够按照轮询、IPURL等方式进行负载均衡,和LVS一样,也支持故障检查。

 

二、反向代理

       1、什么是反向代理

我们先来看看什么叫代理:客户端使用代理服务器,来访问一些在国家政策不允许访问的国外网站。基本流程是:客户端发送请求给代理服务器去,代理服务器去访问目标网站,然后代理服务器将目标网站返回的结果发送给客户端。

现在,我们来看看什么叫反向代理:网站内部使用代理服务器,来中转客户端发来的请求。基本流程是:客户端发送请求给目标网站,目标网站先经过反向代理服务器,然后将请求转发给内部网络的其他服务器来处理,最后将数据返回。

通俗的讲:代理,就是客户端使用的,对目标网站来说,代理服务器就是一个客户。而反向代理,就是目标网站使用的,对于用户来讲,反向代理服务器就是一个网站服务器。

定义:反向代理就是客户端发送请求给代理服务器,代理服务器再转发给内部的Web服务器集群,然后将Web服务器集群返回的数据发送给客户端。在客户端看来,代理服务器的表现就是一个真正的Web服务器。

反向代理服务器并不能处理静态网页或CGI程序,也不保存任何数据。网站数据都是保存在内部网络的Web服务器中。因此,如果暴露在公网的反向代理服务器被攻击,也不会使网站数据遭到破坏,这就增强了Web服务器的安全性。

 

三、Nginx的负载均衡和反向代理

       Nginx的反向代理通过设置Upstream指令。Upstream指令包含一组目标服务器IP、权重等信息。在Nginx的配置文件中server{}模块中的proxy_passfastcgi_pass指令来使用Upstream定义的一组服务器集群。

       值得一提的是,在PHP中,我们可以通过超全局变量$_SERVER[“REMOTE_ADDR”]来获取客户端的IP地址。但是,在反向代理环境中,我们的PHP程序获取到的时候反向代理服务器IP,而非真实客户端的IP。这时,通过在配置文件中添加proxy_set_header X-Forwarded-For $remote_addr; 可以使代理服务器收到的客户端IP传递给后端Web服务器。

       我们来看看如何配置Nginx的反向代理配置:

 

user www www;

worker_processes 4;

error_log /usr/local/nginx/logs/nginx_error.log crit;

pid  /usr/local/nginx/logs/nginx.pid;

worker_rlimit_nofile 51200;

events

{

    use epoll;

    worker_connections 51200;

}

 

http

{

    include mime.types;

    default_type application/octet-stream;

    charset UTF-8;

    server_names_hash_bucket_size 128;

    client_header_buffer_size 32k;

    large_client_header_buffers 4 32k;

 

    sendfile on;

    tcp_nopush on;

    keepalive_timeout 60;

    tcp_nodelay on;

 

    #允许客户端请求的最大字节

    client_max_body_size 50m;

    #缓冲区最大字节

    client_body_buffer_size 256k;

    #代理服务器链接后端服务器的超时时间

    proxy_connect_timeout 30;

    #代理服务器等待后端服务器响应的超时时间

    proxy_read_timeout 60;

    #后端服务器返回数据给代理服务器的最大传输时间

    proxy_send_timeout 30;

    #代理服务器缓冲区大小,客户端的头信息会保存在这里

    proxy_buffer_size 64k;

    #代理服务器有几个缓冲区,最大是多大

    proxy_buffers 4 64k;

    #代理服务器烦方式可以申请更大的缓冲区,Nginx官方推荐为*2即可

    proxy_busy_buffers_size 128k;

    #代理服务器临时文件大小

    proxy_temp_file_write_size 256k;

 

    #设置服务器集群池,每台服务器的权重等信息,www_server_pool是这一组服务器的名字,可以自行修改.后续将配置www_server_pool服务器集群用来访问www.lanecn.com

    upstream www_server_pool

    {

        server 192.168.1.100:80 weight=1 max_fails=2 fail_timeout=30s;

        server 192.168.1.101:80 weight=2 max_fails=2 fail_timeout=30s;

        server 192.168.1.102:80 weight=1 max_fails=2 fail_timeout=30s;

    }

 

    #设置服务器集群池,每台服务器的权重等信息,lanewechat_server_pool是这一组服务器的名字,可以自行修改.后续将配置lanewechat_server_pool服务器集群用来访问lanewechat.lanecn.com

    upstream lanewechat_server_pool

    {

        server 192.168.1.110:80 weight=3 max_fails=2 fail_timeout=30s;

        server 192.168.1.111:80 weight=1 max_fails=2 fail_timeout=30s;

        server 192.168.1.112:80 weight=2 max_fails=2 fail_timeout=30s;

    }

 

    #设置第一个虚拟主机,域名为博客主站www.lanecn.com.使用www_server_pool这一组服务器集群.

    server

    {

        listen 80;

        server_name www.lanecn.com;

        access_log /usr/local/nginx/logs/www.lanecn.com_access.log;

 

        location /

        {

            #如果www_server_pool这个服务器集群中的某台服务器返回超时或者502等错误,则自动转发到集群中的其他服务器.

            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

            proxy_pass http://www.lanecn.com;

            proxy_max_temp_file_size 128m;

            proxy_set_header X-Forwarded-For $remote_addr;

            proxy_set_header Host www.lanecn.com;

        }

    }

 

    #设置第二个虚拟主机,域名为LaneWeChat项目站lanewechat.lanecn.com.使用lanewechat_server_pool这一组服务器集群.

    server

    {

        listen 80;

        server_name lanewechat.lanecn.com;

        access_log /usr/local/nginx/logs/lanewechat.lanecn.com_access.log;

 

        location /

        {

            #如果lanewechat_server_pool这个服务器集群中的某台服务器返回超时或者502等错误,则自动转发到集群中的其他服务器.

            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

            proxy_pass http://lanewechat.lanecn.com;

            proxy_max_temp_file_size 128m;

            proxy_set_header X-Forwarded-For $remote_addr;

            proxy_set_header Host lanewechat.lanecn.com;

        }

    }

}

标签: Nginx, Nginx配置, 负载均衡, 反向代理

已有 2 条评论

  1. zhuli

    proxy_pass 填写的不应该是群集的名称吗?为什么你这里写的是域名呢?

    1. Lane

      proxy_pass是后端程序的地址

添加新评论