前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx系列二:负载均衡与反向代理

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

作者头像
猿哥
发布2020-02-26 14:44:41
9780
发布2020-02-26 14:44:41
举报

一、负载均衡

1、什么是负载均衡

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

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

2、负载均衡之DNS轮询

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

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

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

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

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

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

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

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

4、负载均衡之软件层面

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

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

二、反向代理

1、什么是反向代理

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

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

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

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

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

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

Nginx的反向代理通过设置Upstream指令。Upstream指令包含一组目标服务器IP、权重等信息。在Nginx的配置文件中server{}模块中的proxy_pass和fastcgi_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;

}

}

}

来源微信公众号:iitren

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHP技术大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档