1.Nginx特点
Nginx是一个事件驱动架构,而非传统过程驱动架构。具有内存占用低,当并发连接大时,能够预测内存使用率。Nginx改变了传统的web服务器体系架构,提高了响应速度,起初Nginx开发的目标是实现10倍以上的性能,并能够模块化,事件驱动,异步,单线程web服务器和web服务器代理。
(1)Nginx作为web服务器
Nginx使用更少的资源,支持更多连接,更快响应,能够支持高达50000个并发连接的响应,并选用了epoll and kqueue模型。
(2) Nginx作为负载均衡服务器
不仅可以支持Rails和PHP,也可作为HTTP代理服务器。Nginx是使用C语言开发,这使得CPU占有率和系统资源开销比Perbal出色很多。
(3)Nginx作为邮件代理服务器
Nginx最早是作为一个邮件代理服务器,所以它本身就是一个很好的代理服务器。并且安装和配置简单,,升级简单(热升级),bugs非常少。启动简单,几乎可以做到7*24不间断运行,运行数个月也不需要重新启动。
2.Nginx架构
Nginx采用了操作系统中高级事件机制的不断发展的启发,开发了一个模块化,事件驱动,异步,单线程的非阻塞架构。并使用复用和事件通知,用于分离进程的特定任务。在每个worker进程中,nginx可以处理每秒数千个并发连接和请求。这些架构思想,解决了传统web服务器在内存和CPU消耗方面,低效的特点。
(1)代码结构
nginx包括核心和功能模块,核心是维护某些循环的执行,并在请求处理时,执行模块代码适当部分。模块包括了大部分演示和应用层功能。模块的读取和写入网、存储,转换内容,执行出站过滤,应用服务器端包含操作,并在代理启动时将请求传递给上游服务器。
nginx允许扩展web服务器功能,不用修改nginx其它源码,但不支持动态加载模块。即在构建阶段将模块与其核心一起编译。nginx使用一些事件通知机制和磁盘IO性能增强,如kqueue,epoll和事件端口,并优化了复用和高级I/O操作的不同使用方法。主要目的是使得操作系统的提示能够及时,并且能够快速获得入站和出站流量,磁盘操作,读取和写入套接字等。
(2)工作模式
worker进程接受自共享"listen"套接字的新请求,并高效执行循环,处理数千个连接。注意这个过程是没有仲裁或分配与nginx工作的联系,这个worker是由操作系统内核机制完成。启动后,首先创建一组初始侦听套接字,然后worker不断处理HTTP请求,不断接收,读取和写入套接字。
这个直线循环是很复杂部分,包括内部调用,并在很大程度上依赖异步任务处理,异步操作通过模块化,事件通知,广泛使用回调函数和微调定时器来实现。开发的关键原则是尽可能不要阻塞,但是当磁盘空间不够时,应该要阻塞。
nginx由于谨慎使用内存(不会连接一个线程或线程),同时也节省CPU使用周期(没有持续创建和销毁),当初始化新连接,并将其添加到运行循环中,并异步处理指导完成,此时连接被重新分配并从运行循环中删除。为什么CPU使用率低?一般就是结合优化系统调用流程和支持接口(如pool,slab内存分配器),使得在极端工作负载下实现很低的CPU负载。
如何根据磁盘使用和 CPU 负载模式去配置nginx 工作(worker)的数量?
如果负载大多是大量处理TCP/IP,执行SSL或压缩,则worker的数量与CPU核的数量相匹配。如果负载大多是磁盘 I/O 绑定,存储或重代理服务,worker的数量可能是核心数量的一到两倍。
关于worker模式与嵌入式脚本有限支持有关,一个使用标准的 nginx 分发,只支持嵌入 Perl 脚本。由于脚本有意外退出的可能,就可能导致worker挂起,同时影响数千个连接。所以脚本应该更稳定才行。
(3)Nginx进程
主要由主进程和多个worker进程。所有进程都是单线程,进程间通信主要采用共享内存进行通信。主进程作为root用户运行,worker进程,缓存加载器和管理器(nginx特殊用途)则以无权限用户执行。
主进程工作:
1.读取,验证配置
2.创建,绑定和关闭套接字
3.启动,终止和维护配置的worker进程
4.重新配置,无需中断服务
5.重新打开日志文件
6.编译嵌入式perl脚本
worker进程工作:
(1)处理客户端连接
(2)提供反向代理和过滤功能
缓存加载器工作:
(1)检查磁盘缓存项目,使用nginx实例来处理已经存储在磁盘的特定分配的目录结构中的文件,遍历目录,检查缓存内容元数据,更新共享内存的相关条目,然后在退出时再清理。
缓存管理器工作:
(1)主要清理缓存,正常的nginx操作保持在内存中,并且在失败的情况下由主进程重新启动。
3.Nginx缓存
nginx中的缓存是以文件系统的分层数据存储实现。缓存密钥(可配置)和缓存元数据存储在共享存储器段中,通过高速缓存加载器,缓存管理器和worker进程访问。每个缓存的响应都放在文件系统上的不同文件中,并通过不同nginx配置命令进行控制。当响应写入缓存目录结构时,文件的路径和名称将从代理URL的MD5哈希导出。
将数据放在缓存的过程如下:
(1) nginx从上游服务器读取响应,首先写入缓存目录结构之外的临时文件
(2)nginx完成处理请求,将临时文件移动到缓存目录。如果临时文件位于另外一个文件系统,则文件将被复制,因此建议将临时文件目录和缓存目录保存在同一文件系统。
(3)如果要显式删除缓存目录结构,从文件中删除文件也是很安全。
4.安装Nginx
nginx只是实现了http这一层,pcre是负责正则表达式的,正则表达式,只是用在location.conf文件里面。 openssl应用与加密。Zlib应用于压缩。服务器返回客户端的数据,需要压缩的方式。
解压nginx
解压openssl
解压pcre
解压zlib
配置命令:
./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre=/home/qaa/share/nginx/pcre-8.41 --with-zlib=/home/qaa/share/nginx/zlib-1.2.11 --with-openssl=/home/qaa/share/nginx/openssl-1.1.0g
出现如下,配置成功:
再make
出现如下,编译成功。
make install 出现如下编译成功: