只知道 Nginx 牛逼,却不知道它怎么支持百万并发?

幸运
185
文章
0
评论
March 15, 202009:38:54 评论 94 3248字阅读10分49秒
只知道 Nginx 牛逼,却不知道它怎么支持百万并发?
 

Nginx是一个免费的,开源的,高性能的HTTP服务器和反向代理。以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。Nginx是一个Web服务器,也可以用作负载均衡器和HTTP缓存。

很多高知名度的网站都使用Nginx,比如:Netflix,GitHub,SoundCloud,MaxCDN等。

1.Nginx的整体架构

只知道 Nginx 牛逼,却不知道它怎么支持百万并发?

1.1.主进程

Nginx启动时,会生成两种类型的进程,一个是主进程(master),一个(windows版本的目前只有一个)或多个工作进程(worker)。

主进程并不处理网络请求,主要负责调度工作进程,也就是图示的3项:加载配置、启动工作进程、非停升级

因此,Nginx启动以后,查看操作系统的进程列表,我们就能看到至少有两个Nginx进程。

1.2.工作进程

服务器实际处理网络请求及响应的是工作进程(worker),在类unix系统上,Nginx可以配置多个worker,而每个worker进程都可以同时处理数以千计的网络请求。

1.3.模块化设计

Nginx的worker进程,包括核心和功能性模块,核心模块负责维持一个运行循环(run-loop),执行网络请求处理的不同阶段的模块功能。

比如:网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。

而其代码的模块化设计,也使得我们可以根据需要对功能模块进行适当的选择和修改,编译成具有特定功能的服务器。

1.4.事件驱动模型

基于异步及非阻塞的事件驱动模型,可以说是Nginx得以获得高并发、高性能的关键因素,同时也得益于对Linux、Solaris及类BSD等操作系统内核中事件通知及I/O性能增强功能的采用,如kqueue、epoll及eventports。

1.5.代理(proxy)设计

代理设计,可以说是Nginx深入骨髓的设计,无论是对于HTTP,还是对于FastCGI、Memcache、Redis等的网络请求或响应,本质上都采用了代理机制。所以,Nginx天生就是高性能的代理服务器。

2.Nginx的模块化设计

高度模块化的设计是Nginx的架构基础。Nginx服务器被分解为多个模块,每个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,低耦合”的原则。

如下图所示:

只知道 Nginx 牛逼,却不知道它怎么支持百万并发?

2.1.核心模块

核心模块是Nginx服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。

2.2.标准HTTP模块

标准HTTP模块提供HTTP协议解析相关的功能,比如:端口配置、网页编码设置、HTTP响应头设置等等。

2.3.可选HTTP模块

可选HTTP模块主要用于扩展标准的HTTP功能,让Nginx能处理一些特殊的服务,比如:Flash多媒体传输、解析GeoIP请求、网络传输压缩、安全协议SSL支持等。

2.4.邮件服务模块

邮件服务模块主要用于支持Nginx的邮件服务,包括对POP3协议、IMAP协议和SMTP协议的支持。

2.5.第三方模块

第三方模块是为了扩展Nginx服务器应用,完成开发者自定义功能,比如:Json支持、Lua支持等。

3.Nginx的请求方式处理

Nginx是一个高性能的Web服务器,能够同时处理大量的并发请求。它结合多进程机制和异步机制,异步机制使用的是异步非阻塞方式,接下来就给大家介绍一下Nginx的多线程机制和异步非阻塞机制。

3.1.多进程机制

服务器每当收到一个客户端时,就有服务器主进程(master process)生成一个子进程(worker process)出来和客户端建立连接进行交互,直到连接断开,该子进程就结束了。

使用进程的好处是各个进程之间相互独立,不需要加锁,减少了使用锁对性能造成影响,同时降低编程的复杂度,降低开发成本。

其次,采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,master进程则很快启动新的worker进程,确保服务不会中断,从而将风险降到最低。

缺点是操作系统生成一个子进程需要进行内存复制等操作,在资源和时间上会产生一定的开销。当有大量请求时,会导致系统性能下降。

3.2.异步非阻塞机制

每个工作进程使用异步非阻塞方式,可以处理多个客户端请求。

当某个工作进程接收到客户端的请求以后,调用IO进行处理,如果不能立即得到结果,就去处理其他请求(即为非阻塞),而客户端在此期间也无需等待响应,可以去处理其他事情(即为异步)

当IO返回时,就会通知此工作进程,该进程得到通知,暂时挂起当前处理的事务去响应客户端请求。

4.Nginx事件驱动模型

在Nginx的异步非阻塞机制中,工作进程在调用IO后,就去处理其他的请求,当IO调用返回后,会通知该工作进程。

对于这样的系统调用,主要使用Nginx服务器的事件驱动模型来实现,如下图所示:

