nginx调度算法解析
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
2、weight(轮询权值)
weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
注意:此算法为常用的算法
3、ip_hash
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。
4、fair
比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块
5、url_hash
按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。
实验环境说明:
nginx/1.13.3 centos7-3.10.0-693.11.1.el7
负载均衡服务器lb01:192.168.199.244
节点服务器web01:192.168.100.238
节点服务器web02:192.168.100.220
节点服务器web03:192.168.100.221
一、负载服务器配置
1.nginx.conf
user nginx;
worker_processes 1;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
upstream default_pools { 负载均衡代理池01
server 192.168.100.238:80 weight=1;
}
upstream static_pools { 负载均衡代理池02
server 192.168.100.220:80 weight=1;
}
upstream upload_pools { 负载均衡代理池03
server 192.168.100.221:80 weight=1;
}
server {
autoindex on;
server_name www.chenqj.com;
location / {
proxy_pass http://default_pools;
}
location /static/ {
proxy_pass http://static_pools;
}
location /upload/ {
proxy_pass http://upload_pools;
}
}
}
2.hosts解析
192.168.199.244 www.chenqj.com
二、web01
user nginx;
worker_processes 1;
pid /run/nginx.pid;
events {
worker_connections 768;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name localhost;
root /usr/share/nginx/www;
index proxy.html;
}
}
在web01的站点目录/usr/share/nginx/www下新增proxy.html文件
proxy.hmtl内容如下:
192.168.100.238.default.html
三、web02
user nginx;
worker_processes 1;
pid /run/nginx.pid;
events {
worker_connections 768;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name localhost;
root /usr/share/nginx/www;
location /static/ {
index proxy.html;
}
}
}
在web01的站点目录/usr/share/nginx/www下新增static目录,并在该目录下新增proxy.html文件
proxy.hmtl内容如下:
193.192.168.100.220-static.html
四、web03
user nginx;
worker_processes 1;
pid /run/nginx.pid;
events {
worker_connections 768;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name localhost;
root /usr/share/nginx/www;
location /upload/ {
index proxy.html;
}
}
}
在web01的站点目录/usr/share/nginx/www下新增upload目录,并在该目录下新增proxy.html文件
proxy.hmtl内容如下:
192.168.100.221.upload.html
五、实验结果
192.168.199.244下执行
curl www.chenqj.com
192.168.100.238.default.html
curl www.chenqj.com/upload/
192.168.100.221.upload.html
curl www.chenqj.com/static/
192.168.100.220-static.html
注意点
web节点在收到负载均衡服务器的请求时,会把节点下的第一个虚拟主机发给了反向代理,解决这个问题的办法就是在负载均衡服务器server标签内引用如下模块
proxy_set_header Host $host
日志格式中头部为负载均衡服务器的IP,想要设置为真实用户的IP,需要再负载均衡服务器server标签内引用如下模块,同时,节点服务器下的日志格式也要加入该行
proxy_set_header X-Forwarded-For $remote_addr
其他种类负载均衡
本文中是根据URL目录的内容来实现转发;
还有其他的,例如根据用户设备的种类来实现代理转发,这里可以引用http_user_agent模块来实现,这里就不举例说明了