nginx是如何实现负载均衡的,nginx的upstream目前支持以下几种方式的分配:
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
2、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
3、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
一、准备环境如下:
1、我们配置四个nginx的虚拟主机,分别如下:
www.site.com 127.0.0.1:8081 127.0.0.1:8082 127.0.0.1:8083
site1.conf的配置如下:
server { #监听的端口号 listen 8081; #虚拟主机名 server_name 127.0.0.1; #编码 charset utf-8; #访问日志 access_log logs/site1.access.log combined; location / { #网站路径 root /data/wwwroot/site1; #默认首页文件 index index.html index.htm index.php; } #在http中加入fastcgi_intercept_errors on; #配置404信息 error_page 404 /404.html; #配置500信息 error_page 500 502 503 504 /50x.html; #缓存图片资源 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 15d; } #缓存js、css资源 location ~ .*\.(js|css)$ { expires 1d; } #对php的支持 location ~ \.php$ { root /data/wwwroot/site1; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
2、三个站点下分别创建index.html,方便查看访问了哪个虚拟主机
<!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title></title> </head> <body> 我是站点一 </body> </html>
二、配置好上述三台虚拟主机后,我们需要在nginx.conf的http{}节点中设置upstream
#注意这里的myserver,可自定义 upstream myserver { server 127.0.0.1:8081; server 127.0.0.1:8082; server 127.0.0.1:8083; }
三、在需要负载的虚拟主机配置文件中添加
proxy_pass http://myserver;
server { #监听的端口号 listen 80; #虚拟主机名 server_name www.site.com; location / { #注意这里的myserver要与你upstream中的命名一致 proxy_pass http://myserver; proxy_redirect off; #注意,如果是本地反向代理并且端口不区分时(比如:都是用的80端口) #需要把下面这行注释,不然会产生死循环 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; #后端服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
四、我们重启nginx,通过浏览器访问www.site.com。
我们刷新浏览器,可以看到,网站出现的内容,会随着你的刷新,轮询显示站点一,站点二,站点三。
五、upstream中的配置
upstream myserver { server 127.0.0.1:8081 weight=1; server 127.0.0.1:8082 weight=2; server 127.0.0.1:8083 weight=3; }
weight默认为1,weight越大,负载的权重就越大。
upstream myserver { server 127.0.0.1:8081 weight=1; server 127.0.0.1:8082 weight=1; server 127.0.0.1:8083 down; }
down表示当前的server暂时不参与负载
upstream myserver { server 127.0.0.1:8081 weight=1; server 127.0.0.1:8082 weight=1; server 127.0.0.1:8083 backup; }
upstream myserver { server 127.0.0.1:8081 weight=1; server 127.0.0.1:8082 weight=1; server 127.0.0.1:8083 max_fails=3 fail_timeout=30s; }
fail_timeout当max_fails 次失败后,暂停的时间。
版权声明:博主文章,可以不经博主允许随意转载,随意修改,知识是用来传播的。