Nginx系列二:负载均衡与反向代理
Posted iitren
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx系列二:负载均衡与反向代理相关的知识,希望对你有一定的参考价值。
2月24日 在“IT人”的微信大讲堂邀请到了资深phper为大家带来技术分享,小编马不停蹄为大家奉上了一手技术资源供大家参考,话不多说。请戳下文~
一、负载均衡
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定义的一组服务器集群。
我们来看看如何配置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系列二:负载均衡与反向代理的主要内容,如果未能解决你的问题,请参考以下文章