使用nginx做负载均衡的模块解读
本文主要介绍了使用nginx进行负载均衡的两种方法,通过示例代码进行了非常详细的介绍,对大家的学习或工作有一定的参考价值。有需要的朋友下面和边肖一起学习。
使用nginx实现负载平衡的两个模块:
上游定义了负载节点池。
位置模块执行URL匹配。
代理模块向上游定义的节点池发送请求。
上游模块的解释
NGX的负载均衡功能依赖于ngx_http_upstream_module模块,支持的代理模式有proxy_pass(一般用于反向代理)、fastcgi_pass(一般用于与动态程序交互)、memcached_pass、proxy_next_upstream、fastcgi_next_pass、memcached_next_pass。
上游模块应该放在http{}标记中。
模块编写:
upstreambackend{
ip_hash;
serverbackend1.example.comweight=5;
serverbackend2.example.com:8080;
serverbackup1.example.com:8080backup;
serverbackup2.example.com:8080backup;
}
示例1:
upstreamdynamic{
zoneupstream_dynamic64k;
serverbackend1.example.comweight=5;
serverbackend2.example.com:8080fail_timeout=5sslow_start=30s;
server192.0.2.1max_fails=3;
serverbackend3.example.comresolve;
serverbackup1.example.com:8080backup;
serverbackup2.example.com:8080backup;
}
语法解释:
nginx默认支持四种调度算法
轮询(rr),将每个请求按照时间顺序逐一分配给不同的后端服务器。如果后端服务器出现故障,故障系统会自动清除,这样用户的访问不会受到影响。
轮询权重),权重值越大,分配的访问概率越高,主要用于后端各服务器性能不均衡的情况。
Ip_hash,根据被访问Ip的哈希结果分配每个请求,这样从同一个IP到后端服务器的固定访问主要解决动态网站的会话共享问题。
Url_hash,根据被访问Url的哈希结果分发请求,是每个URL都被定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。nginx本身不支持。如果要使用需要安装nginx的hash软件包。
公平的说,这个算法可以根据页面大小和加载时间智能均衡负载,也就是说根据后端服务器的响应时间,优先考虑相应的短时间,默认不支持。如果要使用,需要安装upstream_fail模块。
Least_conn的链接数最少,在那台机器的连接数少的时候会分配。
服务器模块的写入
服务器IP计划状态
server指令指定后端服务器的IP地址和端口,还可以设置每个后端服务器在负载平衡调度中的状态。
Down表示当前服务器暂时不参与负载平衡。
backup预留的备份服务器只会在其他所有非备份服务器都出现故障或繁忙时请求备份机器,因为这个集群的压力最小。
Max_failures允许失败的请求数。默认值为1。当超过最大数量时,将返回由proxy_next_upstream模块定义的错误。0表示禁止失败的尝试。企业场景:2-3。JD.COM一次,蓝色洪水10次,而且是根据业务需求配置的。
Fail_timeout,max_failures之后暂停服务的时间。JD.COM是3s,蓝洪水是3s,根据业务需求配置。常规业务2-3秒是合理的。
例:如果max_failures是5,他会检测5次。如果五次都是502。然后根据fail_timeout的值,他会等待10秒才检测到。
如果服务器连接到域名,则需要在intranet中有一个DNS服务器,或者在负载平衡器的hosts文件中进行域名解析。服务器也可以直接连接到IP或IPplus端口。
长连接保持活动
upstreambackend{
serverbackend2.example.com:8080;
serverbackup1.example.com:8080backup;
keepalive100;
}
此指令配置每个工作进程可以缓存到上游服务器的最大空空闲连接数。
当超过此数量时,最近最少使用的连接将被关闭。keepalive指令不限制工作进程和上游服务器之间的总连接。
location/{
#支持keep-alive
proxy_http_version1.1;
proxy_set_headerConnection"";
proxy_passhttp://backup;
}
如果http/1.0需要配置发送“连接:保持活动”请求头。
不要忘记打开对上游服务器的长连接支持。
连接池的配置建议
总连接数是“空空闲连接池”+“空闲连接池”的长连接总数。
首先,长连接配置并不限制工作进程可以打开的连接总数(超出部分视为短连接)。另外,连接池一定要根据场景合理设置。
空空闲连接池太小,连接不够。你需要不断地建立联系。
空空闲连接池太大,而且空空闲连接太多,还没用就超时了。
建议只对小消息打开长连接。
位置模块的解释
位置:根据说明设定URI。
基本语法:
Syntax:location[=|~|~*|^~]uri{...}
location@name{...}
Default:—
Context:server,location
=完全匹配。如果发现与=号匹配的内容,立即停止搜索并立即处理请求(最高优先级)。
~区分大小写
~*不区分大小写
~只匹配字符串,不匹配正则表达式。
@指定一个命名位置,它通常用于内部重新定义请求。位置@名称{…}
匹配有优先级,不是根据nginx的配置文件。
官方示例:
location=/{
[configurationA]
}
location/{
[configurationB]
}
location/documents/{
[configurationC]
}
location^~/images/{
[configurationD]
}
location~*\.(gif|jpg|jpeg)${
[configurationE]
}
结论:
/匹配a。
/index.html匹配b
/documents/document.html匹配c
/images/1.gif匹配d
/documents/1.jpg匹配e。
用于测试的示例:
location/{
return401;
}
location=/{
return402;
}
location/documents/{
return403;
}
location^~/images/{
return404;
}
location~*\.(gif|jpg|jpeg)${
return500;
}
测试结果(重点关注):
[root@lb01conf]#curl-I-s-o/dev/null-w"%{http_code}\n"http://10.0.0.7/
402
[root@lb01conf]#curl-I-s-o/dev/null-w"%{http_code}\n"http://10.0.0.7/index.html
401
[root@lb01conf]#curl-I-s-o/dev/null-w"%{http_code}\n"http://10.0.0.7/documents/document.html
403
[root@lb01conf]#curl-I-s-o/dev/null-w"%{http_code}\n"http://10.0.0.7/images/1.gif
404
[root@lb01conf]#curl-I-s-o/dev/null-w"%{http_code}\n"http://10.0.0.7/dddd/1.gif
500
摘要:
匹配优先级,=>:~(匹配固定字符串,忽略规律性)>:完全相等>:~*>空>;/。
尽量把“=”放在工作的第一位。
Proxy_Pass模块的解释
proxy_pass指令属于ngx_http_proxy_module模块,它可以将请求转发到另一个服务器。
写作:
proxy_passhttp://localhost:8000/uri/;
示例1:
upstreamblog_real_servers{
server10.0.0.9:80weight=5;
server10.0.0.10:80weight=10;
server10.0.0.19:82weight=15;
}
server{
listen80;
server_nameblog.etiantian.org;
location/{
proxy_passhttp://blog_real_servers;
proxy_set_headerhost$host;
}
}
Proxy_set_Header:当后端Web服务器上也配置了多个虚拟主机时,需要这个头来区分反向代理的主机名是哪个,proxy_set_headerhost$host。
proxy_set_Headerx-forwarded-for:如果后端Web服务器上的程序需要获取用户IP,就从这个头中获取。proxy_set_headerX-Forwarded-For$remote_addr;
配置后端服务器接收前端真实IP
配置如下:
log_formatcommonlog'$remote_addr-$remote_user[$time_local]"$request"'
'$status$body_bytes_sent"$http_referer"'
'"$http_user_agent""$http_x_forwarded_for"';
rs_apache节点的Httpd.conf配置
LogFormat""%{X-Forwarded-For}i"%l%u%t"%r"%>s%b"%{Referer}i""%{U
ser-Agent}i""combined修改日志记录
apache
LogFormat""%{X-Forwarded-For}i"%l%u%t"%r"%>s%b"common
与proxy_pass相关的优化参数
client_max_body_size10m允许客户端请求的单个文件的最大字节数。
客户端_正文_缓冲区_大小128k缓冲代理从客户端请求缓冲的最大字节数可以理解为在传输给用户之前保存在本地。
proxy_connect_timeout600与后端服务器连接超时_发起握手并等待响应超时。
proxy_read_timeout600成功连接后_等待后端服务器的响应时间_其实已经进入后端队列进行处理了。
proxy_send_timeout600后端服务器返回数据时间,即后端服务器必须在指定时间内传输完所有数据。
proxy_buffer_size8k代理缓冲区,这个缓冲区会保存用户的头信息供Nginx处理规则,一般只要设置保存头信息即可。
proxy_buffers432k和上面一样告诉Nginx保存单页使用的空的大小,假设平均页面大小在32k以下。
proxy_busy_buffers_size64k如果系统忙,可以申请更大的proxy_buffers官方推荐(proxy_buffers*2)。
proxy_max_temp_file_size1024m当proxy_buffers无法容纳后端服务器的响应内容时,它会将一部分保存到硬盘的临时文件中。该值用于设置最大临时文件大小,默认为1024M。与proxy_cache无关。大于此值,将从上游服务器返回。置0禁用。
代理_临时_文件_写入_大小64k缓存临时文件proxy_temp_path(可编译)的大小指定了要写入哪个目录。
运行状况检查
Nginx提供了health_check语句,提供加载时的健康检查机制(上游)(注意:该语句需要在位置上下文中设置)。
支持的参数有:
Interval=time:设置两次健康检查的间隔值,默认为5秒。
Fails=number:设置将服务器视为不健康的连续检查次数,默认情况下为1。
Passes=number:设置服务器被视为健康的连续检查次数,默认情况下为1。
Uri=Uri:定义健康检查的请求uri,默认为“/”。
Match=name:指定匹配配置块的名称,并使用它来测试响应是否通过健康测试。测试返回的默认状态代码是2xx和3xx。
下面是一个简单的设置,将使用默认值:
location/{
proxy_passhttp://backend;
health_check;
}
对于应用程序,我们可以定义一个专门用于健康检查的API:/API/health_check,只返回HTTP状态码200。并将两次检查之间的间隔值设置为1秒。因此,health_check语句的配置如下:
health_checkuri="/api/health_check"interval;
匹配方法
http{
server{
...
location/{
proxy_passhttp://backend;
health_checkmatch=welcome;
}
}
matchwelcome{
status200;
headerContent-Type=text/html;
body~"Welcometonginx!";
}
}
匹配示例
状态200;:状态等于200
地位!500;:状态不是500。
状态200204;:状态为200或204。
地位!301302;:状态不是301或302。
状态200-399;:状态介于200和399之间。
地位!400-599;:状态不在400和599之间。
状况301-303307;:状态为301、302、303或307。
标题Content-Type=text/html;“内容类型”的值是text/html。
标题内容-类型!=text/html;:“内容类型”不是文本/html。
表头连接~关闭;:“连接”包含关闭。
头部连接!~关闭;:“Connection”不包含close。
标题主机;:请求标头包含“主机”。
头球!x加速重定向;:请求标头不包含“X-Accel-Redirect”。
体~“欢迎来到nginx!”;:正文包含“欢迎使用nginx!”。
身体!~“欢迎来到nginx!”;:正文不包含“欢迎使用nginx!”。
nginx的完整实例
[root@lb01conf]#catnginx.conf
worker_processes1;
events{
worker_connections1024;
}
http{
includemime.types;
default_typeapplication/octet-stream;
sendfileon;
keepalive_timeout65;
#bloglbbyoldboyat201303
upstreamblog_real_servers{
server10.0.0.9:80weight=1max_fails=1fail_timeout=10s;
server10.0.0.10:80weight=1max_fails=2fail_timeout=20s;
}
server{
listen80;
server_nameblog.etiantian.org;
location/{
proxy_passhttp://blog_real_servers;
includeproxy.conf;
}
}
}
[root@lb01conf]#catproxy.conf
proxy_set_headerHost$host;
proxy_set_headerX-Forwarded-For$remote_addr;
proxy_connect_timeout90;
proxy_send_timeout90;
proxy_read_timeout90;
proxy_buffer_size4k;
proxy_buffers432k;
proxy_busy_buffers_size64k;proxy_temp_file_write_size64k;
扩展补充
只允许GET、HEAD、POST方法请求
##Onlyallowtheserequestmethods##
if($request_method!~^(GET|HEAD|POST)$){
return444;
}
实战
根据URI和位置,实现静态和动态分离。
最终实现:
/static/的URL可以访问10.0.0.9。
/dynamic/的URL转到10.0.0.10。
这些图片的静态文件到10.0.0.9。
/upload/go到10.0.0.10的URL。
[root@lb01conf]#catnginx.conf
worker_processes1;
events{
worker_connections1024;
}
http{
includemime.types;
default_typeapplication/octet-stream;
sendfileon;
keepalive_timeout65;
#bloglbbyoldboyat201303
upstreamstatic_pools{
server10.0.0.9:80;
}
upstreamdynamic_pools{
server10.0.0.10:80;
}
upstreamupload_pools{
server10.0.0.9:80;
}
server{
listen80;
server_nameblog.biglittleant.cn;
location/{
proxy_passhttp://static_pools;
includeproxy.conf;
}
location/static/{
proxy_passhttp://static_pools;
includeproxy.conf;
}
location~*\.(gif|jpg|jpeg)${
proxy_passhttp://static_pools;
includeproxy.conf;
}
location/dynamic/{
proxy_passhttp://dynamic_pools;
includeproxy.conf;
}
location/upload/{
proxy_passhttp://upload_pools;
includeproxy.conf;
}
}
}
让苹果手机和安卓手机访问不同的地址
server{
listen80;
server_nameblog.etiantian.org;
location/{
if($http_user_agent~*"android")
{
proxy_passhttp://android_pools;
}
if($http_user_agent~*"iphone")
{
proxy_passhttp://iphone_pools;
}
proxy_passhttp://pc_pools;
includeextra/proxy.conf;
}
access_logoff;
}
参考文件
Ngx-proxy_pass官网
关于使用nginx进行负载平衡的模块解释,本文到此结束。有关nginx负载平衡的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
评论列表(0条)