lnmp架构——nginx的负载均衡

1 什么是nginx

Nginx 是一个高性能的HTTP服务器、轻量级的Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。

2 nginx的作用

  • 静态HTTP服务器
    Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。
  • 反向代理服务器
    反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet上的访问请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时Nginx就是反向代理服务器。
  • 负载均衡
    当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理。负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡,而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。
  • 虚拟主机
    有的网站访问量比较大,为了减轻一台服务器的压力需要做负载均衡。有的网站,由于访问量太小,需要节省成本,可以选择将多个网站部署在同一台服务器上。例如将http://www.aaa.com和http://www.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。
  • 正向代理
    正向代理,是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端,客户端才能使用正向代理。当需要把你的服务器作为代理服务器时,可以用Nginx来实现正向代理。

3 nginx的特点

  • 优点:

    • 占内存小,是轻量级的
    • 可实现高并发连接,处理响应快。根据官方给出的数据,能够支持高达 50,000 个并发连接数的响应
    • 可实现http服务器、虚拟主机、方向代理、负载均衡
    • Nginx配置简单,基本都是在conf文件中配置
    • 可以不暴露正式的服务器IP地址
    • 成本低,Nginx是开源免费的
    • 支持多系统
    • 支持Rwrite重写规则,能够根据域名、URL的不同, 将HTTP请求分发到不同的后端服务器群组。
  • 缺点:

    • 动态处理差:nginx处理静态文件好,耗费内存少,但是处理动态页面的能力较弱,现在一般前端用nginx作为反向代理抗住压力,apache作为后端处理动态请求。

4 nginx的安装以及优化

4.1 安装nginx

1)可以去官方网站http://nginx.org/en/download.html上寻找需要的nginx版本进行下载:
在这里插入图片描述

2)注意清理前面做过的实验以保持本次实验不被干扰:
在这里插入图片描述

3)解压下载好的nginx软件包:
在这里插入图片描述

4)进入解压后产生的目录下进行配置,注意如果在配置的时候不设定安装路径,默认情况下会自动安装到/usr/local/目录下,将相关信息分布在该目录下的其他目录中;为了方便查找与使用,我们可以在配置的时候自定义路径,./configure --prefix=/usr/local/nginx --with-http_ssl_module --with http_stub_status_module,其中–prefix=/usr/local/nginx表示自定义安装目录,–with-XXX_ module 选项表示指明安装对应的模块,–without-XXX_ module选项表示指明不安装对应的模块:
在这里插入图片描述
配置时,会提示有部分依赖没有安装,如上图所示。此时只需要根据编译的报错提示进相应应软件的安装即可,每次安装完一个依赖后,都要重新执行配置命令:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

全部的配置过程如下所示:
在这里插入图片描述
5)配置完后进行编译和安装:
在这里插入图片描述在这里插入图片描述

6)安装完成后,进入/usr/local/nginx/目录下的sbin里面存放的是nginx,在该目录下输入./nginx即可启动:
在这里插入图片描述在这里插入图片描述

  • 注意:/usr/local/nginx/目录下的各个目录的含义年如下

    • conf:存放nginx的配置文件
    • html:是默认提供的web服务的根目录
    • logs:是nginx日志的存放目录
    • modules:存放了一些模块会用到的库。
    • sbin:存放nginx的二进制文件,可以使用nginx二进制文件启动nginx
  • 源码包安装步骤:

    • 首先下载安装包,对安装包进行解压,进入解压好的目录下
    • ./configure [options],进行配置。可以通过./configure --help查看有哪些配置选项,选择自己需要的。若该参数出现错误,可以使用make distclean将参数清空,再重新配置
    • make进行编译。编译后如果出现问题,可以使用make clean将编译参数清空然后重新编译
    • make install 安装

4.2 优化

1)安装完nginx后,由于每次启动nginx或执行nginx的命令都需要进入安装目录下执行,这样使用命令不是方便。所以我们可以将/usr/local/nginx/sbin目录添加到用户环境变量文件.bash_profile中,使得该命令可以直接在当前环境中运行:
在这里插入图片描述
在这里插入图片描述

添加完后,输入source .bash_profile命令使得设定生效;测试直接启动nginx,查看端口:
在这里插入图片描述

3)进入/usr/local/nginx/目录下,输入du -sh查看当前目录的总大小,发现该目录占用的空间较大可以进行优化。首先关闭nginx,删除掉nginx目录:
在这里插入图片描述

然后删除掉解压好的目录重新进行解压,进入解压后的目录,编辑auto/cc/gcc文件,注释debug调试选项:
在这里插入图片描述在这里插入图片描述

重新进行配置、编译和安装:
在这里插入图片描述在这里插入图片描述

进入/usr/local/nginx/目录下查看该目录的总大小,变成 980k,节省了空间:
在这里插入图片描述在这里插入图片描述

5 nginx主配置文件操作

  • 在/usr/local/nginx/conf目录中存放了nginx的一些配置文件,nginx主配置文件为nginx.conf。
  • nginx的主配置文件有三个逻辑块,分别是http{ }、server{ }以及location{ },从逻辑块的语法缩进可以看出他们的层级关系。http中可以配置多个server,一个server中可以配置多个location。

5.1 修改nginx进程运行用户以及用户组

