nginx为什么这么受企业欢迎?看完这边文章你就懂了

  一. 讲在Nginx之前

  1.同步与异步

  

  同步与异步的重点在消息通知的方式上,也就是调用结果的通知方式不同。

  同步:当一个同步调用发出去后,调用者要一直等待调用的结果通知后,才能进行后续的执行。

  异步:当一个异步调用发出去后,调用者不必一直等待调用结果的返回,异步调用,要想获得结果,一般有两种方式:

  1、主动轮询异步调用的结果;

  2、被调用方通过callback(回调通知)来通知调用方调用结果。

  1.1实例解释

  同步取快递:小明收到快递将送达的短信,在楼下一直等到快递送达。

  异步取快递:小明收到快递将送达的短信,快递到楼下后,小明再下楼去取。

  异步取快递,小明知道快递到达楼下有两种方式:

  1、不停电话问快递小哥到了没有,即主动轮询;

  2、快递小哥到楼下后,打电话通知小明,然后小明下楼取快递,即回调通知。

  2.阻塞与非阻塞

  

  阻塞与非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,当前进/线程是挂起状态,还是非挂起状态。

  阻塞:调用在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活

  非阻塞:调用在发出去后,不会阻塞当前进/线程,而会立即返回。

  2.1实例解释

  阻塞取快递:小明收到快递即将送达的信息后,什么事都不做,一直专门等快递。

  非阻塞取快递:小明收到快递即将送达的信息后,等快递的时候,还一边敲代码、一边刷微信。

  同步与异步,重点在于消息通知的方式;阻塞与非阻塞,重点在于等消息时候的行为。

  所以,就有了下面4种组合方式

  同步阻塞:小明收到信息后,啥都不干,等快递;

  同步非阻塞:小明收到信息后,边刷微博,边等着取快递;

  异步阻塞:小明收到信息后,啥都不干,一直等着快递员通知他取快递;

  异步非阻塞:小明收到信息后,边刷着微博,边等快递员通知他取快递

  大部分程序的I/O模型都是同步阻塞的,单个进程每次只在一个文件描述符上执行I/O操作,每次I/O系统调用都会阻塞,直到完成数据传输。传统的服务器采用的就是同步阻塞的多进程模型。一个server采用一个进程负责一个request的方式,一个进程负责一个request,直到会话结束。进程数就是并发数,而操作系统支持的进程数是有限的,且进程数越多,调度的开销也越大,因此无法面对高并发。

  Nginx采用了异步非阻塞的方式工作。我们先来先了解一下I/O多路复用中的epoll模型。

  3.epoll模型

  当连接有I/O事件产生的时候,epoll就会去告诉进程哪个连接有I/O事件产生,然后进程就去处理这个事件。

  例如:小明家楼下有一个收发室,每次有快递到了,门卫就先代收并做了标记;然后通知小明去取送给小明的快递。

  4.为什么Nginx比其他web服务器并发高(Nginx工作原理)

  Nginx配置use epoll后,以异步非阻塞方式工作,能够轻松处理百万级的并发连接。

  处理过程:每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到可能发生阻塞的地方。比如向后端服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果后端服务器返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有新的request 进来,他就可以很快再按这种方式处理。而一旦后端服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的。

  4.1进程管理上的区别

  Apache:

  默认采用的是一个主进程 多个工作进程 每个工作进程管理一个线程 每

  个线程管理一个连接

  并发数 = 工作进程数 x 1

  Nginx:

  一个主进程 多个工作进程 每个工作进程管理多个线程(最大到65535)

  并发数 = 工作进程数 x 单进程开启的线程数

  淘宝等电商用的web浏览器 Tengine ,相当与Nginx的换皮,通过nginx开源项目针对电商优化的产品

  4.2网络IO模型的选择

  Apache:select模型

  Nginx:epoll模型

  select就是一个简单的选择模型(如排队请求网络资源,第一个人阻塞住第二个人

  依然要排着)

  epoll更智能的网络管理模型(如排队第一个人阻塞住,会先把第二个人网络的 IO

  请求提交出来)

  4.3进程的阻塞方式的区别

  Apache:同步 阻塞型

  Nginx:异步 非阻塞型

  4.4模块开发方向不同

  Apache:安全模块众多

  Nginx:高性能模块众多

  总结:如果网站并发量不高但是稳定性要求严格,选择Apache(政府网站、

  网络服务——Apache & Nginx

  5.nginx和apache的差异对比

  

  6.nginx配置文件详解

  二. Nginx详解

  1.概述

  Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的http://Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。

  Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是内存利用率高,并发能力强。

  2.工作模式

  nginx有两种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。

  2.1master-worker

  该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为这种模式有以下优点:

  1. 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。

  2. 配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能

  3. 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)

  2.2单进程模式

  单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。(了解)

  三.Nginx相关搭建实验

  1.yum安装nginx

  主配置文件:/etc/nginx/nginx.conf

  网站文件存放默认目录 :/usr/share/nginx/html

  <注意事项>

  1. 注意配置文件中的结尾有;作为结束~!(切记!)

  2. 每次实验修改完配置文件后需要热重启nginx才会生效

  1.1nginx安装流程

  1.2主配置文件

  1.3子配置文件

  2.源码包安装nginx

  实验准备:CentOS7.6版本192.168.132.163

  Windows浏览器中输入192.168.132.163访问,发现如下页面,nginx运行正常:

  实验1:Nginx的状态统计

  实验步骤:首先安装nginx服务

  搜素/root找到如下图的内容,在光标下方新增一行:新增一行下方添加如下内容:

  

  Windows浏览器访问192.168.132.163,访问首页成功,如下图:Windows浏览器访问192.168.1321.63/status/访问结果如下图:

  此时状态统计功能开启了,每刷新一次。第三列的数字便会+1,代表的是访问次数,如图:前两列是TCP连接次数,与配置文件中设置的keepalive_timeout=65有关,代表着每65秒会断开TCP连接,所以等到65秒后再刷新页面,会变成2 +2+访问次数,如图

  "Active connections"表示当前的活动连接数;

  "server accepts handled requests"表示已经处理的连接信息

  三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数

  实验2:nginx目录保护

  实验步骤:接上一个实验,对状态统计页面的目录进行保护

  找到如下图内容:在access_log off;下方添加如下两行内容:

  再次用windows浏览器访问192.168.132.163/status/页面,则弹出了需要输入账号密码的页面,如图:输入刚刚创建的用户lisi,密码123456就可以进入状态统计页面了。

  实验3:基于IP的身份验证

  实验步骤:接上一个实验进行

  找到如图内容:在光标下方新增如下内容:

  用windows浏览器访问192.168.132.163/status/能访问到输入账号密码界面,输入账号密码后能访问到状态统计页面,再打开一条Linux图形化界面版本,用Linux的浏览器访问192.168.132.163/status/,能访问到输入账号密码界面,输入账号密码后不能访问到状态统计页面。

  实验4:nginx的虚拟主机(基于域名)

  实验步骤:接上一个实验继续做

  找到如图中的内容,将其删除找到如下图内容, 将location / { 和 } 删除,删除后如图:将如下图中不必要的内容删除:

  删除后如下图:然后对上图进行修改:

  将server_name localhost; 修改为server_name blog.hongfuedu.com;将access_log logs/host.access.log main; 修改为access_log logs/blog.access.log main;将root html; 修改为root html/blog;

  修改为如下图:

  将上图7行未注释内容复制粘贴到后面进行修改

  将其中的blog都修改成bbs即可,如图:

  找到如图中的三行内容,将其取消注释,不然会报错

  新增192.168.132.163 http://blog.hongfuedu.com和192.168.132.163 http://bbs.hongfuedu.com两行内容在windows的hosts文件中也要添加这两行内容用windows的cmd窗口ping http://blog.hongfuedu.com,可以ping通。说明解析没问题

  用windows浏览器分别访问http://blog.hongfuedu.com和http://bbs.hongfuedu.com,结果如下图:

  a、提前准备好两个网站的域名,并且规划好两个网站网页存放目录

  b、在Nginx主配置文件中并列编写两个server标签,并分别写好各自信息

  c、分别访问两个不同的域名验证结果

  实验5:nginx的反向代理

  代理和反向代理?

  代理:找别人代替你去完成一件你完不成的事(代购),代理的对象是客户端

  反向代理:替厂家卖东西的人就叫反向代理(烟酒代理) ,代理的对象是服务器端,

  反向代理+负载均衡:比如windows客户端访问Nginx服务器,然后Nginx服务器将请求转发到后台的服务器组内,实现任务均摊的模式。

  完全反向代理:所有的来自客户端的请求都由192.168.88.100服务器来处理location / {proxy_pass http://192.168.88.100:80;}

  部分反向代理:(动静态分离)来自客户端的.php的网页请求才由192.168.88.100服务器来处理location \ .php$ {proxy_pass http://192.168.88.100:80;}

  静态算法:仅考虑算法本身的工作方式,不考虑后台服务器的运行状况,缺点是很可能导致某些低配置服务器压力过大或者某些高配置服务器闲置。

  动态算法:详见负载均衡服务(集群阶段)

  Nginx:高并发特点,一般用于前台接受客户端请求

  Apache:高稳定性特点,一般用于后台处理由Nginx服务请接受并转发过来的来自客户端的请求。

  a、在另外一台机器上安装apache,启动并填写测试页面

  b、在nginx服务器的配置文件中添加(写在某一个网站的server标签内)location / {proxy_pass http://ip; #此处填写apache服务器的IP地址}

  c、重启nginx,并使用客户端访问测试

  实验步骤:

  实验准备四台虚拟机

  1号机:192.168.132.163 Nginx服务器

  2号机:192.168.132.164 Apache服务器1

  3号机:192.168.132.165 Apache服务器2

  4号机:192.168.132.166 2号机和3号机的共享存储服务器

  二号机进行如下操作:

  用windows浏览器访问192.168.132.164,结果如图:

  三号机进行如下操作:

  用windows浏览器访问192.168.132.165,结果如图:

  一号机:

  找到如下图内容:将#user nobody;修改为user nginx;将worker_processes 1;修改为worker_processes auto;

  找到如图中的内容:将# proxy_pass http://127.0.0.1;复制一下

  找到如下图中的内容:将复制到的内容粘贴到index index.html index.htm;下一行取消注释并修改为:

  proxy_pass http://192.168.132.164; (反向代理)

  此时再用windows浏览器访问192.168.132.163,结果如下图:

  实验6:负载调度(负载均衡)

  负载均衡(Load Balance)其意思就是将任务分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

  upstream 可以将多台服务器声明成一个服务器组(也叫)

  proxy 反向代理模块,可以代理一台设备或者是一组服务器,模板如下:

  实验步骤;在实验五的基础上做

  修改为配置文件后如图:

  此时用windows浏览器访问192.168.132.163,发现第一次访问结果为hello-164...,刷新一下之后结果为hello-165...再刷新一下变成了hello-164...再刷新变成了hello-165...,两台Apache服务器依次轮询处理

  添加加权轮询:添加后如图:

  重启一号机Nginx服务:

  此时再次用windows浏览器访问192.168.132.163,发现第一次访问结果为hello-164...,刷新一下之后结果为hello-165...再刷新一下变成了hello-165...再刷新变成了hello-164...,两台Apache服务器依次轮询加权处理,因为配置文件中Apache服务器1的加权值为1,Apache服务器2的加权值为2,所以windows浏览器访问Nginx服务器时,Apache服务器1代理处理一次,Apache服务器2就代理处理两次。

  实验7:samba服务-网络共享存储(CIFS文件系统)

  samba主配置文件:配置文件路径:/etc/samba/smb.conf

  配置文件模板:

  实验步骤:在实验56的基础上做

  实验目的:将samba服务器的/data目录共享给192.168.132.164机器的/var/www/html/网页目录将samba服务器的/data目录共享给192.168.132.165机器的/var/www/html/网页目录开启四号机,并安装samba服务 :

  切记先清空所有机器的防火墙规则!!!登录4号机的samba存储服务,如图:登录samba之后ls查看一下是空的,然后put 文件名上传一个文件,ls查看一下上传成功了,如图:

  一般情况下要将samba服务器挂载到三号机和三号机的本地,命令:

  永久挂载:/etc/fstab:

  //服务器ip/服务器共享 /本地挂载目录 cifs defaults,username=xxx,password=xxx 0 0

  在2号机内进行如下操作:

  登录三号机安装命令:

  登录samba服务的存储服务

  Ls查看一下发现有2号机上传的文件anaconda-ks.cfg和创建的index.html文件,如图:[root@localhost ~]# vim /etc/fstab 永久挂载,添加://192.168.132.166/hf2106 /var/www/html cifs defaults,username=lisi,password=123456 0 0[root@localhost ~]# mount -a[root@localhost ~]# df -h[root@localhost ~]# cd /var/www/html/[root@localhost html]# touch index.html[root@localhost html]# echo "nihao pengyou" >> index.html 准备进行测 Windows浏览器访问192.168.132.163继续刷新,输出如下:

  

  登录4号机

  

  说明samba共享存储已实现!

  实验8:nginx实现https {证书+rewrite}

  实验步骤:

  实验准备,基于实验四,并在主配置文件中添加反向代理和负载均衡内容,如图:

  先找到如下图三行反向代理模块,将其注释掉,记得检查所有的括号是不是成对的。

  [root@blog conf]# nginx -t 检查配置文件语法

  [root@blog conf]# nginx -s reload 重启

  用windows浏览器访问blog.hongfuedu.com ,访问结果如下,说明反向代理已关闭

  [root@blog conf]# vim nginx.conf 打开主配置文件

  找到加密模块并将其取消注释,如下图:

  进行修改,将server_name localhost;修改为server_name blog.hongfuedu.com;、

  将root html;修改为root html/blog;

  location / { 可以删除掉,然后进行整理,整理后的内容如下:

  [root@blog conf]# mkdir ssl

  [root@blog conf]# cd ssl/

  [root@blog ssl]# openssl genrsa -out blog.key 1024 生成密钥文件

  [root@blog ssl]# openssl req -new -key blog.key -out blog.csr 生成未签字证书

  [root@blog ssl]# openssl x509 -req -days 365 -sha256 -in blog.csr -signkey blog.key -out blog.crt生成签字证书

  [root@blog ssl]# ls 查看一下有三个文件生成

  [root@blog ssl]# cd ..

  [root@blog conf]# vim nginx.conf 打开配置文件

  找到如下图内容进行修改:

  将ssl_certificate cert.pem;修改为ssl_certificate ssl/blog.crt;

  将ssl_certificate_key cert.key;修改为ssl_certificate_key ssl/blog.key;

  用windows浏览器访问https://blog.hongfuedu.com,访问成功,结果如下

  找到如下图所在的内容,在access_log logs/blog.access.log main;下一行添加:

  rewrite ^(.*)$ https://blog.hongfuedu.com/$1;

  再用windows浏览器访问http://blog.hongfuedu.com,但是访问成功后域名强制变成了https://blog.hongfuedu.com,如下图:

  ————————————————

  版权声明:本文为CSDN博主「「已注销」」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

  原文链接:https://blog.csdn.net/weixin_46659843/article/details/124522333