lnmp架构——nginx的负载均衡

  • 1 什么是nginx
  • 2 nginx的作用
  • 3 nginx的特点
  • 4 nginx的安装以及优化
    • 4.1 安装nginx
    • 4.2 优化
  • 5 nginx主配置文件操作
    • 5.1 修改nginx进程运行用户以及用户组
    • 5.2 实现负载均衡
    • 5.3 控制用户并发访问数量
    • 5.4 修改nginx的调度算法
    • 5.5 设定RS在负载均衡调度中的状态
    • 5.6 nginx会话保持--sticky模块

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:

lnmp架构——nginx的负载均衡相关推荐

  1. 架构设计:负载均衡层设计方案(3)——Nginx进阶

    架构设计:负载均衡层设计方案(3)--Nginx进阶 请注明来源:http://blog.csdn.net/yinwenjie(未经允许严禁用于商业用途!) https://blog.csdn.net ...

  2. 架构之软件负载均衡LVS、Nginx、Haproxy、Keepalived

    目前市面上最常见的负载均衡技术方案主要有三种: 基于DNS负载均衡, DNS负载均衡主要适用于的场景是多地集群的方式,也就是可能北京有一个数据中心,在其中部署了一整套的集群提供服务,在上海有一个数据中 ...

  3. Nginx+keepalived负载均衡高可用篇第③版

    Nginx+keepalived负载均衡高可用篇第③版 对付中.小型企业,假如没有资金去购买昂贵的四/七层负载均衡交换机,那么Nginx是不错的七层负载均衡选择,并且可以通过Nginx + Keepa ...

  4. Nginx+Tomcat 负载均衡集群方案

    2019独角兽企业重金招聘Python工程师标准>>> Nginx+Tomcat 负载均衡集群方案 该方案是我之前做过的一个项目生产应用的,目前运行良好,如何您生产使用,请先做好测试 ...

  5. Nginx之负载均衡(四)

    在上一篇博客我们介绍了 Nginx 一个很重要的功能--代理,包括正向代理和反向代理.这两个代理的核心区别是:正向代理代理的是客户端,而反向代理代理的是服务器.其中我们又重点介绍了反向代理,以及如何通 ...

  6. Nginx简介及使用Nginx实现负载均衡的原理【通俗易懂,言简意赅】

    nginx 这个轻量级.高性能的 web server 主要可以干两件事情:〉直接作为http server(代替apache,对PHP需要FastCGI处理器支持):〉另外一个功能就是作为反向代理服 ...

  7. Nginx+Tomcat负载均衡

    Nginx+Tomcat 负载均衡集群方案 该方案是我之前做过的一个项目生产应用的,目前运行良好,如何您生产使用,请先做好测试. 系统架构图 下载软件包 [root@Nginx-node1 src]# ...

  8. 大型网站系统架构系列:负载均衡详解(一)

    大型网站系统架构系列:负载均衡详解(一) 2016-03-20 架构说 面对大量用户访问.高并发请求,海量数据,可以使用高性能的服务器.大型数据库,存储设备,高性能Web服务器,采用高效率的编程语言比 ...

  9. 转:大型网站架构系列:负载均衡详解(2)

    一.软件负载均衡概述 硬件负载均衡性能优越,功能全面,但是价格昂贵,一般适合初期或者土豪级公司长期使用.因此软件负载均衡在互联网领域大量使用.常用的软件负载均衡软件有Nginx,Lvs,HaProxy ...

最新文章

  1. etcd 笔记(05)— etcd 代码结构、各模块功能、整体架构、各模块之间的交互、请求和应答流程
  2. OpenResty中遇到Can't locate Time/HiRes.pm in @INC问题的解决方法
  3. 深入浅出理解Paxos算法
  4. 碰上摩尔纹怎么办?这5招帮你解决!
  5. OVS DPDK vhost-user搭建全过程(四十四)
  6. jquery $.each()函数编程实例五则图解
  7. 除了Kaggle,还有哪些高质量的数据科学竞赛平台?
  8. 如何在Windows 10上使用触摸板手势
  9. 论文浅尝 - ICLR2020 | Pretrained Encyclopedia: 弱监督知识预训练语言模型
  10. 钉钉密聊安不安全 钉钉密聊别人能看到吗
  11. IDEA安装MySQL版本以及驱动jar包下载问题
  12. 计算机基础知识ppt操作题,计算机一级ppt操作题
  13. ffmpeg 转码及多线程处理
  14. 网站建设合同- 范文格式
  15. 佳能EOS 500D、尼康D5000、宾得Kx PK 纠结!
  16. 如何将SCH 与DSN 文件转化
  17. CM201-1广东移动盒子YS版(易视腾代工)TTL方式保留原系统 或不保留原系统方法
  18. HDU 4415 Assassin’s Creed
  19. 再见,马云!再见,世界首富!
  20. 【效率神器】电脑上实现语音输入文字

热门文章

  1. 帮小猴子准备的高数知识点
  2. 华为年薪200万招募的“天才少年”,一句话让我陷入了深思
  3. Cell子刊:人类微生物组参考基因集中的单体基因
  4. pandas基于dataframe特定数据列的指定阈值将原dataframe分割成两个dataframe(split dataframe based on column value threshold
  5. R语言编写自定义函数、创建使用ggplot2生成图标(icon)的主题(theme)函数、使用ggplot2以及自定义的图标主题函数创建箱图(boxplot)图标、ggsave保存图标(png、svg
  6. R语言计算回归模型的SST、SSR以及SSE指标实战
  7. R可视化使用ggplot2创建样本数据热力图(heatmap)
  8. 社会网络计算与社会网络分析、核心指标有哪些?社会网络计算有什么意义?
  9. 广义线性模型?链接函数?sigmoid和softmax?Logistic处理多分类问题?logistic回归处理超大数据?使用logistic和randomsearch进行组合获取最优参数组合、优缺点
  10. GEO芯片数据探针id转化