Nginx负载均衡详解
1. 负载均衡简介
负载均衡是一项基本的网络服务,主要为了解决业务并发压力,增强网络处理能力,减轻单个设备的资源压力,提供整体服务的性能。
Nginx使用反向代理来实现负载均衡,用到了proxy_pass代理模块,将客户端的请求转发到一组虚拟的服务资源池中。
Nginx负载均衡与反向代理主要的区别是,反向代理是将请求转发到指定的服务中去处理请求;负载均衡是将请求转发到一组服务资源池中,通过某种策略,将请求固定到某个服务中去处理。
2. Nginx负载均衡配置状态
状态 | 概述 |
---|---|
down | 当前的server暂不参与负载均衡 |
backup | 预留的备份服务器,当其他服务器都down机或不可使用时,启用备份服务器,因此此服务器压力是最小的 |
max_fails | 允许请求失败的次数;在fail_timeout时间内,超过max_fail次数,将该服务器标记为不可用,在下一个fail_timeout周期内,再次检测服务器,若服务器可用,就标记为可用。 |
max_timeout | 服务器检测时间,max_fails设置后,必须设置fail_timeout值 |
max_conns | 限制最大的连接数,用于服务器硬件配置不同的情况下 |
upstream server {
server IP:8081 down;
server IP:8082 backup;
server IP:8083 max_fails=1 fail_timeout=10s;
}
3. Nginx负载均衡调度策略
调度算法 | 概述 |
---|---|
轮询 | 逐一轮询,默认方式 |
加权(weight) | 加权轮询,weight越大,分配的几率越高 |
ip_hash | 安装访问IP的hash结果分配,会将来自同一个IP的请求访问固定到一个后台服务器中,解决session共享问题 |
url_hash (第三方) | 安装访问的URl的hash结果分配 |
least_conn (第三方) | 最少连接数,那个服务器的连接数越小,分配的几率越大 |
hash关键值 (第三方) | hash自定义的key |
#加权轮询
upstream server {
server IP:8081 weight = 10;
server IP:8082 weight = 20;
server IP:8083 weight = 30;
}
#hash 关键字
upstream node {
hash $request_uri;
server 你的IP:8081;
server 你的IP:8082;
server 你的IP:8083;
}
4. Nginx负载均衡示例
1. nginx.conf配置文件
#user node1;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
#default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
# 在vhosts目录中创建upstream.conf、one_server.conf、two_server.conf、three_server.conf4个配置文件。
include vhosts/*.conf;
}
2. upstream.conf配置文件
# 加权轮询
upstream serverPool {
server one_server:8881 max_fails=1 fail_timeout=10s weight=1;
server two_server:8882 max_fails=1 fail_timeout=10s weight=1;
server three_server:8883 max_fails=1 fail_timeout=10s weight=1;
}
server {
listen 8088;
charset utf-8;
location / {
root /home/node1/nginx/html;
index index.html;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://serverPool; #请求转发到服务池
}
}
3. one_server.conf配置文件
server {
listen 8881;
server_name one_server;
location /server {
echo "我是服务1,很高兴为您服务";
}
}
4. two_server.conf配置文件
server {
listen 8882;
server_name two_server;
location /server {
echo "我是服务2,很高兴为您服务";
}
}
5. three_server.conf配置文件
server {
listen 8883;
server_name three_server;
location /server {
echo "我是服务3,很高兴为您服务";
}
}
6. 配置hosts
vi /etc/hosts
127.0.0.1 one_server
127.0.0.1 two_server
127.0.0.1 three_server
7. 测试结果
备 注 : n g i n x 请 配 置 e c h o − n g i n x − m o d u l e 模 块 , 配 置 步 骤 请 查 看 该 博 主 的 博 客 : \color{red}{备注: nginx请配置echo-nginx-module模块,配置步骤请查看该博主的博客:} 备注:nginx请配置echo−nginx−module模块,配置步骤请查看该博主的博客:地址