Linux系统中使用Nginx实现负载均衡

Posted aiguangyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统中使用Nginx实现负载均衡相关的知识,希望对你有一定的参考价值。

1. 负载均衡的种类

1. 通过硬件来进行解决。

常见的硬件有 NetScaler、F5、Radware 和 Array 等商用的负载均衡器,价格比较昂贵,一般应用于几十万甚至百万的互联网应用。

2. 通过软件来进行解决。

常见的软件有 LVS、nginx、apache 等,它们是基于 Linux 系统并且开源的负载均衡策略,处理并发一般在一到两万。

Nginx 的特点是占有内存少,并发能力强,Nginx 的并发能力在同类型的网页服务器中表现最好,很多大公司都在使用它。

 

2. Nginx负载均衡的分配方式

1. 轮询

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某一服务器挂了,自动剔除,轮询访问方式为默认方式。

2. 权重

指定轮询几率,权重和访问比率成正比,一般用于后端服务器性能不均的情况。

3. 哈希算法

每个请求按访问IP的哈希算法结果分配,这样每个访客固定访问一个后端服务器, 可以解决多个服务器的 session 问题。

 

3. 配置Nginx实现负载均衡

1. 准备工作

(1). 准备两台服务器;

假设目前有两台虚拟机服务器,一台为192.168.1.128,另一台为192.168.1.129

(2). 关闭这两台服务器上的ESLinux;

vi etc/selinux/config

执行上面的命令打开SELinux的配置文件,按 i 键进入编辑模式,将SELINUX=enforcing 改为 SELINUX=disabled,然后按esc退出编辑模式,输入:wq 保存退出,执行以下命令使配置生效。

soure etc/selinux/config

如果配置没有生效,建议重启Linux。

init 6

(3). 打开这两台服务器上的端口号;

查询开启的端口号。

firewall-cmd --zone=public --list-ports

开启80端口号,如果服务应用程序访问的是其它端口号,则需要一并开启。

firewall-cmd --zone=public --add-port=80/tcp --permanent

2. 配置单个网站的负载均衡

www.aaa.com网站为例,配置负载均衡的文件,放到192.168.1.128的服务器里面,代码如下:

# www_aaa_com 与下面的proxy_pass中的对应
upstream www_aaa_com {

    # 默认按轮询分配访问
    # server 127.0.0.1:3001; 
    # server 127.0.0.1:3002;
    # server 192.168.1.129:3001;

    # 如果有地址后加了权重weight的值,代表按比率轮询
    # server 127.0.0.1:3001 weight=1; 
    # server 127.0.0.1:3002 weight=1;
    # server 192.168.1.129:3001 weight=3;


    # 加了ip_hash代表将IP地址进行哈希算法后进行分配
    ip_hash;
    server 127.0.0.1:3001 weight=1; 
    server 127.0.0.1:3002 weight=1;
    server 192.168.1.129:3001 weight=3; 

}

