负载均衡可以将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,从而协同完成工作任务。
本文介绍使用Nginx配置简单的静态文件镜像及负载均衡。
1、服务器配置
假设的服务器配置如下:一台面向用户的服务器 192.168.1.8:80; 存放资源的源服务器:192.168.1.10:80;外加两台备份的镜像服务器:192.168.1.11:80,192.168.1.12:80。
2、转发服务器设置
在面向用户的服务器 192.168.1.8:80 上修改Nginx设置,实现请求代理转发:
# 分发节点列表
upstream mirror_mode {
ip_hash; #开启ip_hash时相同IP的请求将被分配给同一个服务器
server 192.168.1.11:80 weight=1 max_fails=5 fail_timeout=5s;
server 192.168.1.12:80 weight=1 max_fails=5 fail_timeout=5s;
server 192.168.1.10:80 weight=1 backup;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://mirror_mode;
}
}
参数说明:
upstream:指令定义了一组http服务器,在接收到用户请求时,nginx 将根据配置的规则在服务器组中选择服务器进行请求响应。
server:可设置的参数有:
weight:服务器的权重,默认值为1,请求按照权重比例分配,权重越大,分配的请求数量越多。
max_fails:请求最大失败次数,默认为1,如果设置为0,表示禁用该设置。
fail_timeout:统计请求失败次数的时间段范围。 上例中 5s 内如果请求失败的次数超过5次,则对应server在接下来的5s内将不会分配请求,5s后重新统计失败次数。
down:标记服务器不可用
backup:当 upstream 组内所有的服务器都不可用时,将请求分配给标记为backup的服务器。
需要注意的是 代理路径: proxy_pass http://mirror_mode; 此处的 mirror_mode 必须与 upstream 指令后设置的名称保持一致。
3、镜像服务器设置
在镜像服务器上修改Nginx设置,使用proxy_store指定实现镜像备份:
server {
listen 80;
server_name localhost;
location / {
expires 30s;
proxy_set_header Host $http_host;
root /var/www/mysite;
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path /var/www/mysite;
if ( !-e $request_filename) {
proxy_pass 192.168.1.10:80;
}
}
}
参数说明:
expires:http响应头过期时间,供客户浏览器使用
proxy_store:是否在本地磁盘保存来自被代理服务器的响应数据。
root:指定请求查找文件的根目录。
proxy_store_access:设置新创建的文件和目录的访问权限
proxy_temp_path:指定保存被代理服务器响应数据的根目录,作为镜像服务器,proxy_temp_path 应与 root 设置相同的路径。
最后的if判断是表示请求的路径文件如果在本地不存在就去被代理的服务器上获取。
按照以上配置就能实现镜像服务器的功能,但是存在的问题是这种配置对于同样路径的文件,镜像服务器不能同步源服务器的修改,也没有过期自动清理的功能。适合针对静态文件不会发生修改的场景,像npm的镜像服务器就很适合使用这种方式。
针对文件版本的动态变化,可以考虑使用nginx的 proxy_cache 指令配置缓存服务器。
4、缓存服务器设置
proxy_cache_path /var/www/mysite keys_zone=cache_my_site:1024m inactive=1d max_size=2048m;
server {
listen 80;
server_name localhost;
location / {
proxy_cache cache_my_site;
proxy_cache_key $uri$is_args$args;
proxy_cache_valid any 1d;
proxy_pass http://192.168.1.10:80;
}
}
参数说明
proxy_cache_path:必须位于nginx配置文件的http节点中,用于指定缓存数据的路径。path=设置缓存数据存放的根路径;keys_zone=name:size1设置存放缓存索引的缓存区域的名称和大小;inactive=1d当硬盘上的缓存数据在设定的时间内没有被访问时将被删除,下次客户端访问该数据时重新获取缓存;max_size=2048m设置硬盘中缓存数据的大小限制。
proxy_cache:指定内存区的名称,必须与 proxy_cache_path 中设置的 keys_zone 保持一致。
proxy_cache_key:缓存文件时保存的缓存键key的组成方式, $uri$is_args$args表示将请求的url和参数组合在一起再进行md5,生成索引key。
proxy_cache_valid:针对不同的响应状态码设置不同的过期时间 any 表示未指定的缺省的状态码。
缓存服务器可以通过设置 inactive 和 proxy_cache_valid 自动的删除缓存文件,但是 proxy_cache 缓存的文件是以md5作为key值保存的加密文件,不能与源服务器保持一致的文件目录结构和文件名。
实际项目中可根据需要选择使用proxy_store还是proxy_cache。
需要说明的是,使用上诉方式配置负载均衡只能分担单个服务器的运算压力,并不能扩展服务器的带宽,所有的传输数据都必须经过转发服务器。想要突破带宽的限制只有通过配置DNS服务实现。