只知道 Nginx 牛逼,却不知道它怎么支持百万并发?

如上图所示,Nginx的事件驱动模型由事件收集器、事件发送器和事件处理器三部分基本单元组成。

事件收集器:负责收集worker进程的各种IO请求;

事件发送器:负责将IO事件发送到事件处理器;

事件处理器:负责各种事件的响应工作。

事件发送器将每个请求放入一个待处理事件列表,使用非阻塞I/O方式调用事件处理器来处理该请求。

其处理方式称为“多路IO复用方法”,常见的包括以下三种:select模型、poll模型、epoll模型。

5.Nginx进程处理模型

Nginx服务器使用 master/worker 多进程模式,多线程启动和执行的流程如下:

主程序Masterprocess启动后,通过一个for循环来接收和处理外部信号

主进程通过fork()函数产生worker子进程,每个子进程执行一个for循环来实现Nginx服务器对事件的接收和处理

一般推荐worker进程数与CPU内核数一致,这样一来不存在大量的子进程生成和管理任务,避免了进程之间竞争CPU资源和进程切换的开销。

而且Nginx为了更好的利用多核特性,提供了CPU亲缘性的绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来Cache的失效。

对于每个请求,有且只有一个工作进程对其处理。首先,每个worker进程都是从master进程fork过来。在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。

所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢占accept_mutex

抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。

当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,一个完整的请求就是这样。

我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

如下图所示:

只知道 Nginx 牛逼,却不知道它怎么支持百万并发?

在Nginx服务器的运行过程中,主进程和工作进程需要进程交互。交互依赖于Socket实现的管道来实现。

5.1.主进程与工作进程交互

这条管道与普通的管道不同,它是由主进程指向工作进程的单向管道,包含主进程向工作进程发出的指令工,作进程ID等。同时主进程与外界通过信号通信;每个子进程具备接收信号,并处理相应的事件的能力。

5.2.工作进程与工作进程交互

这种交互和主进程-工作进程交互基本一致,但是会通过主进程间接完成,工作进程之间是相互隔离的。

所以当工作进程W1需要向工作进程W2发指令时,首先找到W2的进程ID,然后将正确的指令写入指向W2的通道,W2收到信号采取相应的措施。

本文来源于:只知道 Nginx 牛逼,却不知道它怎么支持百万并发?-幸运草博客
特别声明:以上文章内容仅代表作者本人观点,不代表幸运草博客观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与幸运草联系。

  • 本站QQ群
  • weinxin
  • 捐赠本站
  • weinxin
Nginx手把手安装 Nginx

Nginx手把手安装

Netcraft 发布了2018年1月 Web 服务器调查报告,排名前三的依然是 Microsoft、Apache 和 nginx 。 Nginx为什么值得学习呢?可以看这篇文章 → Nginx的优点 (我保证可以点进去) 1.系统环境准备 安装Nginx,一般都是选择linux环境下安装。可以在虚拟机里面搭建一个或者在阿里云、腾讯云、滴滴云等买一个相对便宜的。 2.环境调试确认 网络畅通,ping 一下百度,查看公网连通性 √ yum可用,yum list | grep gcc ,查看yum源是否可用。√ 关闭iptables,可以使用iptables -L 查看是否存在iptables规则;关闭:iptables -F 关闭selinux,使用 getenforce ,  查看状态,使用 setenforce 0  关闭selinux。 安装库: yum -y  install gcc gcc-c++ autoconfig pcre pcre-devel make automake yum -y  install wget  httpd-tools vim 3.配置Nginx的yum源 进入官网 nginx.org,打开下载页面,可以看到三个模块: 继续往下拉,我选择使用yum安装nginx 按照官网文档说明,步骤如下: 创建文件 nginx.repo,执行命令 vi /etc/yum.repos.d/nginx.repo 按i 输入以下内容: name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 提示:标红部分按照你的实际情况做相应的替换。版本号写大版本即可,比如 7 不写7.3这样的 使用:lsb_release -a 可以查看你的l机器的版本。(这个命令适用于所有的Linux发行版,包括Redhat、SuSE、Debian…等发行版) 使用:cat /etc/redhat-release (仅限REDHAT系列的linux使用) 配置完毕之后,按Esc之后,输入 :wq 保存退出。 检查yum源,输入yum list | grep nginx 4.开始安装 安装:yum install nginx 等待.... 安装完毕使用 nginx -v查看安装是否成功 本文来源于:Nginx手把手安装-幸运草博客 特别声明:以上文章内容仅代表作者本人观点,不代表幸运草博客观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与幸运草联系。
nginx实例 - 如何防止大图片占满带宽? Nginx

nginx实例 – 如何防止大图片占满带宽?

