Nginx配置负载均衡
一、负载均衡简介
有时候,我们的后端工程压力太大,可能需要将后端工程部署在多台服务器上,此时就需要使用负载均衡了。
负载均衡目的:提升吞吐率, 提升请求性能, 提⾼容错率。
Nginx 实现负载均衡用到了 proxy_pass 代理模块核心配置, 将客户端请求代理转发至一组 upstream 虚拟服务池。nginx 的负载均衡功能依赖于 ngx_http_upstream_module模块。upstream 模块应该放于http{}标签内。
模块写法如下:
upstream backend {
server backend1.example.com;
server backend2.example.com:8080;
server 127.0.0.1:8080;
}
然后在location处使用如下写法:
location / {
proxy_pass http://backend;
}
以上写法的意思就是,按时间顺序依次将请求分配到各个后台服务器(upstream中配置的server)。 以下是一份简略的nginx配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream backend {
server backend1.example.com;
server backend2.example.com:8080;
server 127.0.0.1:8080;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
o try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location ^~ /api/ {
proxy_pass http://backend/;
}
}
}
二、简单示例
以我的blog为例,在本地运行一台后端服务,服务器上的保持原样。先将前端项目部署在nginx上,再使用nginx配置简单负载均衡示例。
upstream配置:
upstream backend{
server 127.0.0.1:8080;
server www.ysongblog.cn:8080;
}
server配置:
server {
listen 80;
server_name 127.0.0.1;
location / {
root /usr/local/vue/blog;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location ^~ /api/ {
proxy_pass http://backend/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
以上配置的意思为:
这里的^~ /api/表示匹配后端uri请求,当用户请求后端接口时,按时间顺序依次将请求分配到各个后台服务器(也就是upstream中配置的服务器。
配置完成后reload一下,查看效果。
为了展示效果我将其中一台服务器的文章删掉一篇,按照以上配置的结果应该为,访问blog主页,每次刷新页面会请求不同的服务器,其中一台少一篇文章。
三、nginx提供的几种不同的负载均衡算法
(1)round robin 轮询 (默认) 按时间顺序依次将请求分配到各个后台服务器中,挂掉的服务器自动从列表中剔除
upstream bakend {
server 192.168.0.1 down;
server 192.168.0.2;
}
(2)weight 轮询权重 weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下,或在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
upstream bakend {
server 192.168.0.1 weight=20;
server 192.168.0.2 weight=10;
}
(3)ip_hash:每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。
upstream bakend {
ip_hash;
server 192.168.0.1:88;
server 192.168.0.2:80;
}
(4)url_hash:按访问的URL的哈希结果来分配请求,使每个URL定向到同一台后端服务器,可以进一步提高后端服务器缓存的效率。Nginx本身不支持url_hash,需要安装Nginx的hash软件包。
upstream backend {
server 192.168.0.1:88; //使用hash语句时,不能在使用weight等其他参数
server 192.168.0.2:80;
hash $request_uri;
hash_method crc32; //使用hash算法
}
(5)fair算法:可以根据页面大小和加载时间长短智能地进行负载均衡,根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持fair,要安装upstream_fair模块才能使用。
upstream backend {
server 192.168.0.1:88;
server 192.168.0.2:80;
fair;
}