要理解负载均衡,必须先搞清楚正向代理和反向代理\
注:
正向代理,代理的是用户。
反向代理,代理的是服务器。
一、什么是负载均衡
负载均衡是用反向代理的原理实现的,代理一台机器,叫做代理服务器,代理多台机器就叫做负载均衡。nginx通过proxy_pass_http 配置代理站点,upstream实现负载均衡
当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。
我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
二、负载均衡的几种常用方式(算法)
(1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
(2)、weight (权重)
指定轮询权重,weight和访问比率成正比,用于后端服务器性能不均的情况
(3)、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
(4)、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
(5)、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效
三、配置nginx负载均衡
在配置负载均衡前先介绍一个命令:dig 如果没有这个命令需要安装包:yum -y install bind-utils
dig是用来进行域名解析的,例如我解析,使用dig能够反馈更多的解析信息
[root@lnmp-server ~]# dig www.qq.com ; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> www.qq.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23121 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.qq.com. IN A ;; ANSWER SECTION: www.qq.com. 220 IN A 58.60.9.21 www.qq.com. 220 IN A 59.37.96.63 ;; Query time: 37 msec ;; SERVER: 114.114.114.114#53(114.114.114.114) ;; WHEN: 日 7月 08 20:50:20 CST 2018 ;; MSG SIZE rcvd: 71
现在我们开始配置负载均衡,新建一个虚拟主机配置文件:
[root@lnmp-server ~]# vim /usr/local/nginx/conf/vhost/ld.conf`
增加以下内容,我拿解析到:
upstream qq #upstream是一个模块,需要使用它来定义多个IP YY_com=名字可以任意修改 { ip_hash; #ip_hash是为了让同一个用户始终保持在同一个机器上 #定义两个服务器的ip,qq.com解析出来的ip server 58.60.9.21:80; server 59.37.96.63:80; } server { listen 80; #定义监听端口 server_name www.qq.com; #定义域名 location / { proxy_pass http://qq; #upstream的名称,这个名称代表着upstream里定义的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; } }
编辑完之后保存退出,先不要重新加载配置文件,先测试一下用本机ip去访问:
[root@lnmp-server vhost]# curl -x127.0.0.1:80 www.qq.com This is default server aaa
检测是否有错并重载
[root@lnmp-server ~]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@lnmp-server ~]# /usr/local/nginx/sbin/nginx -s reload
再用curl测试
[root@lnmp-server vhost]# curl -x127.0.0.1:80 www.qq.com 。。。 </script> <!-- ?1・?? ??--> <script> // ??・?