1)默认情况下nginx的用户是nobody,可以输入ps aux命令查看用户状态。我们可以创建一个nginx用户,useradd -M -d /usr/local/nginx/ -s /sbin/nologin nginx,建立完后查看该用户是否建立成功:
在这里插入图片描述在这里插入图片描述

2)进入/usr/local/nginx/conf目录下,修改nginx的主配置文件的user指令,指定Nginx Worker进程运行用户以及用户组为nginx;重新加载nginx -s reload
在这里插入图片描述在这里插入图片描述
此时再输入ps aux命令查看用户状态,可以看到用户变成了nginx:
在这里插入图片描述

5.2 实现负载均衡

1)编辑nginx主配置文件,在http模块下添加upstream,该指令主要用于负载均衡,设置一系列后端服务器;server指令用于指定主机和端口:
在这里插入图片描述

写一个server模块,server标志表示定义虚拟主机;listen用于指定虚拟主机的服务端口;server_name用于指定ip或域名,多个域名之间用空格分开。再server模块中写一个location模块,标明为哪一组服务器提供代理:
在这里插入图片描述

2)输入nginx -t检测是否有语法错误;重新加载nginx -s reload
在这里插入图片描述

3)在真机中做本地域名解析,ping域名查看那解析是否正确:
在这里插入图片描述在这里插入图片描述

4)开启两台RS的apache,使用真机去访问域名,成功实现轮询访问:
在这里插入图片描述

5.3 控制用户并发访问数量

  • nginx的主配置文件中的events事件指令,该指令主要是设定nginx的工作模式以及连接数上线
  • worker_connections用于定义nginx中每个进程的最大连接数,默认是1024
  • 注意最大客户端连接数由worker_processes和worker_connections决定,worker_processes指定了要开启的进程数,一般建议和cpu的数量一致。也就是说Max_client=worker_processes * worker_connections
  • 在作为反向代理时,Max_client=worker_processes * worker_connections/4
  • 同时进程的最大连接数还受操作系统的最大打开文件数限制,所以再修改了这两个参数后,也必须修改操作系统的文件数限制

1)编辑主配置文件,修改nginx中进程的最大连接数,即worker_connections参数
2)写入worker_cpu_affinity 01 10参数,01表示启用第一个CPU内核,10表示启用第二个CPU内核;worker_cpu_affinity 01 10,表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核
3)修改要开启的进程数,即worker_processes参数。注意该参数后面也可以写auto,表示会自动匹配cpu个数:
在这里插入图片描述

4)编辑/etc/security/limits.conf文件,修改操作系统的文件最大数限制:
在这里插入图片描述

5)重新加载nginx -s reload
在这里插入图片描述

6)在真机中测试,模拟客户端并发访问,ab -c10 -n 5000 http://www.westos.org/index.html
在这里插入图片描述在这里插入图片描述

5.4 修改nginx的调度算法

  • 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响;

  • Weight:指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下
    1)编辑nginx主配置文件,给server2增加权重:
    在这里插入图片描述
    2)重新加载nginx,去客户端测试,可以看到明显server2的访问此时要大于server3:
    在这里插入图片描述

  • ip_hash:每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题

1)编辑主配置文件,修改调度算法为ip_hash:
在这里插入图片描述

2)重新加载后测试:
在这里插入图片描述
注意,之所以只出现一个服务器,是因为请求的顺序是client–>dns–>cdn(反向代理–>nginx–>server 。客户端过来的ip直接访问cdn,cdn再去访问服务器,服务器作出响应后,又返回给cdn,由cdn返回给客户端,所以ip_hash算法是看不到效果的,只能看到一直访问一台rs,cdn将所有从客户端过来的ip都变成同一个ip。

5.5 设定RS在负载均衡调度中的状态

  • down:表示当前的server暂时不参与负载均衡
    1)将server2的状态修改为down,重新加载nginx:
    在这里插入图片描述在这里插入图片描述
    2)在真机中测试,只有server3在工作
    在这里插入图片描述

  • backup:预留的备用机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻
    1)使nginx服务器本身作为一个备用服务器,当server1和server2都故障后,server1会临时作为RS服务:
    在这里插入图片描述
    注意,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。

5.6 nginx会话保持–sticky模块

  • 在使用负载均衡的时候会遇到会话保持的问题,也就是如何使得某个客户端的每次访问都在同一个服务器上。除了ip_hash算法外,还可以使用cookie。服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发布者。
  • Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route
  • 其工作原理如下:
    • 客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器
    • 后端服务器处理完请求,将响应数据返回给nginx
    • 此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值
    • 客户端接收请求,并保存带route的cookie
    • 当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器

注意:sticky模块的使用是收费的。
1)首先关闭nginx,nginx -s stop,安装unzip解压软件:
在这里插入图片描述

2)解压下载好的sticky模块安装包:
在这里插入图片描述

3)进入nginx-1.18.0下,进行覆盖配置,输入./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42,其中–add-module表示添加模块:
在这里插入图片描述

4)编译和安装:
在这里插入图片描述

5)编辑nginx主配置文件,upstream内添加sticky模块:
在这里插入图片描述

6)进行语法检测nginx -t、开启nginx和nginx重新加载:
在这里插入图片描述

7)在浏览器测试,此时刷新浏览器后,访问的还是server3;只有清除了浏览器的cookie数据,此时才会访问server2,并且刷新后,依旧访问的是server2:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_54719086/article/details/115402254