Nginx部署负载均衡

作者: Lee_DH | 来源:发表于2017-11-27 19:28 被阅读56次

上一篇文章我们已经初步了解Nginx的概念以及作用,现在就让我们在本地部署一个小型的负载均衡Demo

1. 准备3台虚拟机(3台虚拟机需安装lnmp环境)

192.168.28.197    负载均衡服务器
192.168.28.198    web服务器
192.168.28.199    web服务器

2. 在两台web服务器放入测试文件

<html>    
<head>    
<title>Welcome to nginx!</title>    
</head>    
<body bgcolor="white" text="black">    
<center><h1>Welcome to nginx! 192.168.28.198</h1></center>    
</body>    
</html>

3. 配置负载均衡服务器

http
    {
        include       mime.types;
        default_type  application/octet-stream;

        ...

        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";

        #limit_conn_zone $binary_remote_addr zone=perip:10m;
        ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.

        server_tokens off;
        access_log /var/log/nginx/access.log;


###################################负载均衡设置###########################################
    upstream www_koumm_com {   
        server 192.168.28.198:80 ;
        server 192.168.28.199:80 ;
    } 
#########################################################################################


server
    {
        listen 80 default_server;
        #listen [::]:80 default_server ipv6only=on;
        server_name _;
        index index.html index.htm index.php;
        root  /home/wwwroot;

        #error_page   404   /404.html;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        include enable-php.conf;

###################################反向代理设置###########################################
    location / {
       proxy_pass http://www_koumm_com;
    }
#########################################################################################


        access_log /var/log/nginx/access.log;
    }
include vhost/*.conf;
}

4. 验证upstream结点中服务器的4种请求分配

轮询(默认): 每个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

nginx中,默认请求分配的方法就是轮询,我们无需修改配置文件,直接访问负载均衡服务器即可

192.168.28.198
192.168.28.199
根据请求结果,198、199两台web服务器交替被访问,说明轮询请求是正常的。还有一种情况,如果其中一台服务器down掉,这台服务器会不会自动剔除?

我们手动将199这台服务器的Nginx关掉(或者在配置文件中,把这台服务器down掉,server 192.168.28.199:80 down;),然后重新请求192.168.28.197,发现请求完全不受199这台机器down掉的影响,所有的请求全部分配到198这台机器上。

weight: 指定轮询的权重,weight和访问成正比,用于后端服务器性能不均的情况

修改配置文件,分别为两台web服务器分配不同的轮询权重:

        upstream www_koumm_com {
                server 192.168.28.198:80 weight=10;
                server 192.168.28.199:80 weight=100;
        }

发现请求分配到199服务器的比例明显大于分配到198服务器的比例,说明我们的权重设置是成功的

ip_hash: 每个请求按访问ip的hash结果分配,确保每位访客固定访问一个后端服务器,可以解决session的问题

修改配置文件:

        upstream www_koumm_com {
                ip_hash;
                server 192.168.28.198:80 ;
                server 192.168.28.199:80 ;
        }

用两台不同的ip分别访问192.168.28.197,发现每个ip访问的服务器是固定的,说明ip_hash设置是成功的

fair(第三方): 按后端服务器响应时间来分配请求,响应时间短的优先

  • 安装fair模块

fair模块是一个第三方模块,nginx在安装时不会自带,所以需要先安装fair模块。(安装第三方模块,实际上是使用--add-module重新编译安装一次nginx)

1. 下载第三方模块
fair模块
2. 下载对应版本的Nginx源码(因为我是用lnmp一键安装包安装的Nginx,所以需要重新在网上下载Nginx源码)
nginx -v(查看nginx版本)
Nginx-1.12.1源码
另附上lnmp一键安装包
3. 查看之前源码编译Nginx时的参数

[root@CentOS6 conf]# nginx -V
nginx version: nginx/1.12.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
built with OpenSSL 1.0.2l  25 May 2017
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-openssl=/usr/local/lnmp1.4/src/openssl-1.0.2l

4. 在原来编译参数的基础上,加上 --add-module=XXX,执行新配置并编译(注:只需make,无需make install

./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-openssl=/usr/local/lnmp1.4/src/openssl-1.0.2l --add-module=/root/Downloads/nginx-upstream-fair-master
make

在进行make操作时,我报了一个gx_http_upstream_srv_conf_t鈥has no member named 'retries'的错误,解决方法是:修改源码中的 /root/Downloads/nginx-1.12.1/src/http/ngx_http_upstream.h 文件。

需修改的部分:
...
struct ngx_http_upstream_srv_conf_s {
    ngx_http_upstream_peer_t         peer;
    void                           **srv_conf;

    ngx_array_t                     *servers;  /* ngx_http_upstream_server_t */

######################################## Add #########################################
    ngx_array_t                     *values;
    ngx_array_t                     *lengths;
    ngx_uint_t                       retries;
######################################################################################

    ngx_uint_t                       flags;
    ngx_str_t                        host;
    u_char                          *file_name;
    ngx_uint_t                       line;
    in_port_t                        port;
######################################## Add #########################################
    in_port_t                        default_port;
######################################################################################
    ngx_uint_t                       no_port;  /* unsigned no_port:1 */

#if (NGX_HTTP_UPSTREAM_ZONE)
    ngx_shm_zone_t                  *shm_zone;
#endif
};
...

5. 复制Nginx
cp objs/nginx /usr/local/nginx/sbin/nginx

  • 使用fair进行请求分配
    修改配置文件
        upstream www_koumm_com {
                server 192.168.28.198:80 ;
                server 192.168.28.199:80 ;
                fair;
        }

由于两台测试web服务器的性能一样(完全通过虚拟机copy出来的两台服务器),所以使用fair模块分配请求的效果不是太明显,但相信只要正确安装fair,在高并发、大流量的情况下fair是能起作用的。

如果这篇文章对你有帮助,请点个赞哈,感谢

相关文章

网友评论

    本文标题:Nginx部署负载均衡

    本文链接:https://www.haomeiwen.com/subject/hcurbxtx.html