天天看点

Centos7+Nginx负载均衡(Load Balance)配置详情介绍

随着互联网信息的爆炸性增长,负载均衡(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>&lt;</code><code>/html</code><code>&gt;</code>

<code>&lt;!DOCTYPE html&gt;</code>

<code>&lt;html&gt;</code>

<code>&lt;</code><code>head</code><code>&gt;</code>

<code>&lt;title&gt;Welcome to Apache&lt;</code><code>/title</code><code>&gt;</code>

<code>&lt;style&gt;</code>

<code>body {</code>

<code>35em;</code>

<code>margin: 0 auto;</code>

<code>font-family: Tahoma, Verdana, Arial, sans-serif;</code>

<code>&lt;</code><code>/style</code><code>&gt;</code>

<code>&lt;style </code><code>type</code><code>=</code><code>"text/css"</code><code>&gt;</code>

<code>h1{color:red}</code>

<code>h2{color:blue}</code>

<code>h3{color:green}</code>

<code>h4{color:yellow}</code>

<code>&lt;</code><code>/head</code><code>&gt;&lt;body bgcolor=</code><code>'7D7DFF'</code><code>&gt;</code>

<code>&lt;h2&gt;HostName:A-S -----&gt;IP:192.168.5.21&lt;</code><code>/h2</code><code>&gt;</code>

<code>&lt;</code><code>/body</code><code>&gt;</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>&lt;port portocal=</code><code>'tcp'</code> <code>port=</code><code>'80'</code><code>&gt;</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  -----&gt;IP:192.168.5.21</code>

<code>HostName:B-S  -----&gt;IP:192.168.5.22</code>

<code>HostName:A-S  -----&gt;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  -----&gt;IP:192.168.5.21    </code>

<code>HostName:A-S  -----&gt;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,如需转载请自行联系原作者

继续阅读