nginx-1:简介

参考:https://blog.csdn.net/qq_29677867/article/details/90112120

 

一、nginx 功能介绍

  nginx 因为它的稳定性,丰富的模块库,灵活的配置和低系统资源的消耗而闻名。业界一致认为他是 Apache2.2+mod_proxy_balancer 的轻量级代替者,不仅是因为响应静态页面的速度非常快,而且他的模块数量达到 Apache 的 2/3。对 proxy 和 rewrite 模块的支持很彻底,还支持 mod_fcgi、ssl、vhosts。

  nginx 和 Apache 一样使用模块化设计,nginx 模块包括内置模块和第三方模块,其中内置模块中包含主模块和事件模块。

 

二、nginx 可以提供的服务

  1. web 服务

  2. 负载均衡(反向代理)

  3. web cache(web缓存)

 

三、nginx 的优点

  1. 对静态小文件做到高并发

  2. 占用资源少,2万并发,10个线程,内存消耗几百M

  3. 功能种类比较多,web,cache,proxy,每个功能都不是特别强

  4. 支持 epoll 模型,使得 nginx 可以支持高并发

  5. nginx 配合动态服务和 Apache 有区别(FASTCGI接口)

  6. 利用 nginx 可以对 IP 限速,可以限制连接数

  7. 配置简单,更灵活

 

四、nginx 应用场合

  1. 静态服务器(图片、视频),另一个 lighttpd。并发几万,html,js,css,flv,jpg,gif 等

  2. 动态服务,nginx——fastcgi 的方式运行 php,jsp。为什么 fastcgi 呢?CGI 协议虽然解决了语言解析器和 web server 之间通讯的问题,但是它的效率很低,因为 web server 每收到一个请求都会创建一个 CGI 进程,请求结束再关闭进程,对于每一个创建的 CGI 进程都会执行这些操作,所以效率很低, 而 FastCGI 是用来提高 CGI 性能的,FastCGI 每次处理完请求后不会关闭进程,而是保留这个进程,使这个进程可以处理多个请求,这样的话,每个请求都不用再重新创建一个进程了,大大提升了处理效率。

  3. 反向代理,负载均衡。日 pv2000w 以下,都可以直接用 nginx 做代理

  4. 缓存服务。类似 SQUIDVARNISH(Squid 是一种用来缓冲 Internet 数据的软件。如果一个人想下载一个 web 页面,他请求 Squid 为他取得这个页面,Squid 随之连接到远程服务器,并向这个页面发出请求。然后,Squid 显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时,Squid 可以简单地从磁盘中读到它,那样数据就会很快传输到客户机上)

 

五、主流 web 服务产品对比说明

  

1. Apache 特性

  1)2.2版本本身稳定强大,据官方说,其 2.4 版本性能更强

  2)prefork 模式取消了进程创建开销,性能很高

  3)处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在于 Apache 本身

  4)高并发时消耗系统资源相对多一些

  5)基于传统的 select 模型

  6)扩展库,DSO 方法

 

2. nginx 特性

  1)基于异步 IO 模型(epoll、kqueue),性能强,能支持上万并发

  2)对小文件支持很好,性能很高(限静态小文件 1M)

  3)消耗代码资源比较低

 

3. lighttpd 

  1)基于异步 IO 模式,性能和 nginx 相近

  2)扩展库是 SO 模式,比 nginx 灵活

 

4. web 服务产品静态数据性能对比

  1)处理静态文件 apache 性能比 nginx 和 lighttpd 要差

  2)nginx 在处理小文件优势更明显

  3)处理静态小文件(小于1M),nginx 和 lighttpd 比 Apache 更有优势,lighttpd 最强

 

5. web 服务产品动态数据性能对比

  1)处理动态内容三者差距不大,瓶颈在后台,不在 web 服务器上。

 

6. 为什么 nginx 的总体性能比 apache 高

  1)nginx 使用最新的 epoll 和 kqueue 网络 IO 模型,而 apache 使用传统的 select 模式

  2)目前 Linux 下能够承受高并发访问的 squid、memcached 都采用的是 epoll 网络 IO 模型

 

7. 如何选择 web 服务器

  静态业务:高并发,采用 nginx、lighttpd(根据自己掌握程度)

  动态业务:采用 nginx 和 apache 均可

  既有静态业务又有动态业务:nginx 或 apache

  动态业务可以由前端代理,根据页面元素的类型,向后转发响应的服务器进行处理

  