场景 前几天网站出现了访问缓慢的情况,查看系统资源状况后,发现出网带宽一直是占满的状态 查看服务器日志,发现了很多10M左右的超大图片的请求,这些图片占满了带宽,严重影响了其他的访问请求 正常情况下是应该访问缩放过的小图,一般在100K以内,查找问题和修改程序来不及,需要紧急处理 想到的方法就是对大图的加载进行限速 配置 修改nginx配置文件中图片访问的配置部分 思路: 对于正常小图的访问不限制,把正常图的大小限定为 100K 以内,超出时就进行限速,速度限定为最大 100k/s location ~ .*.(gif|jpg|jpeg|png|bmp)$ { expires 30d; limit_rate_after 100k; limit_rate 100k; } limit_rate_after 100k; limit_rate 100k; 这两句的意思就是当图片加载了100k以后进行限速,最高 100k 测试 测试服务器带宽为1M,准备了一张3.3M的图片 分别测试限速前后的网络情况,使用网络监控命令进行查看 限速前 访问图片,查看网络流量状态,速度一直保持在 130k/s 左右,正好为1M带宽的满载状态 限速后 访问图片,查看网络流量状态,速度一直保持在 100k/s 左右,说明限速成功 本文来源于:nginx实例 - 如何防止大图片占满带宽?-幸运草博客 特别声明:以上文章内容仅代表作者本人观点,不代表幸运草博客观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与幸运草联系。
Nginx网站服务 Nginx

Nginx网站服务

1、Nginx:(优点) (1)高性能、轻量级web服务软件 (2)稳定性高 (3)系统资源消耗低 (4)对http并发连接的处理能力强 2、apache和nginx的区别: Apache:是多进程web服务,适合cpu密集型业务  如:数据库查询、计算等。 Nginx:是单进程web服务,适合磁盘IO密集型业务 如:视频,音频网站。并发能力强。 在企业中经常使用nginx和apache结合,前端为nginx,处理高并发进行调度;后端由多台apache进行业务响应,实现负载均衡。 3、Nginx的安装 (1)安装支持软件 pcre-devel           zlib-devel (2)创建运行用户、组 Useradd  -M  -s  /sbin/nologin  nginx (3)编译安装 ./configure  --prefix=/usr/local/nginx  --user=nginx --group=nginx  --with-http_stub_status_module(状态统计模块) 4、Nginx的运行控制 nginx  -t            检查nginx语法 启动nginx         nginx     端口号:80 重新加载nginx     killall -s  HUP  nginx 退出nginx         killall -s  QUIT  nginx 杀死nginx         killal -s  KILL  nginx 5、主配置文件nginx.conf的配置项:路径:/usr/local/nginx/conf/nginx.conf (1)全局配置 worker_processes        工作进程数 (2)I/O配置:使用”events{ }”界定标记 worker_connections       每进程处理连接数 (3)HTTP配置:包括日志、端口及IP、网页目录、默认字符集、连接保持时间、虚拟主机、PHP解析等 (子标记:server{ }代表一个虚拟主机) 6、LNMP:Linux、Nginx、Mysql、PHP (1)由于nginx不能直接支持PHP,编译安装PHP时 必须启用fpm模块以解析PHP网页。(--enable-fpm) php-fpm进程    端口号为:9000 启动命令:php-fpm或 /usr/local/sbin/php-fpm(安装php时创建了链接文件) 停止命令:killall  php-fpm (2)也可以使用LAMP服务器最为代理解析PHP动态网页 本文来源于:Nginx网站服务-幸运草博客 特别声明:以上文章内容仅代表作者本人观点,不代表幸运草博客观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与幸运草联系。
nginx配置二级域名 Nginx

nginx配置二级域名

主机域名配置那些事 server_name 匹配顺序 nginx中的server_name是用于指定基于名称的虚拟主机,匹配顺序是在配置文件中检索,从上到下,一匹配到符合的则终止,所以配置得按照精准在上,模糊在下来配置。server在配置文件中可以有多个哦。 精准的server_name: server {   listen 80;   server_name test.org www.test.org } *通配符匹配 server {   listen 80;   server_name *.test.org } server {   listen 80;   server_name www.*; } 正则匹配 server {   listen 80;   server_name ~^(?<www>.+).test.org$; } 例子 一个server块配置多个站点 server {   listen 80;   server_name ~^(www.)?(.+)$;   index index.html index.htm;   root /data/www/$2; } 这样的站点意思是匹配所有www开头的,$2对应正则匹配的第二块,也就是(.+)路径,路径自行创建指定,确保有权限,实际目录结构如下: /data/www/test.org /data/www/test123.org /data/www/baidu.com 一个server块中匹配多个二级域名 server {   listen 80;   server_name ~^(.+)?.test.org$;   index index.html;   if ($host = test.org) {       rewrite ^http://www.test.org permanent;   }   root /data/www/test.org/$1; } 对应匹配如下: /data/www/test.org/www /data/www/test.org/hello /data/www/test.org/world...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: