高并发分布式系统架构——Nginx - Go语言中文社区

高并发分布式系统架构——Nginx


Nginx介绍

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。 —— [ 百度百科 ]

Nginx由C语言编写,对系统资源和CPU资源利用率都很高,支持50000并发连接数,并且安装和配置简便,启动速度极快,支持Linux、Mac OS X、Microsoft Windows等众多主流操作系统,是做分布式系统的常用的反向代理器。

Nginx实现请求转向

博主使用阿里云CentOS 7.3云服务器实现,小伙伴们也可以使用Linux虚拟机实现,只是使用虚拟机话要注意桥接模式与NAT模式的区别,注意是否需要修改本机的hosts文件。

安装Nginx

博主使用Xshell 5连接服务器,yum安装Nginx:

[root@... ...]# yum install nginx

使用yum安装,要求服务器能够访问公网,使用虚拟机的小伙伴注意要使虚拟机能够访问外网。
查看Nginx安装后的各路径:

[root@... ...]# whereis ngnix
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz /usr/share/man/man3/nginx.3pm.gz

执行命令nginx -t查看安装是否成功:

[root@... ...]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

有以上输出说明安装成功。

配置Nginx

Nginx的配置文件nginx.conf在文件夹/etc/nginx中,博主使用FileZilla修改nginx.conf文件,嫌麻烦的话也可以使用vim命令编辑,在http {…}中添加server {…}标签:

http {
    #...
    #添加测试用的转向配置
    server {
        #Nginx服务器监听8080端口
        listen 8080;
        #监听的服务的名称,因为博主并未设置任何服务,所以直接使用localhost
        server_name localhost;
        #代理有可能导致请求头丢失,以下三行保证请求一定会有请求头
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #要转向的IP及端口
        location / {
            #博主的Tomcat与Nginx安装在同一台服务器上,所以直接将请求转向本地的8081端口
            proxy_pass http://127.0.0.1:8081;
        }
    }
}

nginx.conf配置文件中的内容远不止于此,转载@Java高知大神的超详细的配置文件说明:Nginx配置文件(nginx.conf)配置详解,感兴趣的小伙伴可以研读一下。

启动Nginx

介绍下Nginx的启动、停止、重启命令:

命令 价格
nginx 根据配置文件/etc/nginx/nginx.conf启动
nginx -s stop 停止
nginx -s reload 重启

执行以上三个命令都不会有任何输出提示,但可以通过ps命令查看进程状态:

[root@... ...]# nginx
[root@... ...]# ps -ef |grep nginx
root     10133     1  0 21:00 ?        00:00:00 nginx: master process nginx
nginx    10134 10133  0 21:00 ?        00:00:00 nginx: worker process
root     10136  9121  0 21:00 pts/1    00:00:00 grep --color=auto nginx
[root@... ...]# nginx -s stop
[root@... ...]# ps -ef |grep nginx
root     10181  9121  0 21:05 pts/1    00:00:00 grep --color=auto nginx

很容易看出差别。

测试转向

在Linux服务器上启动一个访问端口为8081的Tomcat服务器,使用浏览器访问服务器的8080端口(注意开启8080端口或关闭防火墙),会发现请求被转发到8081端口的Tomcat服务器中,测试完成,成功完成转向。

Nginx负载均衡

由于单台Tomcat服务器能够承受的并发量太小,所以开发环境下都要配置多台Tomcat服务器,形成分布式集群,这时也可以通过Nginx来实现。
三种常用的均衡算法:

均衡策略 说明
轮询 将所有请求依次发送给所有服务器
权重 将所有请求按照权重的比例发送给各服务器
IP_HASH 根据用户的访问IP将请求发送给固定的服务器

修改配置文件实现轮询负载均衡

在全新的nginx.conf文档中进行修改,或将上例中的配置文件已更改的内容删除后在使用:

    server {
        listen 8080;
        server_name localhost;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        location / {
            #这里的“bal”应与已存在的某一策略名称一致
            proxy_pass http://bal;
        }
    }
    #配置均衡策略,"bal"为策略名称
    upstream bal {
        #轮询
        server  127.0.0.1:8081;
        server  127.0.0.1:8082;
        server  127.0.0.1:8083;
    }

这里要注意server标签要写在http标签内部,并且要开启8080端口,但8081、8082、8083端口不需要开启,这也是Nginx安全性特点的体现之一。

测试轮询负载均衡

启动三台内容各不相同的Tomcat服务器,分别监听8081、8082、8083端口。在浏览器中访问服务器8080端口,多次刷新会发现三台Tomcat依次被访问:
首次访问服务器8080端口

第二次访问8080端口

第三次访问8080端口

如果有Tomcat服务器意外宕机,Nginx能够检测Tomcat的状态,并只将请求发往能够正常接收请求的服务器(但是不排除能够接受却不能返回结果的服务器,这里可以通过worker_processes设置超时后转发到另一台服务器)。

权重负载均衡策略

因为一般情况下,一家公司中的服务器性能不一,使用轮询式策略会出现资源分配不均的现象,所以权重式的负载均衡策略是开发中最常用的负载策略。

    upstream bal {
        server 127.0.0.1:8081 weight=6;
        server 127.0.0.1:8082 weight=1;
        server 127.0.0.1:8083 weight=3;
    }

在地址后加上weight属性即可,Nginx会根据同一个策略中的中weight值,按照各自值所占百分比将请求尽量均匀的发送至每一个服务器,值越大的服务器获得的请求越多。

IP_HASH负载均衡策略

IP_HASH负载均衡策略实现方式非常简单,在策略中加入ip_hash语句即可,一旦添加ip_hash语句,其他策略将不起作用(即使添加了weight属性也会按照IP_HASH策略分发请求)。
Nginx服务器将用户的IP进行hash运算获得映射值,将特定的IP与特定的服务器绑定,以后该IP的所有请求都会发往该服务器。

    upstream bal {
        ip_hash;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
        server 127.0.0.1:8083;
    }

在分布式系统环境下,可以利用Session黏着的现象实现Session共享。但这是一种低级的实现方式,因为不可能所有用户的IP分布与真实的服务器性能分布情况正好吻合,并且在IP可变的情况下因Session黏着现象会导致安全问题。所以这种负载策略一般不会使用,而通过单点登录的方式实现Session共享。

备用机机制

在某台服务器后添加backup属性即可将该服务器设置为备用机。Nginx一般情况下不会将请求发送给备用机,只有所有的非备用机全部宕机或全部忙碌,没有非备用机能够响应新的请求时,才会将请求发送给备用机,使其承担一部分压力。如果非备用机重启或压力减小,可以正常处理用户请求时,则备用机再次处于等待状态。

    upstream bal {
        server 127.0.0.1:8081 weight=6;
        server 127.0.0.1:8082 weight=1 backup;
        server 127.0.0.1:8083 weight=3;
    }

这里需要注意,备用机机制不能与IP_HASH负载均衡策略一起使用。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Elio_LiuHeng/article/details/79372841
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-25 00:08:05
  • 阅读 ( 1435 )
  • 分类:架构

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