六、nginx 实战

 

1. 安装依赖包

  nginx 安装依赖 GCC、openssl-devel、pcre-devel 和 zlib-devel 软件库

 

2. 开始编译

  使用 ./configure --help 查看各个模块的使用情况,使用 --without-http_ssi_module 的方式关闭不需要的模块,使用 --with-http_perl_modules 方式安装需要的模块

  cd nginx-1.15.10/

  ./configure --prefix=/opt/nginx-1.15.10 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module

   make && make install 

 

  cd /usr/local/nginx/sbin

  ./nginx -t  检测配置文件

  ./nginx -s stop  快速停止

  ./nginx -s quit   优雅的停止

  ./nginx -s reload 重启

  kill -QUIT `cat /usr/local/nginx/logs/nginx.pid`

  kill -HUP `cat /data/nginx/nginx.pid`   重启应用新的配置文件

 

七、nginx 监控

  开启 nginx 的监控服务

 

1. 开启状态页

 

   开启的前提是安装时加了这个模块,不然识别不了,需要重新加上监控模块并编译

2. 配置登录密码

3. 访问URL

4. 编写zabbix脚本

 

八、其他

 

  商业版的 nginx plus 通过他的 ngx_http_status_module 提供了比 nginx 更多的监控指标

  

  nginx access log 可以分析收集到很多指标,python 编写的 linux 工具 ngxtop 就实现了对 access log 的分析功能

 

  NDK - ngx_devel_kit。NDK 是一个拓展 nginx 服务器核心功能的模块,第三方模块开发可以基于它来快速实现。NDK 提供函数和宏处理一些基本任务,减轻第三方模块开发的代码量。

 

  nginx lua。nginx 的 lua 模块,可以对 nginx 做定制开发。

 

九、web 服务器事件处理模型

 

  select

  其通过一个 select() 系统调用来监视多个文件描述符的数组,当 select() 返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。select 目前几乎在所有的平台上都支持,具有良好的跨平台支持。

  select 的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在 Linux 上一般是 1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制,

  另外,select() 所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量 TCP 连接处于非活跃状态,但调用 select() 会对所有 socket 进行一次线性扫描,所以这也浪费了一定的开销。

 

  poll

  其和 select 本质没有多少差别,但是 poll 没有最大文件描述符数量的限制。

  poll 和 select 同样存在一个缺点是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。

  另外,select() 和 poll() 将就绪的文件描述符告诉进程后,如果进程没有对其进行 IO 操作,那么下次调用 select() 和 poll() 时,将会再次报告这些文件描述符,所以他们一般不会丢失就绪的消息,这种方式称为 水平触发。

 

  epoll

  直到 Linux2.6 才出现了由内核直接支持的实现方法,那就是 epoll,它几乎具备了之前所说的一切优点,被公认为 Linux2.6 下性能最好的多路 IO 就绪通知方法。

  epoll 可以同时支持水平触发和边缘触发(只告诉进程哪些文件描述符刚刚变成就绪状态,它只说一遍,如果我们没有没有采取行动,那么它将不会再次告知,这种方式称为边缘触发),理论上边缘触发的性能更高一些,但是代码实现相当复杂。

  epoll 同样只告知那些就绪的文件描述符,而且当我们调用 epoll_wait() 获得就绪文件描述符时,返回的不是实际的描述符,而是一个代表就绪描述符数量的值,你只需要去 epoll 指定的一个数组中依次取得相应数量的文件描述符即可,这里也使用了内存映射技术,这样便彻底省掉了这些文件描述符在系统调用时复制的开销。

  另一个本质的改进在于 epoll 采用基于事件的就绪通知方式。在 select/poll 中,进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描,而 epoll 事先通过 epoll_ctl() 来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似 callback 的回调机制,迅速激活这个文件描述符,当进程调用 epoll_wait() 时便得到通知。

 

 

select 文件描述符有最大限制 文件描述符数组用户态和内核态的复制 遍历的扫描
epoll 内存映射技术不用复制 基于事件的就绪通知,不用遍历扫描

posted @ 2020-08-18 13:25  停不下的时光  阅读(313)  评论(0编辑  收藏  举报