server {
    listen       80;
    server_name  www.aaa.com;

    # charset koi8-r;
    # access_log  /var/log/nginx/host.access.log  main;

    location / {

        # 设置主机头和客户端真实地址,以便服务器获取客户端真实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;
        # 禁用缓存
        proxy_buffering off;
        # 反向代理的地址
        proxy_pass http://www_aaa_com;
    }
    # 配置socket.io(如果不需要,可以取消)
    location /socket.io {    
        
        proxy_pass http://127.0.0.1:3001;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }

    # error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html

    error_page   500 502 503 504  /50x.html;

    location = /50x.html {
        root   /usr/share/nginx/html;
    }
 
}

然后在192.168.1.128 的服务器里放两套www.aaa.com网站相同的代码,端口号分别为30013002,在192.168.1.129的服务器里也放www.aaa.com网站的代码,端口号为3001,这样便实现了服务器的负载均衡,当某个服务器挂了之后,服户访问便会自动切换到另一台服务器作出响应。

3. 配置多个网站的转发

以实现下面的网络拓扑结构为例。

首先配置www.aaa.com的nginx的配置文件,放到192.168.1.128的服务器里面,代码如下:

# www_aaa_com 与下面的proxy_pass中的对应
upstream www_aaa_com {

    # 默认按轮询分配访问
    # server 127.0.0.1:3001; 
    # server 127.0.0.1:3002;
    # server 192.168.1.129:3001;

    # 如果有地址后加了权重weight的值,代表按比率轮询
    # server 127.0.0.1:3001 weight=1; 
    # server 127.0.0.1:3002 weight=1;
    # server 192.168.1.129:3001 weight=3;


    # 加了ip_hash代表将IP地址进行哈希算法后进行分配
    ip_hash;
    server 127.0.0.1:3001; 

}

server {
    listen       80;
    server_name  www.aaa.com;

    # charset koi8-r;
    # access_log  /var/log/nginx/host.access.log  main;

    location / {

        # 设置主机头和客户端真实地址,以便服务器获取客户端真实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;
        # 禁用缓存
        proxy_buffering off;
        # 反向代理的地址
        proxy_pass http://www_aaa_com;
    }

    # error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html

    error_page   500 502 503 504  /50x.html;

    location = /50x.html {
        root   /usr/share/nginx/html;
    }
 
}

配置www.bbb.com的nginx的配置文件,放到192.168.1.128的服务器里面,代码如下:

# www_bbb_com 与下面的proxy_pass中的对应
upstream www_bbb_com {

    # 默认按轮询分配访问
    # server 127.0.0.1:3001; 
    # server 127.0.0.1:3002;
    # server 192.168.1.129:3001;

    # 如果有地址后加了权重weight的值,代表按比率轮询
    # server 127.0.0.1:3001 weight=1; 
    # server 127.0.0.1:3002 weight=1;
    # server 192.168.1.129:3001 weight=3;


    # 加了ip_hash代表将IP地址进行哈希算法后进行分配
    ip_hash;
    server 127.0.0.1:3002 ; 
}
server {
    listen       80;
    server_name  www.bbb.com;

    # charset koi8-r;
    # access_log  /var/log/nginx/host.access.log  main;

    location / {
        # 设置主机头和客户端真实地址,以便服务器获取客户端真实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;
        # 禁用缓存
        proxy_buffering off;
        # 反向代理的地址  
        proxy_pass http://www_bbb_com;
    }

    # error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
 
}

配置www.ccc.com的nginx的配置文件,放到192.168.1.128的服务器里面,代码如下:

# www_ccc_com 与下面的proxy_pass中的对应
upstream www_ccc_com {	

    # 默认按轮询分配访问
    # server 127.0.0.1:3001; 
    # server 127.0.0.1:3002;
    # server 192.168.1.129:3001;

    # 如果有地址后加了权重weight的值,代表按比率轮询
    # server 127.0.0.1:3001 weight=1; 
    # server 127.0.0.1:3002 weight=1;
    # server 192.168.1.129:3001 weight=3;


    # 加了ip_hash代表将IP地址进行哈希算法后进行分配
    ip_hash;
    server 192.168.1.129:3001; 
}

server {
    listen       80;
    server_name  www.ccc.com;

    # charset koi8-r;
    # access_log  /var/log/nginx/host.access.log  main;

    location / {
        # 设置主机头和客户端真实地址,以便服务器获取客户端真实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;
        # 禁用缓存
        proxy_buffering off;
        # 反向代理的地址
        proxy_pass http://www_ccc_com;
    }

    # error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
 
}

然后在192.168.1.128 的服务器里放www.aaa.com的代码,端口号为3001192.168.1.128 的服务器里放www.bbb.com的代码,端口号为3002;在192.168.1.129的服务器里放www.ccc.com的代码,端口号为3001,这样便利用nginx服务器实现了多个网站的转发。

 

以上是关于Linux系统中使用Nginx实现负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

玩转Linux系统之搭建Nginx+Tomcat群集实现负载均衡

Linux下Nginx+多Tomcat负载均衡实现详解

Linux架构之Nginx 七层负载均衡

LVS的负载均衡策略及LVS+KeepAlived+Nginx实现高可用方案

如何理解Linux下的负载均衡?

Linux下玩转nginx系列---如何使用upsync模块实现动态负载均衡