Nginx教程

Nginx安装与负载均衡配置

本文主要是介绍Nginx安装与负载均衡配置,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Nginx安装与负载均衡配置

一、    需求说明

1.      系统要求:

Centos8操作系统

2.      负载均衡

通过Nginx实现地址轮询

3.      测试环境

通过docker环境制作两个简单的nginx前端页面,分别是nginx1和nginx2

通过部署Nginx负载,实现两个地址的轮询

二、    负载均衡的方式

负载均衡有3种方式:

l  循环机制:循环分发对应用服务器的请求

l  最少连接机制:将请求发送给连接数最少的服务器

l  ip-hash机制:哈西函数用于确定请求被配那个服务器(基于客户端IP地址)

1.    轮询机制

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

适合服务器配置相当,无状态且短平快的服务使用。也适用于图片服务器集群和纯静态页面服务器集群。

优点:方式简便、成本低廉。

缺点:可靠性低和负载分配不均衡。

   代码示例:

upstream  balance {

    server ip地址1;

    server ip地址2;

}

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

权重越高,在被访问的概率越大,如下例,分别是30%70%

upstream balance {

    server ip地址1 weight=3;

    server ip地址2 weight=7;

}

2.    最少连接机制

当某些请求耗费较长时间完成时,最少连接机制能让实例的负载更加均衡

在最少连接机制下nginx不会让大量请求使应用服务器超载,而是将请求分发至相对“悠闲”的服务器。

轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

   代码示例:

least_conn指令用在服务器组配置中时,最少连接机制就生效了。

upstream blance {

least_conn;            #把请求转发给连接数较少的后端服务器
server  ip地址1;
server  ip地址2;
server  ip地址3;
}

此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。

3.    ip-hash机制

请注意循环或者最少连接数负载均衡机制,可能将同一客户端的请求分发至不同的服务器,无法保证相同客户端的请求总是会被指向相同服务器。

比如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,所以为了使客户端请求总是分发向特定的服务器,就需要ip-hash负载均衡机制,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器(除非服务器不可用),可以解决session不能跨服务器的问题。

   代码示例:

不加权重

upstream myapp1 {

ip_hash;
server  ip地址1;
server  ip地址2;
server  ip地址3;
}

服务器权重没有配置,意味着所有服务器等权重的应用于负载均衡。循环机制下大量请求以统一的方式处理,各服务器基本会被分发数量相等的请求。权重参数指定给服务器,权重就作为负载均衡的决定条件。

添加加权重

upstream myapp1 {

ip_hash;
server  ip地址1 weight=3;
server  ip地址2;
server  ip地址3;
}

在上面的配置中每5个请求,3个会被指向ip地址11个指向ip地址21个指向ip地址3

此策略适合有状态服务,比如session,当有服务器需要剔除,必须手动down掉。

4.    其他机制

还有一些机制需要通过安装第三方插件来实现,比如:fair、url_hash

1)  fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

#实现响应时间短的优先分配

upstream dynamic_tsingxin {

    server ip地址1;

    server ip地址2;

    fair;         

}

2)  url_hash(第三方) 

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。

#实现每个url定向到同一个后端服务器

upstream dynamic_tsingxin {

    server ip地址1;

    server ip地址2;

    hash $request_uri;   

    hash_method crc32;

}

注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

三、    负载状态设置:

1.down表示单前的server暂时不参与负载

2.weight默认为1。weight越大,负载的权重就越大 

3.max_fails允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream模块定义的错误 

4.fail_timeoutmax_fails次失败后,暂停的时间

5.backup预留的备份服务器。 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻

6.max_conns限制最大的接收连接数

 

四、    Nginx安装

注:如果你使用的是CentOS8,直接使用第三步命令即可安装。

第一步:安装yum-utils

yum install yum-utils

[root@LoadBalance yum.repos.d]# yum install yum-utils

Last metadata expiration check: 0:00:51 ago on Fri 30 Apr 2021 05:45:05 PM CST.

Dependencies resolved.

==================================================================================================

 Package                Architecture        Version                     Repository           Size

==================================================================================================

Installing:

 yum-utils              noarch              4.0.17-5.el8                baseos               68 k

Transaction Summary

==================================================================================================

Install  1 Package

Total download size: 68 k

Installed size: 20 k

Is this ok [y/N]: y

Downloading Packages:

yum-utils-4.0.17-5.el8.noarch.rpm                                 532 kB/s |  68 kB     00:00

