Nginx:upstearm模块
指尖二进制 • 1 年前 • 842 次点击 • NGINX
[TOC]
LB负载均衡集群分两类:LVS(四层)和nginx或haproxy(七层)
客户端通过访问分发器的VIP来访问网站
现在应用更复杂,比如现在网站页面有: .php .html .png .jpeg .jsp 等, 有动态页面有静态页面。静态页面一般是不变的,想访问更快些,前面学习过SQUID。
但是前面的LVS是四层的。基于IP的。现在需要在应用层基于不同的应用进行分发。
七层LB,Nginx/Haproxy都可以支持7层LB
现在实现以下功能,拓扑图:
工作中,希望处理图片是一个后端realserve,处理静态页面是一个realserver,处理动态页面时一个realserver。
Nginx upstream 负载的5种方式
1):轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2):weight:指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
3):ip_hash:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
4):fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5):url_hash(第三方)url哈西:按访问url的hash结果来分配请求,使同样的url定向到同一个后端服务器,后端服务器为缓存时比较有效
实验:
安装nginx
[root@lb ~]# yum install nginx-1.8.0-1.el7.ngx.x86_64.rpm
主配置文件,不用动
[root@lb ~]# vim /etc/nginx/nginx.conf
配置nginx成为分发器,修改default配置文件
[root@lb ~]# cat /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
# 配置转发规则 proxy_pass
if ($request_uri ~* \.html$){
proxy_pass http://htmlservers;
}
if ($request_uri ~* \.php$){
proxy_pass http://phpservers;
}
proxy_pass http://picservers;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# 定义后端设备的 IP 端口
upstream htmlservers {
server 10.0.0.100:80;
server 10.0.0.101:80;
}
upstream phpservers{
server 10.0.0.100:80;
server 10.0.0.101:80;
}
upstream picservers {
server 10.0.0.100:80;
server 10.0.0.101:80;
}
nginx lb 如果有下面的内容,把以下内容注释掉,否则php文件直接在nginx服务器上解析了,不再解析给后端服务器:
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
[root@lb ~]# systemctl start nginx
配置后端服务器
[root@realserver01 ~]# yum install httpd php -y
[root@realserver01 ~]# echo 10.0.0.100 > /var/www/html/index.html
[root@realserver01 ~]# vim /var/www/html/test.php
10.0.0.100-php
<?php
phpinfo();
?>
[root@realserver02 ~]# yum install httpd php -y
[root@realserver02 ~]# echo 10.0.0.101 > /var/www/html/index.html
[root@realserver02 ~]# vim /var/www/html/test.php
10.0.0.101-php
<?php
phpinfo();
?>
生成图片文件:
上传如下图片,到realserver01网站/var/www/html/目录下
生成图片文件:
上传如下图片,到realserver02网站/var/www/html/目录下
浏览器访问
http://10.0.0.11
http://10.0.0.11/test.php
http://10.0.0.11/test.png
测试自动剔除坏的节点:
[root@realserver02 ~]# systemctl stop httpd
[root@client ~]# elinks 10.0.0.11 --dump
10.0.0.101
[root@client ~]# elinks 10.0.0.11 --dump
10.0.0.101
[root@client ~]# elinks 10.0.0.11 --dump
10.0.0.101
[root@realserver02 ~]# systemctl start httpd
[root@client ~]# elinks 10.0.0.11 --dump
10.0.0.101
[root@client ~]# elinks 10.0.0.11 --dump
10.0.0.100
[root@client ~]# elinks 10.0.0.11 --dump
10.0.0.101
[root@client ~]# elinks 10.0.0.11 --dump
10.0.0.100
总结:
Nginx负载的5种策略设置方法:
1:轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
server 10.0.0.100;
server 10.0.0.101;
}
2:指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
server 10.0.0.100 weight=1;
server 10.0.0.101 weight=2;
}
3:IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 10.0.0.100:80;
server 10.0.0.101:80;
}
4:fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}
5:url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
upstream支持的状态参数
1:down 表示单前的server暂时不参与负载
2:weight 权重,默认为1。 weight越大,负载的权重就越大。
3:max_fails 允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4:fail_timeout max_fails次失败后,暂停的时间。
5:backup 备用服务器, 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻
负载均衡实例:
upstream server {
#ip_hash;
server 192.168.43.50:80;
server 192.168.43.73:80 weight=100 down;
server 192.168.43.74:80 weight=100;
server 192.168.43.75:80 weight=100 backup;
server 192.168.43.76:80 weight=100 max_fails=3 fail_timeout=30s;
}
说明:
(1)down表示当前server暂时不参与负载
(2)weight默认为1,weight越大,负载的权重就越大
(3)backup其他所有的非backup机器down或者忙的时候,请求backup服务器。所以这台压力会最轻
(4)上例中192.168.43.76:80设置最大失败次数为3,也就是最多进行3次尝试,且超时时间为30秒。max_fails的默认值为1, fail_timeout的默认值时10s。
注意:当upstream中只有一个server时,max_fails 和 fail_timeout 参数可能不会起作用。
weight\backup 不能和 ip_hash 关键字一起使用。
最后在需要使用负载均衡的server字段中增加proxy_pass http://server;
数据包走向:
1:用户发起请求:
2:通过反向代理找后面的服务器要数据------>upstream(声明(realserver)以及分发的算法)
nginx找到具体某台主机,把请求交给后面(realserver),(realserver)处理完成之后在响应给nginx,nginx在响应给客户端,整个过程中nginx就充当代理的角色。
再说一遍:客户端去找nginx要数据,nginx通过upstream找(realserver),(realserver)将请求处理完成之后交给nginx,nginx在返回给客户端。
总结,扩展:
如有tomcat ,apache,squid 配置为如下:
[root@lb ~]# vim /etc/nginx/conf.d/default.conf #在最后添加以下内容。 定义服务器组
upstream tomcat_servers {
server 192.168.1.2:8080;
server 192.168.1.1:8080;
server 192.168.1.11:8080;
}
upstream apache_servers {
server 192.168.1.5:80;
server 192.168.1.177:80;
server 192.168.1.15:80;
}
upstream squid_servers {
server 192.168.1.26:3128;
server 192.168.1.55:3128;
server 192.168.1.18:3128;
}