随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx就是其中的一个,在linux下有Nginx、LVS、Haproxy等等服务可以提供负载均衡服务,而且Nginx提供了几种分配方式(策略),当然现在主流的公有云(Windows Azure)提供的服务在均衡分配方式基本上都类似于Nginx的轮询(round robin)分配方式和加权轮询(Weight round robin)分配方式,对于其他公有云产品没有具体试验过,所以我们今天主要介绍一下Nginx下的几种分配方式,具体见下:
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如:
1
2
3
4
<code>upstream server_pool{ </code>
<code>server 192.168.5.21 weight=10; </code>
<code>server 192.168.5.22 weight=10; </code>
<code>}</code>
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 例如:
5
<code>ip_hash; </code>
<code>server 192.168.5.21:80; </code>
<code>server 192.168.5.22:80; </code>
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
<code>fair; </code>
注意:整个分配方式是通过修改定义负载均衡的server配置中添加的。
我们今天主要介绍我个人认为使用最多的几种方式吧;前面四种。
我们后端使用两台Apache服务作为WEB服务,具体安装就不多介绍了。
192.168.5.21
<code>Yum </code><code>install</code> <code>httpd</code>
<a href="http://s3.51cto.com/wyfs02/M01/8C/49/wKiom1hojB_AqvmgAALl4sDDNxw999.png" target="_blank"></a>
查看httpd 版本
<code>rpm -qa | </code><code>grep</code> <code>httpd</code>
<a href="http://s3.51cto.com/wyfs02/M01/8C/45/wKioL1hojCHQEEpdAAASJYrQr6o885.png" target="_blank"></a>
接下来我们首先要为apache定义一个 默认的页面,方便区分;我们为了后面的数据统计所以页面内容显示的比较少
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<code>Vim </code><code>/var/www/httml/index</code><code>.html</code>
<code><</code><code>/html</code><code>></code>
<code><!DOCTYPE html></code>
<code><html></code>
<code><</code><code>head</code><code>></code>
<code><title>Welcome to Apache<</code><code>/title</code><code>></code>
<code><style></code>
<code>body {</code>
<code>35em;</code>
<code>margin: 0 auto;</code>
<code>font-family: Tahoma, Verdana, Arial, sans-serif;</code>
<code><</code><code>/style</code><code>></code>
<code><style </code><code>type</code><code>=</code><code>"text/css"</code><code>></code>
<code>h1{color:red}</code>
<code>h2{color:blue}</code>
<code>h3{color:green}</code>
<code>h4{color:yellow}</code>
<code><</code><code>/head</code><code>><body bgcolor=</code><code>'7D7DFF'</code><code>></code>
<code><h2>HostName:A-S ----->IP:192.168.5.21<</code><code>/h2</code><code>></code>
<code><</code><code>/body</code><code>></code>
保存退出,启动服务
<code>Systemctl start httpd</code>
<a href="http://s3.51cto.com/wyfs02/M00/8C/45/wKioL1hojCLDdm3pAABCQW-1KUk506.png" target="_blank"></a>
然后添加默认的防火墙端口8o
<code>Firewall-cmd --zone=public --add-port=</code><code>'80/tcp'</code> <code>--permanent</code>
<code>或者vim </code><code>/etc/firewalld/zone/public</code><code>.xml</code>
<code>添加一下格式</code>
<code><port portocal=</code><code>'tcp'</code> <code>port=</code><code>'80'</code><code>></code>
<a href="http://s3.51cto.com/wyfs02/M01/8C/45/wKioL1hojCPDfxRDAAAtyEOOolM124.png" target="_blank"></a>
我们测试访问
<a href="http://s3.51cto.com/wyfs02/M02/8C/49/wKiom1hojCbhvyCUAAEVkfD7x7U486.png" target="_blank"></a>
我们准备第二台WEB服务(192.168.5.22)我们按照第一台的方式进行配置,再次就跳过了。
第二台主机的配置:192.168.5.22 主机名 B-S
安装好httpd后,我们将a-s上的index拷贝到b-s服务器上
<code>scp</code> <code>index.html [email protected]:</code><code>/var/www/html/</code>
然后修改index.html文件
<a href="http://s3.51cto.com/wyfs02/M00/8C/49/wKiom1hojCej9n38AABKdUlCaSA657.png" target="_blank"></a>
我们为了后面的测试,我们将两台服务器的显示内容修改一下,为了通过服务进行批量测试。
将两台Apache WEB服务的index.html文件只显示服务器的名称及IP地址。
<a href="http://s3.51cto.com/wyfs02/M02/8C/45/wKioL1hojCiAwQf1AABsC7P2D6Y696.png" target="_blank"></a>
接下来我们就部署nginx,在Centos7上yum安装需要定义yum源
<code>cd</code> <code>/etc/yum</code><code>.repo</code>
<code>vim epel.repo</code>
<code>添加以下内容</code>
<code>[epel] </code>
<code>name=aliyun epel </code>
<code>baseurl=http:</code><code>//mirrors</code><code>.aliyun.com</code><code>/epel/7Server/x86_64/</code>
<code>gpgcheck=0</code>
<a href="http://s3.51cto.com/wyfs02/M00/8C/45/wKioL1hojCuhy85tAAAYeR5lMkM821.png" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/8C/49/wKiom1hojCyzxHcHAACGN72uhdc860.png" target="_blank"></a>
<code>Yum </code><code>install</code> <code>nginx</code>
<code>nginx 192.168.5.20</code>
<a href="http://s3.51cto.com/wyfs02/M01/8C/45/wKioL1hojC3T-GMCAACFU_6hASw144.png" target="_blank"></a>
启动服务
<code>systemctl start nginx</code>
<a href="http://s3.51cto.com/wyfs02/M02/8C/45/wKioL1hojDHRtisYAACWo3cRR_g935.png" target="_blank"></a>
我们接下来需要编辑nginx的默认配置文件来修改负载的配置
我们首先查看默认的配置文件
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<code>#user nobody;</code>
<code>worker_processes 1;</code>
<code>#error_log logs/error.log;</code>
<code>#error_log logs/error.log notice;</code>
<code>#error_log logs/error.log info;</code>
<code>#pid logs/nginx.pid;</code>
<code>events {</code>
<code> </code><code>worker_connections 1024;</code>
<code>http {</code>
<code> </code><code>include mime.types;</code>
<code> </code><code>default_type application</code><code>/octet-stream</code><code>;</code>
<code> </code><code>#log_format main '$remote_addr - $remote_user [$time_local] "$request" '</code>
<code> </code><code># '$status $body_bytes_sent "$http_referer" '</code>
<code> </code><code># '"$http_user_agent" "$http_x_forwarded_for"';</code>
<code> </code><code>#access_log logs/access.log main;</code>
<code> </code><code>sendfile on;</code>
<code> </code><code>#tcp_nopush on;</code>
<code> </code><code>#keepalive_timeout 0;</code>
<code> </code><code>keepalive_timeout 65;</code>
<code> </code><code>#gzip on;</code>
<code> </code><code>server {</code>
<code> </code><code>listen 80;</code>
<code> </code><code>server_name localhost;</code>
<code> </code><code>#charset koi8-r;</code>
<code> </code><code>#access_log logs/host.access.log main;</code>
<code> </code><code>location / {</code>
<code> </code><code>root html;</code>
<code> </code><code>index index.html index.htm;</code>
<code> </code><code>}</code>
<code> </code><code>#error_page 404 /404.html;</code>
<code> </code><code># redirect server error pages to the static page /50x.html</code>
<code> </code><code>#</code>
<code> </code><code>error_page 500 502 503 504 </code><code>/50x</code><code>.html;</code>
<code> </code><code>location = </code><code>/50x</code><code>.html {</code>
<code> </code><code># proxy the PHP scripts to Apache listening on 127.0.0.1:80</code>
<code> </code><code>#location ~ \.php$ {</code>
<code> </code><code># proxy_pass http://127.0.0.1;</code>
<code> </code><code>#}</code>
<code> </code><code># pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000</code>
<code> </code><code># root html;</code>
<code> </code><code># fastcgi_pass 127.0.0.1:9000;</code>
<code> </code><code># fastcgi_index index.php;</code>
<code> </code><code># fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;</code>
<code> </code><code># include fastcgi_params;</code>
<code> </code><code># deny access to .htaccess files, if Apache's document root</code>
<code> </code><code># concurs with nginx's one</code>
<code> </code><code>#location ~ /\.ht {</code>
<code> </code><code># deny all;</code>
<code> </code><code>}</code>
<code> </code><code># another virtual host using mix of IP-, name-, and port-based configuration</code>
<code> </code><code>#</code>
<code> </code><code>#server {</code>
<code> </code><code># listen 8000;</code>
<code> </code><code># listen somename:8080;</code>
<code> </code><code># server_name somename alias another.alias;</code>
<code> </code><code># location / {</code>
<code> </code><code># root html;</code>
<code> </code><code># index index.html index.htm;</code>
<code> </code><code># }</code>
<code> </code><code>#}</code>
<code> </code><code># HTTPS server</code>
<code> </code><code># listen 443 ssl;</code>
<code> </code><code># server_name localhost;</code>
<code> </code><code># ssl_certificate cert.pem;</code>
<code> </code><code># ssl_certificate_key cert.key;</code>
<code> </code><code># ssl_session_cache shared:SSL:1m;</code>
<code> </code><code># ssl_session_timeout 5m;</code>
<code> </code><code># ssl_ciphers HIGH:!aNULL:!MD5;</code>
<code> </code><code># ssl_prefer_server_ciphers on;</code>
然后我们需要修改默认配置
<code>upstream nginx.ixmsoft.com {</code>
<code> </code><code>server 192.168.5.21:80;</code>
<code> </code><code>server 192.168.5.22:80;</code>
<a href="http://s3.51cto.com/wyfs02/M00/8C/45/wKioL1hojDKgU6gKAAATVzjwqKA256.png" target="_blank"></a>
我们首先配置轮询的方式
<code># For more information on configuration, see: </code>
<code># * Official English Documentation: http://nginx.org/en/docs/ </code>
<code># * Official Russian Documentation: http://nginx.org/ru/docs/</code>
<code>user nginx; </code>
<code>worker_processes auto; </code>
<code>error_log </code><code>/var/log/nginx/error</code><code>.log; </code>
<code>pid </code><code>/run/nginx</code><code>.pid;</code>
<code># Load dynamic modules. See /usr/share/nginx/README.dynamic. </code>
<code>include </code><code>/usr/share/nginx/modules/</code><code>*.conf;</code>
<code>events { </code>
<code> </code><code>worker_connections 1024; </code>
<code>http { </code>
<code> </code><code>log_format main </code><code>'$remote_addr - $remote_user [$time_local] "$request" '</code>
<code> </code><code>'$status $body_bytes_sent "$http_referer" '</code>
<code> </code><code>'"$http_user_agent" "$http_x_forwarded_for"'</code><code>;</code>
<code> </code><code>access_log </code><code>/var/log/nginx/access</code><code>.log main;</code>
<code> </code><code>sendfile on; </code>
<code> </code><code>tcp_nopush on; </code>
<code> </code><code>tcp_nodelay on; </code>
<code> </code><code>keepalive_timeout 65; </code>
<code> </code><code>types_hash_max_size 2048;</code>
<code> </code><code>include </code><code>/etc/nginx/mime</code><code>.types; </code>
<code> </code><code>default_type application</code><code>/octet-stream</code><code>;</code>
<code>#增加后端服务器的负载方式,我们默认使用轮询</code>
<code> </code><code>upstream nginx.ixmsoft.com {</code>
<code> </code>
<code> </code><code># Load modular configuration files from the /etc/nginx/conf.d directory. </code>
<code> </code><code># See http://nginx.org/en/docs/ngx_core_module.html#include </code>
<code> </code><code># for more information. </code>
<code> </code><code>include </code><code>/etc/nginx/conf</code><code>.d/*.conf;</code>
<code> </code><code>server { </code>
<code> </code><code>#listen 80 default_server; </code>
<code> </code><code>#listen [::]:80 default_server; </code>
<code> </code><code>#server_name _; </code>
<code> </code><code>listen 80;</code>
<code> </code><code>server_name http:</code><code>//nginx</code><code>.ixmsoft.com;</code>
<code> </code><code>root </code><code>/usr/share/nginx/html</code><code>;</code>
<code> </code><code># Load configuration files for the default server block. </code>
<code> </code><code>include </code><code>/etc/nginx/default</code><code>.d/*.conf;</code>
<code>#增加的服务器配置</code>
<code> </code><code>proxy_redirect off;</code>
<code> </code><code>proxy_set_header Host $host;</code>
<code> </code><code>proxy_set_header X-Real-IP $remote_addr;</code>
<code> </code><code>proxy_pass http:</code><code>//nginx</code><code>.ixmsoft.com;</code>
<code> </code><code>error_page 404 </code><code>/404</code><code>.html; </code>
<code> </code><code>location = </code><code>/40x</code><code>.html { </code>
<code> </code><code>error_page 500 502 503 504 </code><code>/50x</code><code>.html; </code>
<code> </code><code>location = </code><code>/50x</code><code>.html { </code>
<code> </code><code>} </code>
<code># Settings for a TLS enabled server. </code>
<code># </code>
<code># server { </code>
<code># listen 443 ssl http2 default_server; </code>
<code># listen [::]:443 ssl http2 default_server; </code>
<code># server_name _; </code>
<code># root /usr/share/nginx/html; </code>
<code># ssl_certificate "/etc/pki/nginx/server.crt"; </code>
<code># ssl_certificate_key "/etc/pki/nginx/private/server.key"; </code>
<code># ssl_session_cache shared:SSL:1m; </code>
<code># ssl_session_timeout 10m; </code>
<code># ssl_ciphers HIGH:!aNULL:!MD5; </code>
<code># ssl_prefer_server_ciphers on; </code>
<code># # Load configuration files for the default server block. </code>
<code># include /etc/nginx/default.d/*.conf; </code>
<code># location / { </code>
<code># } </code>
<code># error_page 404 /404.html; </code>
<code># location = /40x.html { </code>
<code># error_page 500 502 503 504 /50x.html; </code>
<code># location = /50x.html { </code>
<code># }</code>
保存会重启服务
<code>Systemc restart nginx</code>
然后测试访问,访问结果基本上都是一个后端服务器分配一次
<a href="http://s3.51cto.com/wyfs02/M01/8C/45/wKioL1hojDOy6DECAABCz7IBU5w966.png" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/8C/45/wKioL1hojDTADZc2AABLNXtG77I433.png" target="_blank"></a>
我们使用以下命令执行十次
<code>for</code> <code>i </code><code>in</code> <code>$(</code><code>seq</code> <code>10); </code><code>do</code> <code>curl http:</code><code>//192</code><code>.168.5.20 ; </code><code>done</code>
<code>[root@bogon nginx]</code><code># for i in $(seq 10); do curl http://192.168.5.20 ; done </code>
<code>HostName:A-S ----->IP:192.168.5.21</code>
<code>HostName:B-S ----->IP:192.168.5.22</code>
<code>HostName:A-S ----->IP:192.168.5.21 </code>
<a href="http://s3.51cto.com/wyfs02/M00/8C/45/wKioL1hojDXD2cxdAAFMDeUtTXE499.png" target="_blank"></a>
接下来我们配置加权轮询分配方式
我们只修改一下部分
<code> </code><code>server 192.168.5.21:80 weight=10 max_fails=2 fail_timeout=30s;</code>
<code> </code><code>server 192.168.5.22:80 weight=5 max_fails=2 fail_timeout=30s;</code>
<code># 供proxy_pass和fastcgi_pass指令中使用的代理服务器</code>
<code># 后台如果有动态应用的时候,ip_hash指令可以通过hash算法</code>
<code># 将客户端请求定位到同一台后端服务器上,解决session共享,</code>
<code># 但建议用动态应用做session共享</code>
<code># server用于指定一个后端服务器的名称和参数</code>
<code># weight代表权,重默认为1,权重越高被分配的客户端越多</code>
<code># max_fails 指定时间内对后端请求失败的次数</code>
<code># fail_timeout 达到max_fails指定的失败次数后暂停的时间</code>
<code># down参数用来标记为离线,不参与负载均衡.在ip_hash下使用</code>
<code># backup仅仅在非backup服务器宕机或繁忙的时候使用</code>
<a href="http://s3.51cto.com/wyfs02/M02/8C/49/wKiom1hojDagFDrYAAAeCJtnChc494.png" target="_blank"></a>
修改后的代码如下:
<code> </code><code># Load modular configuration files from the /etc/nginx/conf.d directory. </code>
我们重启进行测试
<code>[root@bogon nginx]</code><code># for i in $(seq 10); do curl http://192.168.5.20 ; done </code>
<code>HostName:A-S ----->IP:192.168.5.21 </code>
<code>HostName:A-S ----->IP:192.168.5.21 </code>
<a href="http://s3.51cto.com/wyfs02/M01/8C/46/wKioL1hojDej2e0lAABTooCORR8754.png" target="_blank"></a>
接下来我们测试第三种,ip_hash;每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决的问题。
我们只修改server部分
<code> </code><code>upstream nginx.ixmsoft.com { </code>
<code> </code><code>ip_hash; </code>
<a href="http://s3.51cto.com/wyfs02/M02/8C/46/wKioL1hojDiQNjHPAAAU2ne_M5k749.png" target="_blank"></a>
修改后的整体代码:
保存退出后,我们测试
<a href="http://s3.51cto.com/wyfs02/M00/8C/49/wKiom1hojDmhjgxKAABQzAY3o8A768.png" target="_blank"></a>
最后我们介绍一下fairl
按后端服务器的响应时间来分配请求,响应时间短的优先分配
<code>upstream nginx.ixmsoft.com { </code>
<code> </code><code>server 192.168.5.22:80; </code>
<code> </code><code>fair; </code>
修改后的整体代码
本文转自 高文龙 51CTO博客,原文链接:http://blog.51cto.com/gaowenlong/1887997,如需转载请自行联系原作者