-----------------------------------------------------------------------------------

Total                                                              79 kB/s |  68 kB     00:00

Running transaction check

Transaction check succeeded.

Running transaction test

Transaction test succeeded.

Running transaction

  Preparing        :                                                                          1/1

  Installing       : yum-utils-4.0.17-5.el8.noarch                                            1/1

  Running scriptlet: yum-utils-4.0.17-5.el8.noarch                                            1/1

  Verifying        : yum-utils-4.0.17-5.el8.noarch                                            1/1

Installed:

  yum-utils-4.0.17-5.el8.noarch

Complete!

第二步:创建nginx.repo文件

/etc/yum.repos.d/nginx.repo

[nginx-stable]

name=nginx stable repo

baseurl=http://nginx.org/packages/centos/$releasever/$basearch/

gpgcheck=1

enabled=1

gpgkey=https://nginx.org/keys/nginx_signing.key

module_hotfixes=true

 

[nginx-mainline]

name=nginx mainline repo

baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/

gpgcheck=1

enabled=0

gpgkey=https://nginx.org/keys/nginx_signing.key

module_hotfixes=true

第三步:安装Nginx

注:如果你使用的是CentOS8,直接使用第三步命令即可安装

[root@LoadBalance yum.repos.d]# yum install nginx

Last metadata expiration check: 0:01:00 ago on Fri 30 Apr 2021 05:45:05 PM CST.

Dependencies resolved.

==============================================================

 Package          Architecture      Version                         Repository               Size

==============================================================

Installing:

 nginx            x86_64            1:1.20.0-1.el8.ngx              nginx-stable            820 k

Transaction Summary

==============================================================

Install  1 Package

Total download size: 820 k

Installed size: 2.8 M

Is this ok [y/N]: y

Downloading Packages:

nginx-1.20.0-1.el8.ngx.x86_64.rpm                                 247 kB/s | 820 kB     00:03

-----------------------------------------------------------------------------------

Total                                                             247 kB/s | 820 kB     00:03

warning: /var/cache/dnf/nginx-stable-614ef03fac352fea/packages/nginx-1.20.0-1.el8.ngx.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY

nginx stable repo                                                 1.1 kB/s | 1.5 kB     00:01

Importing GPG key 0x7BD9BF62:

 Userid     : "nginx signing key

 Fingerprint: 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62

 From       : https://nginx.org/keys/nginx_signing.key

Is this ok [y/N]: y

Key imported successfully

Running transaction check

Transaction check succeeded.

Running transaction test

Transaction test succeeded.

Running transaction

  Preparing        :                                                                          1/1

  Running scriptlet: nginx-1:1.20.0-1.el8.ngx.x86_64                                          1/1

  Installing       : nginx-1:1.20.0-1.el8.ngx.x86_64                                          1/1

  Running scriptlet: nginx-1:1.20.0-1.el8.ngx.x86_64                                          1/1

---------------------------------------------------------------------

Thanks for using nginx!

Please find the official documentation for nginx here:

* https://nginx.org/en/docs/

Please subscribe to nginx-announce mailing list to get

the most important news about nginx:

* https://nginx.org/en/support.html

Commercial subscriptions for nginx are available on:

* https://nginx.com/products/

----------------------------------------------------------------------

  Verifying        : nginx-1:1.20.0-1.el8.ngx.x86_64                                          1/1

Installed:

  nginx-1:1.20.0-1.el8.ngx.x86_64

Complete!

第四步:启动Nginx

启动前,请关闭Selinux,防止访问报错

[root@LoadBalance yum.repos.d]# systemctl start nginx

五、    配置负载均衡

[root@LoadBalance ~]# vim /etc/nginx/nginx.conf

http {

    include       /etc/nginx/mime.types;

    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    upstream balance {               #负载的配置(upstream)必须在http模块内

    #ip_hash;                   #注释掉了ip_hash,则默认是轮询

server 10.78.56.63:9991;        #添加集群

    server 10.78.56.63:9992; 

    }

    server {

      listen 8080;               #服务监听的端口

    server_name 10.78.56.101;    #服务访问IP

    location / {

      #index  http://10.78.56.101:8080

       proxy_pass http://balance;     #和前面upstream的命名一致       

    }

}

}

 

[root@LoadBalance ~]# systemctl restart nginx   #重启服务

 

 

 image.png

image.png


这篇关于Nginx安装与负载均衡配置的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!